2010-04-21 5 views
0

Я работаю с устройством WinCE, которое имеет драйвер радиоуправления, написанный для него в MFC. В коде для GUI Radio я вижу функцию Deviceiocontrol с вызовом определенного IOCTL. Тем не менее, я не могу отслеживать конкретный фрагмент кода, вызываемый этой функцией. Может ли кто-нибудь сказать мне, как работает Deviceiocontrol?Отслеживать функцию, реализованную DeviceioControl

ответ

3

DeviceIoControl обращается к драйверу устройства с помощью дескриптора файла. Вы должны использовать отладчик ядра, если хотите войти в сам драйвер устройства.

Ручка файла представляет собой объект ядра, который состоит из структуры DEVICE_OBJECT, которая содержит таблицу функций. В этой таблице по индексу IRP_MJ_DEVICE_CONTROL драйвер устанавливает свою функцию дескриптора. Затем функция вызывается с параметрами управления io, которые упаковываются в IRP.

+0

Thankyou! Боюсь, я не знаю, как использовать отладчик ядра. Я вижу код для Radio Manager, и я считаю, что функция RadioManager_IOControl (контекст Rmgr *, IOCTL _..., BYTE * pInBuffer, DWORD inSize, BYTE * pOutBuffer, DWORD outSize, DWORD * pOutSize) (в драйвере радиосвязи) что называется deviceiocontrol. Моя проблема в том, что deviceiocontrol имеет дескриптор Rmgr в своем списке аргументов, в то время как RadioManager_IOControl драйвера устройства имеет указатель на структуру Rmgr в своем списке аргументов. Я не могу отслеживать, как эта структура заполняется. – ame

+0

'Rmgr *' - это дескриптор устройства, который вы передаете 'DeviceIoControl'. Этот дескриптор заполняется, когда вы вызываете 'CreateFile'. Точный способ ее популяции - это драйвер/реализация. Он может быть заполнен каждый раз, когда вызывается XXX_Open вашего драйвера, и он может быть заполнен во время XXX_Init драйвера, и это может быть просто фиктивный дескриптор, который возвращает драйвер. Специфический драйвер. – Shaihi

0

У вас есть исходный код для драйвера, на который отправлен IOCTL?
Вы передаете дескриптор DeviceIoControl - ручка открывается по вызову CreateFile(L"XXX#:",...) - XXX является префиксом драйвера, установленным в реестре. и # - индекс, который драйвер дает во время загрузки (также может быть установлен в реестре).
Чтобы просмотреть функциональность, выполняемую, выполните поиск IOCTL, отправленного в DeviceIoControl в исходный код драйвера. Вы найдете его в реализации драйвера XXX_IoControl.

Смежные вопросы