-->

生PDO发送IOCTL到上部过滤器驱动器(kbfiltr / moufiltr)启用/禁用设备(Ra

2019-08-06 17:31发布

我很新的驱动程序的开发,并尝试写一个简单的过滤器驱动程序,将启用或禁用键盘或鼠标设备。 如果我能做好工作,我想用它来对我的笔记本电脑禁用触摸板,当鼠标在插入。我知道有可能是软件有已经这样做了,但我在设备驱动程序很感兴趣,并希望学习如何做这自己。

我使用的是与WDK船舶kbfiltrmoufiltr例子,如装上过滤器驱动程序。 所述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这种沟通。

Answer 1:

好吧,我终于解决了这个和我的司机工作。

一个KMDF筛选器驱动程序的执行情况

感谢谢尔盖谁提出的COM端口的做法,因为这帮助我建立的WinDbg。 这真棒博客文章解释了如何得到它成立快,基本上你让VPC建立一个COM端口命名管道,启用虚拟化的操作系统内核调试模式,并连接到它,而它正在启动。 然后你可以在加载驱动程序时,让所有的DbgPrint消息,并做更多的事情,只是在启动过程的跟踪消息是对我来说是巨大的帮助。

我想我的主要问题是想重用KbFiltr内部IOCTL。 这只是我的一个不好的设计理念,因为我不知道内部IOCTL和其他的IOCTL之间的区别 - 内部IOCTLS如IOCTL_INTERNAL_KEYBOARD_DISCONNECT有限制条件的,只能由其他驱动程序或内核发送。 同时此知识库文章“如何发送IOCTL过滤驱动程序”是使用相同的控制装置结构的例子,但它是WDM。

总之,与KbFiltr例如整个周末的战斗后,我终于放弃了,并开始在使用WDF烤面包机/ FILTR例子 。 这是一个比较准系统KMDF筛选器驱动程序,我不得不填写大量使用KbFiltr和MouFiltr空白。 烤面包机过滤驱动器操作类似于KbFiltr但它创建了一个控制装置,而不是一个PDO的。 它还设置了一个DOS设备名称为控制器件的,所以你可以用它从用户模式,而无需进行pinvoke做到这一步通信。 控制装置,可以控制里面有你的过滤驱动程序只是通过遍历集合加载的所有设备。 一个waitlock用于同步集合访问。

我还能够只修改INF文件(使用鼠标类而不是烤面包机类),并在不修改驱动程序代码直接应用它开箱即用我的测试机上! 它是如此容易得多开始与正在工作的东西。 本页面给出了东西,你应该改变,以适应样本的完整列表。



Answer 2:

首先:你可以做你想做的事(我的笔记本电脑禁用触摸板当鼠标指针插入)在用户模式是什么。 这将是更简单,更安全。 看看使用设备安装功能和WM_DEVICECHANGE

要调试代码中的问题:从BSOD或设置内核调试器连接(使用COM端口重定向到一个管你的虚拟PC上)内存转储。 请参阅Windows调试工具

玩得开心!



文章来源: Raw PDO to send IOCTL to upper filter driver (kbfiltr/moufiltr) to enable/disable device