MAC 下PCIE驱动模板
写一个MAC下的驱动。 遇坑无数,特此记录。
本例只是加载,无实际功能。 实现效果:
MAC头文件
class com_osxkernel_MedCaptureDriver : public IOService { OSDeclareDefaultStructors(com_osxkernel_MedCaptureDriver) public: virtual bool init (OSDictionary* dictionary = NULL) override; virtual void free (void) override; virtual IOService* probe (IOService* provider, SInt32* score) override; virtual bool start (IOService* provider) override; virtual void stop (IOService* provider) override; };
实现文件:
#include "MedCaptureDriver.hpp" #include <IOKit/IOLib.h> // Define the superclass #define super IOService OSDefineMetaClassAndStructors(com_osxkernel_MedCaptureDriver, IOService) bool com_osxkernel_MedCaptureDriver::init (OSDictionary* dict) { bool res = super::init(dict); IOLog("com_osxkernel_MedCaptureDriver::init\n"); return res; } void com_osxkernel_MedCaptureDriver::free (void) { IOLog("com_osxkernel_MedCaptureDriver::free\n"); super::free(); } IOService* com_osxkernel_MedCaptureDriver::probe (IOService* provider, SInt32* score) { IOService *res = super::probe(provider, score); IOLog("com_osxkernel_MedCaptureDriver::probe\n"); return res; } bool com_osxkernel_MedCaptureDriver::start (IOService *provider) { IOLog("com_osxkernel_MedCaptureDriver::start\n"); bool res = super::start(provider); setProperty("IOUserClientClass", "com_osxkernel_MedCaptureClient"); registerService(); return res; } void com_osxkernel_MedCaptureDriver::stop (IOService *provider) { IOLog("com_osxkernel_MedCaptureDriver::stop\n"); super::stop(provider); }
用户头:
class com_osxkernel_MedCaptureClient : public IOUserClient { OSDeclareDefaultStructors(com_osxkernel_MedCaptureClient) private: task_t m_task; com_osxkernel_MedCaptureDriver* m_driver; public: virtual bool initWithTask (task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties) override; virtual bool start (IOService* provider) override; virtual void stop (IOService* provider) override; virtual void free (void) override; // 鎵╁睍鍛戒护... //virtual IOReturn externalMethod (uint32_t selector, IOExternalMethodArguments* arguments, IOExternalMethodDispatch* dispatch = 0, OSObject* target = 0, void* reference = 0); };
用户实现:
OSDefineMetaClassAndStructors(com_osxkernel_MedCaptureClient, IOUserClient) bool com_osxkernel_MedCaptureClient::initWithTask (task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties) { IOLog("com_osxkernel_MedCaptureClient::initWithTask\n"); if(!owningTask) return false; if (!super::initWithTask(owningTask, securityToken, type, properties)) { return false; } m_task = owningTask; //鏄惁鏈夌鐞嗘潈闄?. IOReturn ret = clientHasPrivilege(securityToken, kIOClientPrivilegeAdministrator); if ( ret == kIOReturnSuccess ) { // m_taskIsAdmin = true; } return true; } bool com_osxkernel_MedCaptureClient::start (IOService* provider) { IOLog("com_osxkernel_MedCaptureClient::start\n"); if (! super::start(provider)) return false; m_driver = OSDynamicCast(com_osxkernel_MedCaptureDriver, provider); if (!m_driver) return false; return true; } void com_osxkernel_MedCaptureClient::stop (IOService* provider) { IOLog("com_osxkernel_MedCaptureClient::stop\n"); super::stop(provider); } void com_osxkernel_MedCaptureClient::free (void) { IOLog("com_osxkernel_MedCaptureClient::free\n"); super::free(); }
作者微信号: xh66i88