我对驱动程序开发很陌生,并试图编写一个简单的过滤器驱动程序来启用或禁用键盘或鼠标设备。如果我能让它工作,我想在插入鼠标时使用它来禁用笔记本电脑上的触摸板。我意识到可能已经有软件可以做到这一点,但我对设备驱动程序真的很感兴趣并想要自己学习如何做到这一点。
我正在使用 WDK 附带的kbfiltr和moufiltr示例,它们作为上层过滤器驱动程序安装。kbfiltr 示例创建了一个可以由用户模式程序枚举和连接的 pdo。这允许我将 IOCTL 发送到由KbFilter_EvtIoDeviceControlForRawPdo处理的 PDO 。但是,当我尝试做任何与过滤器驱动程序相关的事情时,比如调用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;
...
}
我得到一个蓝屏死机。不是上面的代码,在 vanilla 示例中,设置为 null 被注释掉,只是调用 Kbfilter 会导致 BSOD。我试图直接在 PDO 中设置设备扩展,但这也会导致 BSOD,大概是因为它是 PDO devExt,而不是 kbfiltr 的?
(相关:从 BSOD 获取堆栈跟踪的好方法是什么?我使用 Virtual PC 作为我的测试环境和未经检查的 XPSP3 构建)
我不能将 IOCTL_INTERNAL_KEYBOARD_DISCONNECT 直接发送到驱动程序堆栈(我知道输入设备一次只接受一个连接?)因此需要原始 PDO。我真的只需要发送两个 IOCTL(启用和禁用),我想我只需使用键盘断开和连接,因为这些已经定义。
如果我对这些假设中的任何一个有误,请告诉我,我知道我对此确实是个菜鸟,但我还没有找到很多关于通过 PDO 进行这种通信的文档。