我很新的驱动程序的开发,并尝试写一个简单的过滤器驱动程序,将启用或禁用键盘或鼠标设备。 如果我能做好工作,我想用它来对我的笔记本电脑禁用触摸板,当鼠标在插入。我知道有可能是软件有已经这样做了,但我在设备驱动程序很感兴趣,并希望学习如何做这自己。
我使用的是与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;
...
}
我得到一个BSOD。 它不是上面的代码,在香草例子中,设置为NULL被注释掉了,只是打电话到Kbfilter导致蓝屏。 我曾尝试直接在PDO设置设备扩展,但这也导致蓝屏,大概是因为它是PDO devExt,不kbfiltr的?
(相关阅读:什么是从BSOD获得堆栈跟踪的一个很好的方式,我使用虚拟PC作为我的测试环境和XPSP3的未查看编译)
我不能直接发送到IOCTL_INTERNAL_KEYBOARD_DISCONNECT驱动程序堆栈(据我所知,输入设备接受在同一时间只有一个连接?),因此需要对原料PDO。 我真的只需要发送两个的IOCTL(启用和禁用),我想我会只使用键盘的断开和连接,因为这些已经被定义。
如果我说错了这些假设,请让我知道,我知道,我真的是在这一个小白,但我还没有发现大量的文档资料有关通过PDO这种沟通。