Получить PID процесса, который отправил запрос устройства в наборе ввода-вывода

#macos #kernel #iokit

#macos #ядро #iokit

Вопрос:

В настоящее время я экспериментирую с набором ввода-вывода Apple для разработки модуля ядра.

Более подробно, я хотел бы написать макет драйвера устройства (типа 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:

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

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