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