#include "ioregpath.h"
#include <IOKit/IOKitLib.h>
CFDictionaryRef
myIORegistryEntryCopyValue(const char * path)
{
mach_port_t master;
io_registry_entry_t service;
kern_return_t status;
CFMutableDictionaryRef properties = NULL;
status = IOMasterPort(bootstrap_port, &master);
if (status != KERN_SUCCESS) {
return (NULL);
}
service = IORegistryEntryFromPath(master, path);
if (service == MACH_PORT_NULL) {
return (NULL);
}
status = IORegistryEntryCreateCFProperties(service,
&properties,
kCFAllocatorDefault,
kNilOptions);
if (status != KERN_SUCCESS) {
properties = NULL;
}
IOObjectRelease(service);
return (properties);
}
CFDictionaryRef
myIORegistryEntryBSDNameMatchingCopyValue(const char * devname, Boolean parent)
{
mach_port_t master;
kern_return_t status;
CFMutableDictionaryRef properties = NULL;
io_registry_entry_t service;
status = IOMasterPort(bootstrap_port, &master);
if (status != KERN_SUCCESS) {
return (NULL);
}
service
= IOServiceGetMatchingService(master,
IOBSDNameMatching(master, 0, devname));
if (service == MACH_PORT_NULL) {
return (NULL);
}
if (parent) {
io_registry_entry_t parent_service;
status = IORegistryEntryGetParentEntry(service, kIOServicePlane,
&parent_service);
if (status == KERN_SUCCESS) {
status = IORegistryEntryCreateCFProperties(parent_service,
&properties,
kCFAllocatorDefault,
kNilOptions);
IOObjectRelease(parent_service);
}
}
else {
status = IORegistryEntryCreateCFProperties(service,
&properties,
kCFAllocatorDefault,
kNilOptions);
}
if (status != KERN_SUCCESS) {
properties = NULL;
}
IOObjectRelease(service);
return (properties);
}