Я работаю с устройством WinCE, для которого в MFC написан драйвер радиоменеджера. В коде графического интерфейса радио я вижу функцию Deviceiocontrol с вызовом определенного IOCTL. Однако я не могу отследить конкретный фрагмент кода, вызываемый этой функцией. Может кто-нибудь сказать мне, как работает Deviceiocontrol?
Отследить функцию, реализованную DeviceioControl
Ответы (2)
DeviceIoControl обращается к драйверу устройства, используя дескриптор файла. Вы должны использовать отладчик ядра, если хотите войти в сам драйвер устройства.
Дескриптор файла представляет собой объект ядра, который состоит из структуры DEVICE_OBJECT, содержащей таблицу функций. В этой таблице по индексу IRP_MJ_DEVICE_CONTROL драйвер устанавливает свою функцию дескриптора. Затем функция вызывается с параметрами управления вводом-выводом, которые упакованы в пакет IRP.
Rmgr*
— это дескриптор устройства, который вы передаете DeviceIoControl
. Этот дескриптор заполняется при вызове CreateFile
. Точный способ его заполнения зависит от драйвера/реализации. Он может заполняться каждый раз, когда вызывается XXX_Open вашего драйвера, и он может заполняться во время XXX_Init драйвера, и это может быть просто фиктивный дескриптор, который возвращает драйвер. Конкретный драйвер.
- person Shaihi; 25.04.2010
У вас есть исходный код драйвера, которому отправляется IOCTL?
Вы передаете дескриптор DeviceIoControl
— дескриптор открывается с помощью вызова CreateFile(L"XXX#:",...)
— XXX — это префикс драйвера, установленный в реестре. а # — это индекс, который драйвер дает во время загрузки (также может быть установлен в реестре).
Чтобы увидеть выполняемые функции, найдите IOCTL, который вы отправляете DeviceIoControl
, в исходном коде драйвера. Вы найдете его в реализации драйвера XXX_IoControl
.