IRP_MN_QUERY_CAPABILITIES
PnP 管理器发送此 IRP 以获取设备的功能,例如设备是否可以锁定或弹出。
如果函数和筛选器驱动程序更改总线驱动程序支持的功能,函数和筛选器驱动程序可以处理此请求。 总线驱动程序必须处理其子设备的此请求。
值
0x09
主要代码
发送时间
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 sizeof(DEVICE_CAPABILITIES)、版本到 1,将 Address 和 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) |