Я новичок в разработке драйверов и пытаюсь написать простой драйвер фильтра, который включит или отключит клавиатуру или мышь. Если я смогу заставить его работать, я хочу использовать его, чтобы отключить тачпад на моем ноутбуке, когда мышь подключена. Я понимаю, что есть, вероятно, программное обеспечение, которое делает это уже, но я действительно заинтересован в драйверах устройств и хочу узнайте, как это сделать сам.
Я использую примеры kbfiltr и moufiltr, которые поставляются с WDK, установленными как верхние драйверы фильтров. Пример kbfiltr создает pdo, который можно перечислить и связать с помощью программы usermode. Это позволяет мне отправлять IOCTLs в 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. Это не приведенный выше код, в примере с ванилью закомментирован набор с нулевым значением, просто вызов в Kbfilter вызывает BSOD. Я попытался установить расширение устройства непосредственно в PDO, но это также вызывает BSOD, предположительно потому, что это PDO devExt, а не kbfiltr?
(связанный: что такое хороший способ получить трассировку стека из BSOD? Я использую Virtual PC в качестве тестовой среды и неконтролируемой сборки XPSP3)
Я не могу отправить IOCTL_INTERNAL_KEYBOARD_DISCONNECT непосредственно в стек драйвера (я понимаю, что устройства ввода принимают только одно соединение за раз?), следовательно, потребность в необработанном PDO. Мне действительно нужно только отправить два IOCTL (чтобы включить или отключить), и я решил, что просто буду использовать клавиатуру для разъединения и подключения, поскольку они уже определены.
Если я ошибаюсь в отношении какого-либо из этих предположений, сообщите мне, я знаю, что на самом деле я это noob, но я не нашел много документации об этом виде общения через PDO.