-
(背景知识)
-
设备堆栈
- USB功能驱动(FDO)
-
- USB物理总线驱动(PDO)
-
- USB Host 或 USB Hub驱动
- PDO完成了大部分工作,
封装了USB协议细节
并为FDO提供了标准的接口
-
各种描述符
-
端点描述符
- 描述处理事务(Transaction)的端点
-
接口描述符
- 描述设备提供的功能接口
-
配置描述符
- 描述设备能实现的配置方式
- 设备描述符
- 自下而上
(除端点描述符
可以为0个之外)
每一下一层
都拥有 上一层
一个至多个
-
大致步骤
- 令牌(Token)阶段已包含在内
-
创建URB
- UsbBuildGetDescriptorRequest
-
关联URB至IRP
- IoBuildDeviceIoControlRequest
-
发送URB至底层驱动程序
- IoCallDriver
-
等待完成IRP
-
同步
- (不做处理)
-
异步(STATUS_PENDING)
- KeWaitForSingleObject
-
USB设备初始化
- 注册标准的WDM回调(Callback)函数
-
USB设备热插拔
-
IRP_MJ_PNP
- 来自:
即插即用管理器
-
IRP_MN_START_DEVICE
- 驱动加载并运行时
-
USB驱动程序对应操作
- 获取并存储USB设备描述信息
-
IRP_MN_STOP_DEVICE
- 设备关闭前
-
USB驱动程序对应操作
- 尽快结束IRP并逐个取消掉
- 标记设备扩展当前状态为“停止”
-
IRP_MN_EJECT
- 设备正常弹出前
-
USB驱动程序对应操作
- 强迫结束并取消 所有未完成的读写IRP
- 标记设备状态为被拔掉
-
IRP_MN_SURPRISE_REMOVAL
- 设备非自然弹出
-
USB设备对应操作
- 强迫结束并取消 所有未完成的读写IRP
- 标记设备状态为被拔掉
-
USB设备读写
- 80%走Bulk管道
-
一个读/写 操作
典型示例
-
驱动程序
- 设置 IRP_MJ_READ / IRP_MJ_WRITE 派遣函数
-
应用程序
- 调用 API 进行 ReadFile / WriteFile