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。

操作

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

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

驱动程序应在将 IRP 传递到下一个较低驱动程序之前添加功能。

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

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

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

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

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

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

发送此 IRP

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

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

  • 从分页池分配DEVICE_CAPABILITIES结构,并通过调用 RtlZeroMemory 将其初始化为零。 初始化 Size to sizeofDEVICE_CAPABILITIES)、版本到 1,将 AddressUINumber 初始化为 -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