这是我对UsbDk官方文档的翻译,希望对大家有帮助,有错误之处还请谅解.
UsbDk开发套件是由一套软件工具和模块组成,它把USB设备从PNP管理器和设备驱动分离,并提供了一系列API供用户层程序直接独占的访问USB设备,进行USB设备相关操作。
UsbDk一开始是用来为spice远程桌面程序提供USB重定向的支持,然而它可以被用来做很多其他相关事情,通过UsbDk自带的库或者通过libusb(我们为libusb做了backend支持)
UsbDk开发套件包含以下模块:
- UsbDk.sys – USB总线过滤驱动,用来获取对USB设备的独占访问
- UsbDkHelper.dll – 辅助dll,用来安装,卸载,设置驱动。并转发USB请求到指定的USB设备
- UsbDkController.exe – 简单的命令行程序,用来演示和验证相关接口
remote-viewer程序调用UsbDk接口,用来对USB设备进行发现,访问和重定向的操作
系统架构总览
UsbDk.sys 是一个USB过滤驱动,也是一个USB设备驱动。
安装的时候,它被注册为一个USB过滤驱动,当有USB设备或者USB Hubs设备被系统发现的时候,系统会调用它。在调用的时候,UsbDk.sys会检查底层设备的标识并单独为USB Hubs 创建过滤示例
作为一个USB Hub的过滤驱动,UsbDk.sys 接收来自USB设备栈上层设备的所有请求,包括PNP管理器所发送的枚举请求(IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS)。
等USB hub驱动完成对PNP管理器枚举请求的处理,UsbDk.sys会扫描返回的子设备列表,假设有设备被标记为重定向(根据现有的配置)它会为这些设备生产过滤实例
因此,所有PNP管理器请求都将通过UsbDk.sys回调,后者根据需要会修改设备ID属性以使PNP管理器识别该设备为通用USB设备。
除此之外,UsbDk.sys 标记下层设备对象为 raw PDO,这样系统会分为这些设备对象分配驱动(创建他们的驱动,也就是UsbDk.sys)作为设备驱动
在此阶段,所有对此vendor id的特定设备请求都将被转发到UsbDk.sys,UsbDk.sys会根据需求修改或者传递相关设备的请求
UsbDkHelper.dll提供了一个单独的API,用来把指定USB设备从USB设备栈中分类,而不需要获取对设备的实际访问。(隐藏API)
这个API可能对一些安全程序很有用,比如根据安全策略阻止对USB设备的访问,防止Windows显示仅由UsbDk管理的设备的“发现新硬件”弹窗。当UsbDk.sys在枚举阶段发现要隐藏的设备标识,它会在处理(IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS)的时候从USB bus driver返回的设备列表中擦除相关设备,这有效的把设备从PNP管理器和系统的驱动栈中隐藏了起来。
UsbDk安装后的设备栈结构
—————————————————————
QUERY_DEVICE_RELATIONS 请求流程图
—————————————————————
设备获取访问流程图
—————————————————————
重定向后 QUERY_DEVICE_RELATIONS 请求流程图
—————————————————————
重定向生效后的设备栈架构
—————————————————————
原文地址:https://www.cnblogs.com/magicdmer/p/10994120.html