开发环境:windows
首先来总结最近研究的虚拟USB设备,进而虚拟USB键盘成功了,开心!
得出了一个C/S框架,首先说一下客户端
客户端有两个部分,用户空间工具和底层虚拟总线驱动;
在本文件中 我们将 它们分别指向 用户空间工具 和 底层虚拟总线驱动。首先,用户启动用户空间工具来查询导出的来自服务器的USB 设备 ,如果有可用的设备,他或她可能会决定导入设备。如果入口请求成功, 用户空间工具 会向 底层虚拟总线驱动 发送一个 IRP,通知它创建一个物理设备对象 。
它代表 插入客户端计算机的真实USB 设备。当然,没有真正的设备附加到客户端机器,但我们的系统 会在不知情的情况下将其视为真实机器。然后系统将发送许多 IRP 到 我们用于查询目的的虚拟总线驱动程序, 例如设备能力查询、设备硬件 ID 查询等
有些查询与服务器端的实际设备无关 ,我们的虚拟总线驱动程序会马上完成它们。但是当用户访问远程 USB 设备上的数据存储时 ,我们的总线驱动程序会收到 IRP 那些与 URB(USB 请求块)相关的数据,总线驱动程序不能 立即给她返回所需的数据。
在这种情况下,底层虚拟总线驱动 将查找是否有来自 用户空间工具的挂起读取 请求,如果
(1):
确实有一个待处理的读取请求;底层虚拟总线驱动将使用 URB 正确地提供读取任务,IRP 是入队 并设置为挂起状态。到这个时候,用户空间工具的读操作会成功返回, 然后 用户空间工具 将根据客户端和服务器之间的协议将 URB嵌入 到一个包中并发送这个 打包到服务器。用户空间工具 总是 在一个套接字上等待,当它从服务器接收到一个包时,它会调用 WriteFile() API 将包写入我们的虚拟 USB 设备。收到写 IRP 后,底层虚拟总线驱动 得到来自这个写 IRP 的数据并将适当的数据提供给前一个挂起的 IRP ,然后那个挂起的 IRP 将成功完成后,它将随后出队。
(2):
没有挂起的读请求;IRP 将入队并设置为挂起状态。如果来了一段时间后来自 用户空间工具 的读取请求,底层虚拟总线驱动 将搜索队列以获取尚未发送到服务器的 IRP。当它找到一个时,它将向读取操作提供信息,从发现的 IRP 开始,所有后续行为都将与上述 (1) 完全相同。
服务端待续更新。。。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)