3环:
//
// main.c
// DriverIterator
//
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
int main (int argc, const char * argv[])
{
CFDictionaryRef matchingDict = NULL;
io_iterator_t iter = 0;
io_service_t service = 0;
kern_return_t kr;
matchingDict = IOServiceMatching("com_osxkernel_driver_IOKitTest");
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
return -1;
//迭代所有匹配的对象
while ((service = IOIteratorNext(iter)) != 0)
{
IORegistryEntrySetCFProperty(service, CFSTR("StopMessage"), CFSTR("The driver has stopped"));
IOObjectRelease(service);
}
IOObjectRelease(iter);
return 0;
}
0环: //IOKitTest.h
#include <IOKit/IOService.h>
class com_osxkernel_driver_IOKitTest : public IOService
{
OSDeclareDefaultStructors(com_osxkernel_driver_IOKitTest)
public:
virtual bool init (OSDictionary* dictionary = NULL);
virtual void free (void);
virtual IOService* probe (IOService* provider, SInt32* score);
virtual bool start (IOService* provider);
virtual void stop (IOService* provider);
virtual IOReturn setProperties (OSObject* properties);
};
//IOKitTest.cpp
#include "IOKitTest.h"
#include <IOKit/IOLib.h>
#define super IOService
OSDefineMetaClassAndStructors(com_osxkernel_driver_IOKitTest, IOService)
bool com_osxkernel_driver_IOKitTest::init (OSDictionary* dict)
{
bool res = super::init(dict);
IOLog("IOKitTest::init\n");
return res;
}
void com_osxkernel_driver_IOKitTest::free (void)
{
IOLog("IOKitTest::free\n");
super::free();
}
IOService* com_osxkernel_driver_IOKitTest::probe (IOService* provider, SInt32* score)
{
IOService *res = super::probe(provider, score);
IOLog("IOKitTest::probe\n");
return res;
}
bool com_osxkernel_driver_IOKitTest::start (IOService *provider)
{
bool res = super::start(provider);
IOLog("IOKitTest::start\n");
return res;
}
void com_osxkernel_driver_IOKitTest::stop (IOService *provider)
{
OSString* stopMessage;
//从驱动程序属性表读取可能自定义字符串并输出
stopMessage = OSDynamicCast(OSString, getProperty("StopMessage"));
IOLog("IOKitTest::stop\n");
if (stopMessage)
IOLog("%s\n", stopMessage->getCStringNoCopy());
super::stop(provider);
}
IOReturn com_osxkernel_driver_IOKitTest::setProperties (OSObject* properties)
{
OSDictionary* propertyDict;
//提供的属性对象应该是一个OSDictionary对象
propertyDict = OSDynamicCast(OSDictionary, properties);
if (propertyDict != NULL)
{
OSObject* theValue;
OSString* theString;
//从字典读取对应的StopMessage键值
theValue = propertyDict->getObject("StopMessage");
theString = OSDynamicCast(OSString, theValue);
if (theString != NULL)
{
//将该值添加到驱动程序的属性列表
setProperty("StopMessage", theString);
return kIOReturnSuccess;
}
}
return kIOReturnUnsupported;
}