IRP_MN_QUERY_CAPABILITIES

PnP 管理器发送此 IRP 以获取设备的功能,例如设备是可以锁定还是弹出。

如果函数和筛选器驱动程序更改总线驱动程序支持的功能,则可以处理此请求。 总线驱动程序必须为其子设备处理此请求。

0x09

主代码

IRP_MJ_PNP

发送时

枚举设备后,PnP 管理器立即将此 IRP 发送到设备的总线驱动程序。 设备的所有驱动程序启动设备后,PnP 管理器会再次发送此 IRP。 驱动程序可以发送此 IRP 来获取设备的功能。

PnP 管理器和驱动程序在任意线程上下文中的 IRQL PASSIVE_LEVEL发送此 IRP。

输入参数

IO_STACK_LOCATION 结构的 Parameters.DeviceCapabilities.Capabilities 成员指向包含有关设备功能信息的DEVICE_CAPABILITIES结构。

输出参数

Parameters.DeviceCapabilities.Capabilities 指向 DEVICE_CAPABILITIES 结构,该结构反映处理 IRP 的驱动程序所做的任何修改。

I/O 状态块

驱动程序将 Irp-IoStatus.Status> 设置为STATUS_SUCCESS或适当的错误状态(例如STATUS_UNSUCCESSFUL)。

如果函数或筛选器驱动程序未处理此 IRP,它将调用 IoSkipCurrentIrpStackLocation 并将 IRP 向下传递到下一个驱动程序。 此类驱动程序不得修改 Irp-IoStatus.Status>,也不得完成 IRP。

总线驱动程序设置 Irp-IoStatus.Status> 并完成 IRP。

Operation

枚举设备时,但在为设备加载函数和筛选器驱动程序之前,PnP 管理器会向设备的父总线驱动程序发送 IRP_MN_QUERY_CAPABILITIES 请求。 总线驱动程序必须在 DEVICE_CAPABILITIES 结构中设置任何相关值,并将其返回到 PnP 管理器。

生成设备堆栈且驱动程序启动设备后,PnP 管理器再次发送此 IRP,以便首先由设备堆栈顶部的驱动程序处理,然后由堆栈中的每个较低驱动程序处理。 函数和筛选器驱动程序可以设置 IoCompletion 例程,并在备份设备堆栈时处理此 IRP。

驱动程序应先添加功能,然后再将 IRP 传递到下一个较低的驱动程序。

在所有较低版本驱动程序完成 IRP 后,驱动程序应删除功能。 驱动程序通常不会删除已由其他驱动程序设置的功能,但如果它具有特定配置中设备功能的特殊信息,它可能会这样做。 有关将 IRP 处理推迟到较低驱动程序完成的信息,请参阅即插即用

枚举设备并加载其驱动程序后,其功能不应更改。 如果删除并重新枚举设备,设备的功能可能会更改。

处理 IRP_MN_QUERY_CAPABILITIES IRP 时,作为设备的电源策略管理器的驱动程序应设置 IoCompletion 例程,并在 IRP 备份设备堆栈的方式上复制设备电源功能(例如 S-to-D 电源状态映射)。 为了确定子设备的电源功能,父总线驱动程序会创建另一个查询功能 IRP,并将 IRP 发送到其父驱动程序。 有关详细信息 ,请参阅报告设备电源功能

如果驱动程序处理此 IRP,则应检查 DEVICE_CAPABILITIESVersion 值。 如果该值不是驱动程序支持的版本,则驱动程序应使 IRP 失败。 如果支持版本,驱动程序应检查 Size 字段。 驱动程序应仅设置其作为输入接收的功能结构边界内的那些字段。

处理此 IRP 的驱动程序可以设置一些 DEVICE_CAPABILITIES 字段,但不得设置 “大小 ”和“ 版本 ”字段。 这些字段仅由发送 IRP 的组件设置。

有关处理即插即用次要 IRP 的一般规则,请参阅即插即用。

发送此 IRP

总线驱动程序在处理其子设备之一的 IRP_MN_QUERY_CAPABILITIES 请求时,会将此 IRP 发送到父设备堆栈。 此外,驱动程序可能会发送此 IRP 以获取其设备之一的设备功能。 堆栈中的单个驱动程序仅包含设备的部分功能信息;将 IRP 发送到设备堆栈可使其收集完整情况,包括任何筛选器驱动程序的修改,等等。

有关发送 IRP 的信息,请参阅处理 IRP。 以下步骤专门适用于此 IRP:

  • 从分页池中分配 DEVICE_CAPABILITIES 结构,并通过调用 RtlZeroMemory 将其初始化为零。 将 “大小 ”初始化为 size of (DEVICE_CAPABILITIES) , 将“版本 ”初始化为 1,将 “地址UINumber” 初始化为 -1。

  • 设置 IRP 的下一个 I/O 堆栈位置中的值:将 MajorFunction 设置为 IRP_MJ_PNP,将 MinorFunction 设置为 IRP_MN_QUERY_CAPABILITIES,并将 Parameters.DeviceCapabilities 设置为指向已分配 DEVICE_CAPABILITIES 结构的指针。

  • 初始化 IoStatus.Status 以STATUS_NOT_SUPPORTED。

  • 不再需要 IRP 和 DEVICE_CAPABILITIES 结构时解除分配。

要求

标头

Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另请参阅

DEVICE_CAPABILITIES