В настоящее время я экспериментирую с 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 процесса вызывающей стороны с помощью такого указателя, илидаже по-другому?