获取在I / O Kit中发出设备请求的过程的PID

问题描述 投票:0回答:1

我目前正在尝试使用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?

macos kernel iokit
1个回答
0
投票

proc_selfpid()应该给你正确的答案,除非请求来自内核驱动程序,在这种情况下,问题没有特别明确。

您可能最好跟踪生成请求的IOUserClient关联的任务。您可能需要为此重写newUserClient方法。

© www.soinside.com 2019 - 2024. All rights reserved.