Отследить функцию, реализованную DeviceioControl

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


person ame    schedule 21.04.2010    source источник


Ответы (2)


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

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

person Christopher    schedule 21.04.2010
comment
Спасибо! Боюсь, я не умею пользоваться отладчиком ядра. Я вижу код Radio Manager и считаю, что функция RadioManager_IOControl(Rmgr * context,IOCTL_...,BYTE *pInBuffer, DWORD inSize,BYTE *pOutBuffer, DWORD outSize, DWORD *pOutSize) (в драйвере радио) то, что называется deviceiocontrol. Моя проблема в том, что deviceiocontrol имеет дескриптор Rmgr в своем списке аргументов, в то время как RadioManager_IOControl драйвера устройства имеет указатель на структуру Rmgr в своем списке аргументов. Я не могу проследить, как заполняется эта структура. - person ame; 21.04.2010
comment
Rmgr* — это дескриптор устройства, который вы передаете DeviceIoControl. Этот дескриптор заполняется при вызове CreateFile. Точный способ его заполнения зависит от драйвера/реализации. Он может заполняться каждый раз, когда вызывается XXX_Open вашего драйвера, и он может заполняться во время XXX_Init драйвера, и это может быть просто фиктивный дескриптор, который возвращает драйвер. Конкретный драйвер. - person Shaihi; 25.04.2010

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

person Shaihi    schedule 28.04.2010