虚拟USB设备总结

本文介绍了在Windows环境中,通过C/S架构设计的虚拟USB键盘开发过程,涉及用户空间工具、底层虚拟总线驱动以及IRP与URB的协调工作,展示了如何模拟远程设备并处理数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发环境: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) 完全相同。

服务端待续更新。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值