代码之家  ›  专栏  ›  技术社区  ›  Dale

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

  •  19
  • Dale  · 技术社区  · 15 年前

    我对驱动程序开发非常陌生,并且尝试编写一个简单的过滤器驱动程序,它可以启用或禁用键盘或鼠标设备。如果我能让它工作,我想用它来禁用我的笔记本电脑上的触摸板,当鼠标插入。我意识到可能有软件已经做到了这一点,但我真的对设备驱动程序很感兴趣,我想自己学习如何做到这一点。

    我正在使用 KBFILTR 穆菲尔特 随WDK一起提供的示例,安装为上层过滤器驱动程序。Kbfiltr示例创建一个PDO,可以通过用户模式程序枚举并连接到该PDO。这允许我将IOCTL发送到由处理的PDO Rawpdo的Kbfilter-evtioDeviceControl .但是,当我尝试做任何与过滤器驱动程序相关的事情时,比如调用 KB滤波器内部设备控制 所以我可以做一些像

    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;
        ...
        }
    

    我有个疯子。这不是上面的代码,在普通的例子中,设置为空的代码被注释掉了,只是调用kbfilter会导致bsod。我已经尝试在PDO中直接设置设备扩展,但这也会导致BSOD,大概是因为它是PDO devext,而不是Kbfiltr的?

    (相关:从BSOD获取堆栈跟踪的好方法是什么?我正在使用虚拟PC作为测试环境和未经检查的xpsp3版本)

    我不能将ioctl_internal_keyboard_disconnect直接发送到驱动程序堆栈(我知道输入设备一次只接受一个连接?)因此需要原始PDO。我真的只需要发送两个ioctl(启用和禁用),我想我只需要使用键盘断开和连接,因为它们已经定义好了。

    如果我对这些假设有任何错误,请告诉我,我知道我真的是一个无能为力的人,但是我没有找到很多关于通过PDO进行这种交流的文档。

    2 回复  |  直到 13 年前
        1
  •  16
  •   Dale    15 年前

    好的,我终于解决了这个问题,我的司机在工作。

    一种KMDF滤波器驱动程序的实现 :

    感谢Sergius,他建议使用COM端口方法,因为这有助于我设置 WinDbg. This awesome blog post 解释如何快速设置它,基本上是让vpc将COM端口设置为命名管道,在虚拟化操作系统上启用内核调试模式,并在启动时连接到它。然后,您可以在加载驱动程序时获得所有dbgprint消息,并做更多的工作,但是在启动过程中,仅仅跟踪消息对我来说是一个巨大的帮助。

    我认为我的主要问题是试图在Kbfiltr中重用内部ioctl。对于我来说,这只是一个错误的设计思想,因为我不理解内部ioctl和其他ioctl之间的区别-内部ioctl,如ioctl_internal_keyboard_disconnect具有受限的访问条件,应该只由其他驱动程序或内核发送。阿尔索 this KB article "How to send IOCTL to filter driver" 是一个使用相同控制设备结构的例子,但它是WDM。

    总之,在整个周末与Kbfiltr示例进行了斗争之后,我终于放弃并重新开始使用 WDF Toaster/filtr example .这是一个更为简陋的kmdf过滤器驱动程序,我不得不用kbfiltr和mouffiltr填充很多空白。烤面包机过滤器驱动程序的操作类似于kbfiltr,但它创建了一个控制设备而不是PDO。它还为控制设备设置一个DOS设备名,这样您就可以从用户模式与它通信,而无需PInvoke执行该步骤。控制设备允许您通过迭代集合来控制所有加载了筛选器驱动程序的设备。WaitLock用于同步对集合的访问。

    我还可以修改inf文件(使用鼠标类而不是烤面包机类),直接在我的测试机上应用它,而不需要修改驱动程序代码! 从有用的东西开始要容易得多。 This page 给出了一个全面的列表,列出了为适应示例而应该更改的内容。

        2
  •  3
  •   Sergey Podobry    15 年前

    首先:你可以在用户模式下做你想做的(当鼠标插入时禁用我笔记本电脑上的触摸板)。它会更简单更安全。看 Using Device Installation Functions WM_DEVICECHANGE

    调试代码中的问题:从bsod获取内存转储或设置内核调试程序连接(使用虚拟PC上的COM端口重定向到管道)。见 Debugging Tools for Windows

    玩得高兴!