#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#define kIOPluginStepperData "stepper-data"
#define kIOPluginEnvStepperDataLoadRequest "stepper-data-load-request"
#if 1
#define kPluginClientMagicCookie 0x50505543 // 'PPUC' - For clients requesting privileged (root) access
io_object_t GetInterfaceWithName(mach_port_t masterPort, char * className)
{
kern_return_t kr;
io_iterator_t iterator;
io_object_t object;
object = 0;
kr = IORegistryCreateIterator( masterPort,
kIOServicePlane,
true,
&iterator );
if( kr != kIOReturnSuccess )
printf( "IORegistryCreateIterator() error %08lx\n", (unsigned long) kr );
else {
while( ( object = IOIteratorNext(iterator) ) )
{
if( IOObjectConformsTo( object, (char *) className) )
break;
IOObjectRelease( object );
object = 0;
}
if( iterator ) IORegistryDisposeEnumerator( iterator );
}
return( object );
}
static io_object_t GetPluginServicePort( char *serviceName )
{
static mach_port_t masterPort;
kern_return_t kr;
io_object_t peRef;
kr = IOMasterPort( bootstrap_port, &masterPort );
if (kr != KERN_SUCCESS)
{
printf( "IOMasterPort() failed: %08lx\n", (unsigned long)kr);
return 0;
}
peRef = GetInterfaceWithName( masterPort, serviceName );
return peRef;
}
kern_return_t OpenDevice(io_object_t obj, io_connect_t * con)
{
kern_return_t ret = IOServiceOpen(obj, mach_task_self(), kPluginClientMagicCookie, con);
if (ret != kIOReturnSuccess)
{
printf( "IOServiceOpen() error %08lx\n", (unsigned long)ret);
}
return ret;
}
kern_return_t CloseDevice(io_connect_t con)
{
kern_return_t ret = IOServiceClose(con);
if (ret != kIOReturnSuccess)
{
printf( "CloseDevice() error %08lx\n", (unsigned long)ret);
return 0;
}
return ret;
}
kern_return_t stepclientsend (void *pmsTable, UInt32 pmsTableLength, void *pmsAuxTable, UInt32 pmsAuxTableLength)
{
io_object_t pluginService;
io_connect_t pluginConnection;
kern_return_t kr;
pluginService = GetPluginServicePort ("IOPlatformPlugin");
if (!pluginService)
return kIOReturnNoDevice;
if (kIOReturnSuccess != (kr = OpenDevice(pluginService, &pluginConnection))) {
printf ("Open device error 0x%x\n", kr);
return kr;
}
kr = IOConnectMethodScalarIScalarO( pluginConnection, 2, 4, 0, pmsTable, pmsTableLength, pmsAuxTable, pmsAuxTableLength);
if (kr == kIOReturnSuccess)
printf ("SUCCESS!!\n");
else
printf ("Failed 0x%x\n", kr);
return kr;
}
kern_return_t stepclientcontrol (UInt32 newStepLevel)
{
io_object_t pluginService;
io_connect_t pluginConnection;
kern_return_t kr;
pluginService = GetPluginServicePort ("IOPlatformPlugin");
if (!pluginService)
return kIOReturnNoDevice;
if (kIOReturnSuccess != (kr = OpenDevice(pluginService, &pluginConnection))) {
printf ("Open device error 0x%x\n", kr);
return kr;
}
kr = IOConnectMethodScalarIScalarO( pluginConnection, 3, 1, 0, newStepLevel);
if (kr == kIOReturnSuccess)
printf ("SUCCESS!!\n");
else
printf ("Failed 0x%x\n", kr);
return kr;
}
#else
kern_return_t stepclientsend (void *pmsTable, UInt32 pmsTableLength)
{
CFMutableDictionaryRef commandDict;
CFDataRef stepData;
io_service_t platformPlugin;
kern_return_t status;
status = kIOReturnError;
platformPlugin = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformPlugin"));
if (platformPlugin) {
stepData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)pmsTable, pmsTableLength);
if (stepData) {
commandDict = CFDictionaryCreateMutable(NULL, 1, &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
if (commandDict) {
CFDictionaryAddValue( commandDict, CFSTR(kIOPluginEnvStepperDataLoadRequest), stepData);
status = IORegistryEntrySetCFProperties(platformPlugin, commandDict);
if (status != kIOReturnSuccess)
printf ("IORegistryEntrySetCFProperties returned 0x%x\n", status);
CFRelease(commandDict);
CFRelease(stepData);
}
}
}
return status;
}
#endif