Я довольно новичок в разработке драйверов и пытаюсь написать простой фильтр-драйвер, который включит или отключит устройство клавиатуры или мыши. Если я могу заставить его работать, я хочу использовать его, чтобы отключить тачпад на своем ноутбуке, когда мышь подключена. Я понимаю, что, вероятно, существует программное обеспечение, которое уже делает это, но я действительно заинтересован в драйверах устройств и хочу научись это делать сам.
Я использую примеры kbfiltr и moufiltr , которые поставляются с WDK, установленным в качестве драйверов верхнего фильтра. Пример kbfiltr создает pdo, который может быть перечислен и подключен программой пользовательского режима. Это позволяет мне отправлять IOCTL в PDO, которые обрабатываются KbFilter_EvtIoDeviceControlForRawPdo . Тем не менее, когда я пытаюсь сделать что-либо вообще, связанное с драйвером фильтра, например, вызвать KbFilter_EvtIoInternalDeviceControl , чтобы я мог сделать что-то вроде
VOID
KbFilter_EvtIoInternalDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
...
hDevice = WdfIoQueueGetDevice(Queue);
devExt = FilterGetData(hDevice);
switch (IoControlCode) {
...
case IOCTL_INTERNAL_KEYBOARD_DISCONNECT:
//
// Clear the connection parameters in the device extension.
//
devExt->UpperConnectData.ClassService = NULL;
break;
...
}
Я получаю BSOD. Это не приведенный выше код, в ванильном примере закомментировано значение null, просто вызов Kbfilter вызывает BSOD. Я попытался установить расширение устройства непосредственно в PDO, но это также вызывает BSOD, предположительно потому, что это PDE devExt, а не kbfiltr?
(связано: что является хорошим способом получения трассировки стека от BSOD? Я использую Virtual PC в качестве тестовой среды и непроверенную сборку XPSP3)
Я не могу отправить IOCTL_INTERNAL_KEYBOARD_DISCONNECT непосредственно в стек драйверов (я так понимаю, что устройства ввода принимают только одно соединение за раз?), Следовательно, необходима необработанная PDO. Мне действительно нужно всего лишь отправить два IOCTL (для включения и выключения), и я решил, что просто использовал бы отключение клавиатуры и подключение, так как они уже были определены.
Если я ошибаюсь по поводу любого из этих предположений, пожалуйста, дайте мне знать, я знаю, что я действительно нуб, но я не нашел много документации об этом виде связи через PDO.