原始PDO将IOCTL发送到上层过滤器驱动程序(kbfiltr / moufiltr)以启用/禁用设备

问题描述 投票:20回答:2

我对驱动程序开发非常陌生,它试图编写一个简单的筛选器驱动程序来启用或禁用键盘或鼠标设备。如果我可以使其工作,我想在插入鼠标时使用它来禁用笔记本电脑上的触摸板。我意识到那里可能已经有软件可以执行此操作,但是我对设备驱动程序确实很感兴趣,并且希望我自己学习如何做。

我正在使用WDK附带的kbfiltrmoufiltr示例,它们是作为上层过滤器驱动程序安装的。 kbfiltr示例创建一个pdo,该pdo可以通过用户模式程序枚举并连接到该pdo。这使我可以将由KbFilter_EvtIoDeviceControlForRawPdo处理的IOCTL发送到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;
    ...
    }

我得到蓝屏死机。它不是上面的代码,在原始示例中,设置为null的注释已被注释掉,仅调用Kbfilter会导致BSOD。我试图直接在PDO中设置设备扩展名,但这也会导致BSOD,大概是因为它是PDO devExt,而不是kbfiltr的原因?

((相关:从BSOD获取堆栈跟踪的好方法是什么?我将Virtual PC作为测试环境,并且使用未经检查的XPSP3版本)]

我无法将IOCTL_INTERNAL_KEYBOARD_DISCONNECT直接发送到驱动程序堆栈(我知道输入设备一次只能接受一个连接吗?),因此需要原始PDO。我真的只需要发送两个IOCTL(以启用和禁用),我认为我将只使用键盘断开连接和连接,因为这些已经定义。

如果我对这些假设中的任何一个都错了,请让我知道,我知道我确实对此很陌生,但是我没有找到很多有关通过PDO进行这种通信的文档。

我对驱动程序开发非常陌生,它试图编写一个简单的筛选器驱动程序来启用或禁用键盘或鼠标设备。如果我可以使用它,我想用它来禁用触摸板...

winapi driver device-driver wdk kmdf
2个回答
17
投票

好,我终于解决了这个问题,我的驱动程序正在工作。


4
投票

首先:您可以在用户模式下做您想做的事情(插入鼠标时在笔记本电脑上禁用触摸板)。这将更加简单和安全。看Using Device Installation FunctionsWM_DEVICECHANGE

© www.soinside.com 2019 - 2024. All rights reserved.