Jump to content
Sign in to follow this  
Followers 0

Yet another Orange/Silver Internal/External icons solution - seems to work

1 post in this topic

Recommended Posts

I've played a bit with Internal and External disk protocol injection (orange or silver disk icons). IOAHCIBlockStorageInjector (and similar kexts) inject those data, but it injects the same for all disks. I wanted to see if this can be done separately for each controller and/or individual port. It seems it can.


I did not test it too much, so I would not say "it works", but rather "seems to work".


Injector used is DeviceMergeNubAPM.kext, some details and src here:



which is slightly modified version of DeviceMergeNub.kext by Andy Vandijck, more here:



How it works:


DeviceMergeNub can hook into device/driver nub specified in it's Info.plist IOKitPersonalities/some personality/IOProviderClass and during probe can inject data specified under the IOKitPersonalities/some personality/IOProviderMergeProperties/* into that device/driver nub.

By adding Protocol Characteristics dict with Physical Interconnect Location=Internal or =External inside IOProviderMergeProperties and by specifying IOProviderClass=IOAHCIDevice or =IOBlockStorageDevice inside Info.plist it will inject Internal or External which will be used by OSX. So far this works, but again just for all drives.


DeviceMergeNubAPM extends DeviceMergeNub with ability to limit injection only if some parent node of the device/driver nub in IORegistry IOService plane meets specified criteria. This can be done by specifying IOKitPersonalities/some personality/IOAnyParentMatch dictionary which accepts some standard matching keys (IONameMatch …). With this it is possible to inject Physical Interconnect Location=Internal for one controller and Physical Interconnect Location=External for another.


Supported keys inside IOAnyParentMatch:

* IONameMatch - can be string or array or dictionary with standard names (SAT0 or pci8086,1c02 …)

* IOPropertyMatch - dictionary with parent's properties to match (all listed must match)

* IOLocationMatch - string (1F,2)

* IOPathMatch - string path to node in IOService plane (IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SAT0@1F,2)




In order to try it, you'll need to:

- remove IOAHCIBlockStorageInjector (and similar kexts that do Internal/External injection)

- modify DeviceMergeNubAPM's Info.plist:

.....* change or add personalities (for example - one personality for each controller)

.....* specify controller with IOAnyParentMatch/IONameMatch=pci8086,1c02 (set to your name from IORegistry)

.....* specify Internal or External in IOProviderMergeProperties/Protocol Characteristics/Physical Interconnect Location

- install it in /Extra/Extensions or in /S/L/E, fix permissions etc. (for example with KextWizard from http://www.insanelymac.com/forum/index.php?showtopic=253395)

- restart


It's possible to specify Internal or External for each port. This needs unique port names in IORegistry (if not, must be changed in DSDT). Check attached example plist.






Some Info.plist examples:


Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.