Я довольно новичок в разработке драйверов и пытаюсь написать простой драйвер фильтра, который включит или отключит клавиатуру или мышь. Если я смогу заставить его работать, я хочу использовать его, чтобы отключить тачпад на моем ноутбуке, когда мышь подключена. Я понимаю, что есть, вероятно, программное обеспечение, которое делает это уже, но я действительно заинтересован в драйверах устройств и хочу научитесь самому это делать.Raw PDO для отправки IOCTL в верхний драйвер фильтра (kbfiltr/moufiltr) для включения/выключения устройства
Я использую 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.
Мой первый и, возможно, последний, +1 комментарий! Сэкономил мне часы ... спасибо кучу за то, что нашли время, чтобы отформатировать ваш ответ ... отлично! –
Мне интересно, можете ли вы поделиться кодом драйвера для клавиатуры. Я пытаюсь включить/отключить USB-клавиатуру (от многих, которых я подключил к компьютеру для особых целей), но мне было трудно понять, как это сделать. Попытка с развитием драйвера фильтра, но она движется медленно. Возможно, вы можете поделиться своими источниками, чтобы узнать, как вам удалось это сделать. – 2010-09-01 02:07:47
Несомненно, Энди, это не проблема, я получил эту работу и использовал службу Windows с WMI, чтобы включить или отключить сенсорную панель, если внешняя мышь была подключена. Как бы вы хотели, чтобы я пришёл к вам? –