【问题标题】:Accessing WinUSB device from Kernel Mode从内核模式访问 WinUSB 设备
【发布时间】:2012-09-14 12:35:56
【问题描述】:

我确实有一个使用 WinUSB 驱动程序 (winusb.sys) 作为其功能驱动程序的 USB 设备。现在我需要编写一个视频捕获驱动程序(必须是内核模式驱动程序)来访问这个设备。

我的问题是:我可以从内核模式访问和使用 WinUSB 设备吗?如果是这样,是否有任何类型的文档可以这样做?

我找到的所有文档都在谈论使用 WinUSB.dll 从用户模式访问 WinUSB,但这对我来说不是一个选项。我已经尝试使用 IoGetDeviceObjectPointer() 来获取我在 USB 设备上与之通信的 USB 管道所需的文件句柄,但调用总是以 STATUS_ACCESS_DENIED 失败。 我知道我可以为 USB 设备编写自己的 KMDF 驱动程序,但使用已经存在的 WinUSB 驱动程序会容易得多。

任何帮助将不胜感激。

【问题讨论】:

    标签: kernel access-denied winusb


    【解决方案1】:

    这可行……但很难做到。

    您可以在内核模式下向 winusb 设备发送 i/o 请求。您不能使用 WinUSB 函数进行通信,您必须使用实际的 IO 请求从一个 i/o 堆栈与另一个堆栈进行通信。

    我为 USB 设备编写了一个 AVStream 微型端口驱动程序,并且可以说,USB 部分不是最难的部分。特别是在 miniport 模式下使用 kmdf USB IO 队列时。

    【讨论】:

    • 我已经为我的 USB 设备提供了一个有效的 AVStream 微型端口驱动程序,但该驱动程序使用我的旧 WDM USB 驱动程序与设备通信。我的旧 WDM USB 驱动程序的问题在于它已经使用了大约 12 年,无法正常使用零长度数据包,并且不支持 USB 3.0。这就是我尝试将其替换为 WinUSB 作为 USB 驱动程序的原因,因为 WinUSB 支持 USB 3.0 并且还可以处理零长度数据包。
    • AVStream 和 WinUSB 的主要问题是相互通信的方式。使用我的旧 WDM 驱动程序,我只需调用 IoGetDeviceObjectPointer 并使用设备注册键后跟 PIPE00 来获取管道 0 的文件句柄,但这不适用于 WinUSB(如果我尝试使用 WRITE 权限打开管道,总是会收到 STATUS_ACCESS_DENIED 错误)。如何从 WinUSB 获取我的 USB 设备的各种管道的文件句柄?就是这个问题。
    • 据我所知,WinUSB 不会将其管道导出为文件句柄。所以你必须使用 I/O 控件。
    • 感谢您的帮助。在哪里可以找到 WinUSB 的 I/O 控制请求代码?它们似乎没有在任何地方记录。你知道我在哪里可以买到它们吗?
    • 抱歉,据我所知,它们没有正式记录,但您可以通过捕获从 winusb 测试应用程序发送的设备 i/o 控件来对它们进行逆向工程。
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2015-07-08
    • 2012-01-01
    • 2012-07-06
    • 2012-06-15
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多