EFI (Extensible Firmware Interface)
is in a sense the sucessor of the BIOS, and is used by Apple.
If you wish to know more: http://en.wikipedia.org/wiki/Extensible_Firmware_Interface
On Macs, EFI provides certain vital hardware information which is needed for the setup and booting of OS X. As we don't have EFI on our PCs, but only the oldschool BIOS, this information has to be provided by other means. Formerly, this was achieved by patching the kernel & certain kexts. These days we have bootloaders which can make the most important data avaiable toallow us to boot the vanilla kernel & kexts. One of the bootloaders, in my opinion the best, is Chameleon. It alsoe has a whole load of other features, see the full list on their homepage.
Ok, so now we can use vanilla kernel & kexts, but what about graphics cards, sound cards and netwrking?
This is where the so-called injectors coem into play. Injectors initially took the form of kexts (and sill do, in cases like nvkush & natit) they inject specific information into the IORegistry, so that OS X knows what graphic card we have & what driver to load. The accuracy of this information is very important, as the slightest error can cause the wrong kext to load, or none at all. An alternative way to inject these values are "device-properties" Strings. Modified Bootloaders like Chameleon support these, and I will explain how to make them below in this thread. The newest method for injecting these values is through DSDT. I'll explain more about that in a differen topic.
For soundcards it is often sufficient to inject the "layout-id" so that the AppleHDA.kext loads, although this isn't generally (except with an ALC889 codec) enough to get sound. You also need to patch AppleHDA.kext , there are many good tutorials for this on the web (Google is your friend). As there is a universal driver being worked on it hardly sems worthwhile to pursue this futher, and what's more I'm not going to do so here.
For networking, we just inject one cvalue: "built-in". This is useful for eliminating UUID error 35 and thus getting time machine to work, amongst other things.
How to generate a "device-properties"-string for your Graphics Card
We will need the following:
- A suitable bootloader installed (Chameleon)
- gfxutil
- Property List Editor
You can find the tools Here
A Functioning Injector (Natit/Nvinject/NvinjectGo/Atiinject/NVkush....)
An example-String:
- NVIDIA GeForce 7xxx http://www.mediafire.com/?cytghb0gvnj
- NVIDIA GeForce 7400GO http://www.mediafire.com/?7txyld0dcxl
- NVIDIA GeForce 7300GT http://www.mediafire.com/?bnz5ntvxw99
- NVIDIA GeForce 7300GT EBERTS http://www.mediafire.com/?1s1wdyd3dqx
- NVIDIA GeForce 8600 http://www.mediafire.com/?1dnv0vjbmyz
- NVIDIA GeForce 8800 http://www.mediafire.com/?9mo4340bbdp
- NVIDIA GeForce 7950GT 256MB http://www.mediafire.com/?3z3iyxmxuln
- NVIDIA GeForce 7950GT 512MB http://www.mediafire.com/?1sd9nce4txo
- ATI X1900 http://www.mediafire.com/?8dn9lzwxxg5
- ATI 2400,2600,2900 http://www.mediafire.com/?frzxxyyh1s1
- Intel GMA 950 http://www.mediafire.com/?0dsmxvy1mbi
Now lets get cooking:
<you>Extracting your Device-Path</you>
- Open Terminal(/Applications/Utilities/Terminal.app)
- cd "Folder containing GFXUTIL"
- ./gfxutil -f display
Now the tool spits out the device-path of your graphics card, which will look something like this:
CODE
DevicePath = PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)
Leave this window open or copy this string to PciRoot.
<you>Editing the Plist</you>
If the example-string you downloaded doesn't have a .plist, we will have to generate one. Otherwise just edit the plist that's there.
- ./gfxutil -i hex -o xml "paste the hex data into termional here" string.plist

Highlighetd here is the Device-Path, replace it with yours (See Point 2)
<you>Get the information from your injector:</you>
- Open Console (/Applications/Utilities/Console.app)
- Select system.log on the left
- type in the name of your injector Injector (e.g NVinject) in the search fireld at the top right
Should look a lot like this:
CODENVinject: Probing.
NVinject: Setting NVPM=<data not shown>
NVinject: Setting @0,device_type=display
NVinject: Setting NVCAP=<data not shown>
NVinject: Setting @0,compatible=NVDA,NVMac
NVinject: Setting model=Graphics by NVIDIA
NVinject: Setting @1,name=NVDA,Display-B
NVinject: Setting device_type=NVDA,Parent
NVinject: Setting name=display
NVinject: Setting rom-revision=NVinject 0.2.1
NVinject: Setting @0,name=NVDA,Display-A
NVinject: Setting @1,compatible=NVDA,NVMac
NVinject: Setting @1,device_type=display - now add these values to your plist
- only change the values you get from console
We get the NVCAP and NVPM values (and other values displayed as: <data not shown>) with:
- ioreg -lw 0 -p IODeviceTree | grep NVCAP
- ioreg -lw 0 -p IODeviceTree | grep NVPM
<you>Now we convert this plist back to a hex string</you>
- ./gfxutil -i xml -o hex YOUR_STRING.plist YOUR_STRING.hex
Our string is now in YOUR_STRING.hex (you can open it with text edit)
<you>Now we need to get the string into the Boot.plist</you>
- Backup the Boot.plist: cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /Library/Preferences/SystemConfiguration/com.apple.Boot.plist.old
- Open the Boot.plist with Property List Editor
- click on Root -> New Child "device-properties" ; Class = String ; Value = your generated hex-string

- save the plist in a folder that you can access, e.g. Desktop
- Now copy the modified Boot.plist into the correct folder: sudo cp ~/Desktop/com.apple.Boot.plist /Library/Preferences/SystemConfiguration/
Now, we're done ;)
One more thing: The injector has to be deactivated, we do that with:
- sudo mv /System/Library/Extensions/"your Injector".kext /System/Library/Extensions/"your Injector".kext.old
- sudo touch /System/Library/Extensions/
Reboot and Good Luck ;)
You can check whether the string injected with:
- ioreg -lw 0 -p IODeviceTree | grep device-prop
creating a "device-properties"-string for Network Cards
We need the following:
- A suitable bootloader installed (Chameleon)
- gfxutil
- Property List Editor
The Tools are HERE
<you>Extracting the Device-Path</you>
- Open Terminal (/Applications/Utilities/Terminal.app)
- cd "Folder containing GFXUTIL"
- ./gfxutil -f ethernet
Now the Tool spits out the device-path of your network card, which will look something like this:
CODE
DevicePath = PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)
Leave this window open or copy this string to PciRoot.
<you>Editing the Plist</you>
If you've already made a String for your Graphics card, Open it & simply add another device path entry, adding the key built-in with the value <01> as shown below.
save the modified plist.
<you>Now wew convert this plist into a hex string</you>
- ./gfxutil -i xml -o hex YOUR_STRING.plist YOUR_STRING.hex
Our String is now in YOUR_STRING.hex (can be opened with text edit)
<you>Now we need to add the string to the Boot.plist again:</you>
- Backup the Boot.plist: cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /Library/Preferences/SystemConfiguration/com.apple.Boot.plist.old
- Open the Boot.plist with Property List Editor
- click on Root -> New Child "device-properties" ; Class = String ; Value = Your generated hex-string

- save the plist in a folder you can access, such as Desktop
- Now copy the modified Boot.plist into the correct folder: sudo cp ~/Desktop/com.apple.Boot.plist /Library/Preferences/SystemConfiguration/
And we're done ;)
Reboot, Good Luck
