#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
метод.