Получить PID процесса, который выдал запрос устройства в наборе ввода / вывода - PullRequest
0 голосов
/ 05 апреля 2019

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

1 Ответ

0 голосов
/ 08 апреля 2019

proc_selfpid() должен дать вам правильный ответ, если только запрос не поступает от драйвера ядра, в этом случае вопрос не особенно четко определен.

Возможно, вам лучше отследить задачу, с которой связан IOUserClient, генерирующий запросы. Для этого вам может потребоваться переопределить метод newUserClient.

...