我目前正在尝试使用Apple的I / O Kit来开发内核模块。
更详细的说,我想编写一个模拟设备驱动程序(类型为IOUSBDevice
),它记录发出设备请求的进程的名称,尝试从该设备读取。
我偶然发现了一些示例代码,我找到了DeviceRequest
函数的签名,可能是由想要访问设备的进程调用的:
IOReturn DeviceRequest(IOUSBDevRequestDesc *request,
IOUSBCompletion *completion)
{ ... }
似乎request
参数带有一些有用的数据,例如:
rdDirection: Direction of data part of request: kUSBIn or kUSBOut
rqType: Request type: kUSBStandard, kUSBClass or kUSBVendor
rqRecipient: Target of the request: kUSBDevice, kUSBInterface,
kUSBEndpoint or kUSBOther
bRequest: Request code
wValue: 16 bit parameter for request, low byte first
wIndex: 16 bit parameter for request, low byte first
wLength: Length of data part of request, 16 bits, low byte first
pData: Pointer to memory descriptor for data for request
wLenDone: Set by standard completion routine to number of data bytes
actually transferred
但是,没有直接的方法可以确定哪个进程发送了请求。我们唯一的元素是pData
指针,它指向将存储数据的进程的内存位置。
有没有办法通过使用这样的指针,甚至以另一种方式获得调用者进程PID?
proc_selfpid()
应该给你正确的答案,除非请求来自内核驱动程序,在这种情况下,问题没有特别明确。
您可能最好跟踪生成请求的IOUserClient
关联的任务。您可能需要为此重写newUserClient
方法。