How to Use IORegistryExplorer for Hackintosh Diagnostics
Learn to use IORegistryExplorer (ioreg) to diagnose audio, graphics, USB, and ACPI issues on your Hackintosh. Step-by-step guide with practical examples.
What Is IORegistryExplorer?
IORegistryExplorer (often called simply ioreg after the command-line tool) is a developer utility included with every copy of macOS. It exposes the kernel’s I/O Kit registry – a live, hierarchical database of all hardware, drivers, and device properties currently loaded in the system. For a Hackintosh builder, this is the single most informative tool available when a component refuses to work or behaves unexpectedly. Unlike System Information, which shows only what Apple intends, ioreg reveals the raw driver state, including injected properties, failed probe attempts, and orphaned device nodes.
This article assumes you are already familiar with the macOS boot process and have a working Hackintosh (or one that boots to a desktop with partial functionality). We will cover how to capture a useful dump, interpret the most common sections, and apply the findings to diagnose audio, graphics, USB, and ACPI issues.
Why ioreg Matters for Hackintosh Diagnostics
On a real Mac, the IORegistry is populated by Apple’s firmware and drivers. On a Hackintosh, every hardware node must be correctly matched by a kext or an ACPI table injection. When a device is missing from the registry, the driver never loaded, or the device was never enumerated by the kernel. When a device appears but with incorrect properties, the driver may fail to attach or produce erratic behaviour. IORegistryExplorer lets you confirm, at a glance, whether your WhateverGreen framebuffer patches actually reached the graphics controller, whether your audio codec is attached to the right AppleHDA path, or whether your USB ports are mapped to the correct controller.
Basic Usage: Capturing a Full Registry Dump
Launch IORegistryExplorer from /Applications/Utilities/ (or from the Xcode Developer Tools path). The window shows a tree view on the left and a properties pane on the right. The default view is the entire registry, which can be overwhelming – the number of nodes is often several thousand. For a first diagnostic pass, save a full dump:
- Select File > Save As (or press ⌘S).
- Choose IORegistryExplorer 2.1 format (the XML-based
.ioregfile). This preserves all properties and can be reopened later. - Alternatively, use the command line:
ioreg -lw0 > full_dump.txt. The-lflag lists all properties,-w0forces no line wrap.
Save the dump before making any changes – it gives you a baseline. If a later modification breaks a feature, compare the two dumps to see what property changed.
Key Sections to Examine
The IORegistry tree is organised by plane. The default “IODeviceTree” plane shows the same hierarchy as the device tree that macOS sees after boot. The most important planes for a Hackintosh are:
- IODeviceTree – contains ACPI devices, PCI bridges, and system memory mapped regions.
- IOService – shows all running drivers and their matched nubs.
- IOPower – useful for sleep/wake diagnostics.
For most hardware problems, stay in the IOService plane. Search for the class name of your device, e.g. IOGraphicsDevice, IOHDACodecDevice, IOUSBHostDevice. The properties pane will show the IOClass and IOMatchCategory – if these are missing, the driver never claimed the device.
Common Use Cases
Audio Diagnostics
When AppleHDA fails to load, look for a node named HDEF (or HDAU for HDMI audio) under AppleHDAController. Use the search field (bottom-left) with the term HDEF and check the layout-id property. If it is missing or set to a value that does not match your codec, inject the correct layout via a DeviceProperties entry in your bootloader config. If the node itself is absent, your ACPI tables may not be providing the HDEF device (a common issue on desktop boards).
Graphics Diagnostics
For Intel integrated graphics, open the IGPU node under IOGraphicsDevice. The framebuffer-patch-enable and framebuffer-stolenmem injected via WhateverGreen should appear in the properties. If they are not present, inject them again. For NVIDIA Kepler cards, the @0,display-connect properties determine which connector is active – a mismatch causes black screen or no acceleration. We covered the exact property sets in our guide to Fixing Intel HD Graphics on Haswell and Broadwell Hackintoshes, where ioreg is the primary validation tool.
USB Diagnostics
USB problems often manifest as ports that work at 2.0 but not 3.0, or that fail to wake the system. Search for XHC1 or XHCI. Under the controller node, look for the ports dictionary. Each port should have a connector-type property (0 for internal, 2 for type-A, 3 for type-C). If a port is missing, your USB map kext (or SSDT) is incomplete. IORegistryExplorer can also show the kUSBCurrentConfiguration – a value of 0x01000000 indicates 2.0 only, while 0x02000000 indicates 3.0.
ACPI and Power Management
Check the IOService:/AppleACPIPlatformExpert node. The ACPI Tables section lists all loaded tables. Missing tables (e.g., SSDT-EC, SSDT-PLUG) can be identified by their absence. Also look at CPU0 under AppleACPICPU – the plugin-type property should be 1 for XCPM to enable native power management. If it is 0, inject an SSDT-PLUG.
Interpreting Device Properties
Properties are key-value pairs. Common types: <data> (hexadecimal), <string>, <integer>, <dictionary>. A property with a value of <00000000> is often a placeholder – the real data may be filled later or may indicate a failed injection. Pay attention to the IOProbeScore property: higher values mean the driver got a better match. If two drivers compete for the same device, the one with the lower score may be ignored.
When you see a node with IOClass = AppleGraphicsDevicePolicy but no IOMatchCategory, it means the policy kext loaded but did not bind to any device – this is typical when a GPU is not fully recognised. Conversely, a node with IOClass = AppleIntelFramebuffer and a IOMatchCategory of AppleGraphics indicates successful driver attachment.
Advanced: Filtering and Searching
The search field at the bottom of the IORegistryExplorer window supports forward and backward search. For more precise filtering, use the View > Filter by Class menu. This reduces the tree to nodes matching a specific IOClass. For example, filter by IOHIDDevice to see all input devices. You can also use the command-line tool ioreg with -c (class filter): ioreg -c IOHDACodecDevice. This prints only nodes of that class, useful for scripting.
To inspect a property in detail, select the node and press ⌘I – the inspector shows the property as raw XML. This is especially useful when a property is a dictionary or array, as the property pane only shows a flattened view.
Saving and Comparing Dumps
Always save a clean dump immediately after a successful boot (before making any changes). When you modify a kext or ACPI table, save a second dump and compare them using a diff tool like diff or FileMerge. The XML structure is verbose, but you can focus on the specific node you changed. The command ioreg -c IODeviceTree -r -n IGPU will dump only the IGPU node and its children, making comparison much faster.
Limitations and Risks
IORegistryExplorer is a read-only tool – it cannot cause damage by itself. However, misinterpreting what you see can lead to pointless tweaking. A missing node does not always mean a missing driver; it could mean the device is not yet enumerated (e.g., during boot before kexts load). Always take readings after the system has fully settled (about 30 seconds after the desktop appears).
Another limitation: the registry does not show the state of the firmware (UEFI/BIOS). If a device is disabled in the firmware, it will not appear in ioreg at all. Always check your BIOS settings first.
Finally, when you are about to inject a property based on an ioreg observation, make a backup of your current bootloader configuration and have a recovery USB ready. One wrong property value can cause a kernel panic on next boot.
To start using ioreg effectively today, pick one device that is not working (e.g., onboard audio). Capture its node in the IOService plane, note the IOClass and IOMatchCategory, then compare with a known-working dump from a similar system. This single comparison will tell you whether the driver is even trying to attach – and that is the first step toward a fix.
