Windows驱动之PNP状态转换

文章目录

  • Windows驱动之PNP状态转换
    • 1. IRP_MN_XXX
    • 2. 状态转换
      • 2.1 Not Present
      • 2.2 Stopped
      • 2.3 working

Windows驱动之PNP状态转换

即插即用(Plug and Play – PnP)管理器使用主功能码为IRP_MJ_PNP的IRP与设备驱动程序交换信息和请求。

在WDM中,PnP请求扮演了两个角色。

  1. 在第一个角色中,这些请求指示驱动程序何时以及如何配置或取消其硬件或自身的设置。
    • PnP管理器使用IRP_MN_START_DEVICE来通知功能驱动程序其硬件被赋予了什么I/O资源,以及指导功能驱动程序做任何必要的硬件或软件设置以便设备能正常工作。
    • IRP_MN_STOP_DEVICE告诉功能驱动程序关闭设备。
    • IRP_MN_REMOVE_DEVICE告诉功能驱动程序关闭设备并释放与之关联的设备对象
  2. PnP请求的第二个角色是指导驱动程序完成一系列状态转换。
    • WORKING和STOPPED是设备的两个基本状态。
    • 当你创建设备对象后,设备就立即进入STOPPED状态。
    • WORKING状态指出设备是全部可操作的。
    • 此外,还有两个中间状态,PENDINGSTOP和PENDINGREMOVE,它们出现在WORKING状态前。
    • SURPRISEREMOVED发生在物理硬件突然被移去的情况下。

我们先来看IRP_MJ_PNP的副功能码.

1. IRP_MN_XXX

IRP_MJ_PNP的副功能码有如下这些:

IRP副功能码 描述
IRP_MN_START_DEVICE 配置并初始化设备
IRP_MN_QUERY_REMOVE_DEVICE 设备可以被安全地删除吗?
IRP_MN_REMOVE_DEVICE 关闭并删除设备
IRP_MN_CANCEL_REMOVE_DEVICE 忽略以前的QUERY_REMOVE
IRP_MN_STOP_DEVICE 关闭设备
IRP_MN_QUERY_STOP_DEVICE 设备可以被安全地关闭吗?
IRP_MN_CANCEL_STOP_DEVICE 忽略以前的QUERY_STOP
IRP_MN_QUERY_DEVICE_RELATIONS 给出与指定特征相关的设备列表
IRP_MN_QUERY_INTERFACE 获得直接调用函数地址
IRP_MN_QUERY_CAPABILITIES 取设备能力
IRP_MN_QUERY_RESOURCES* 取引导配置
IRP_MN_QUERY_RESOURCE_REQUIREMENTS* 取I/O资源需求
IRP_MN_QUERY_DEVICE_TEXT* 获得描述信息或位置串
IRP_MN_FILTER_RESOURCE_REQUIREMENTS 修改I/O资源需求列表
IRP_MN_READ_CONFIG* 读配置空间
IRP_MN_WRITE_CONFIG* 写配置空间
IRP_MN_EJECT* 弹出设备
IRP_MN_SET_LOCK* 设备弹出锁定/解除
IRP_MN_QUERY_ID* 取设备硬件ID
IRP_MN_QUERY_PNP_DEVICE_STATE 取设备状态
IRP_MN_QUERY_BUS_INFORMATION* 取父总线类型
IRP_MN_DEVICE_USAGE_NOTIFICATION 通知分页、dump、睡眠文件被创建或删除
IRP_MN_SURPRISE_REMOVAL 通知设备已经被删除

2. 状态转换

PNP设备的状态图如下:

Windows驱动之PNP状态转换_第1张图片

2.1 Not Present

  1. 首先,当设备没有插入的时候,属于NotPresent状态,这个时候这个状态唯一可以转换的是插入设备,进入Stopped状态。
  2. 其次,如果设备插入之后被拔出了,那么这个状态也会回到NotPresent状态,拔出的时候会受到REMOVE_DEVICE的消息。

2.2 Stopped

  1. 当设备插入的时候,调用AddDevice创建一个功能性的设备对象来处理功能,这个时候,设备的状态就是Stopped,表明这个设备并没有开始工作。
  2. 如果一个正在处于工作状态的设备,如果停止的话,就会收到一个STOP_DEVICE的消息。
  3. 在working和stop中间,有一个pendingstop的状态,表明开始请求停止设备,在pendingstop状态下,可以cancel_stop_device,也可以stop_device.

2.3 working

  1. 当一个stop的设备,调用Start_Device之后,这个设备就处于working状态了,说明这个设备可以相应所有请求了。
  2. 一个woring的设备,可以stop_device将设备停止,此时设备状态为stopped状态。
  3. 当然如果一个working的设备之间被拔出,那么通过remove_device将设备变成拔出状态。

你可能感兴趣的:(Windows驱动开发)