#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#import <mach/mach_error.h>
#import <IOKit/IOKitLib.h>
#import <IOKit/IOBSD.h>
#import <IOKit/storage/IOMedia.h>
#import <IOKit/storage/IOPartitionScheme.h>
int getOFDev(io_object_t obj, unsigned long * pNum,
unsigned char parentDev[],
unsigned char OFDev[]) {
io_iterator_t parents;
io_registry_entry_t service;
io_object_t loopedObj;
io_string_t name;
unsigned long savedPartnNum = 0;
unsigned int length;
kern_return_t status = 0;
unsigned char savedOFDev[1024];
parentDev[0] = '\0';
OFDev[0] = '\0';
savedOFDev[0] = '\0';
*pNum = 0;
length = sizeof(savedPartnNum);
savedPartnNum = 0;
status = IORegistryEntryGetProperty(obj, kIOMediaPartitionID, (void*) &savedPartnNum, &length);
if (status) {
savedPartnNum = 0;
}
status = IORegistryEntryGetPath(obj, kIODeviceTreePlane, name);
if (status == KERN_SUCCESS && name && strlen(name) > 13) {
memmove(name, &(name[13]), strlen(name) - 12);
strcpy(savedOFDev, name);
}
loopedObj = obj;
while (1) {
status = IORegistryEntryGetParentIterator (loopedObj, kIOServicePlane,
&parents);
if (status) {
return 6;
}
loopedObj = NULL; while ( (service = IOIteratorNext(parents)) != NULL ) {
loopedObj = service;
if (IOObjectConformsTo(service, "IOMedia")) {
length = sizeof(name);
name[0] = 0;
status = IORegistryEntryGetProperty(service, kIOMediaContent, name, &length);
if (!strncmp(name, "Apple_partition_scheme", strlen("Apple_partition_scheme"))) {
*pNum = savedPartnNum;
strcpy(OFDev, savedOFDev);
length = sizeof(name);
name[0] = 0;
status = IORegistryEntryGetProperty(service, kIOBSDName, name, &length);
if (status) {
return 7;
} else {
sprintf(parentDev, "/dev/%s",name);
return 0;
}
}
length = sizeof(savedPartnNum);
savedPartnNum = 0;
status = IORegistryEntryGetProperty(service, kIOMediaPartitionID,
(void*) &savedPartnNum, &length);
if (status) {
savedPartnNum = 0;
}
status = IORegistryEntryGetPath(service, kIODeviceTreePlane, name);
if (status == KERN_SUCCESS && name && strlen(name) > 12) {
memmove(name, &(name[13]), strlen(name) - 12);
strcpy(savedOFDev, name);
} else {
savedOFDev[0] = '\0';
}
}
}
}
*pNum = 0;
parentDev[0] = '\0';
OFDev[0] = '\0';
return 9;
}