端口驱动程序如何处理 WMI 请求

Windows通过发送 I/O 请求数据包来通知 WMI 请求的存储端口驱动程序, (IRP) 类型为 IRP_MJ_SYSTEM_CONTROL,如 Windows Management Instrumentation 中所述。 系统控制 IRP 可以包含表示 WMI 操作的任何次要 IRP 数字。 有关详细信息,请参阅 WMI 次要 IRP

若要使用 SCSI 端口 WMI 库处理 WMI SRB,SCSI 微型端口驱动程序必须提供与 WMI 次要 IRP 编号对应的一系列回调例程。 下表说明了微型端口驱动程序回调例程与其相应的 WMI 次要 IRP 编号之间的关系。

WMI IRP 次要编号 微型端口驱动程序回调例程

IRP_MN_REGINFO

HwScsiWmiQueryReginfo

IRP_MN_QUERY_ALL_DATA

HwScsiWmiQueryDataBlock

IRP_MN_QUERY_SINGLE_INSTANCE

HwScsiWmiQueryDataBlock

IRP_MN_CHANGE_SINGLE_INSTANCE

HwScsiWmiSetDataBlock

IRP_MN_CHANGE_SINGLE_ITEM

HwScsiWmiSetDataItem

IRP_MN_EXECUTE_METHOD

HwScsiWmiExecuteMethod

IRP_MN_ENABLE_EVENTS

HwScsiWmiFunctionControl

IRP_MN_DISABLE_EVENTS

HwScsiWmiFunctionControl

IRP_MN_ENABLE_COLLECTION

HwScsiWmiFunctionControl

IRP_MN_DISABLE_COLLECTION

HwScsiWmiFunctionControl

每个微型端口驱动程序回调例程都应提供与相应的 WMI 次要 IRP 编号或数字关联的功能。 某些例程(如 HwScsiWmiFunctionControl)必须能够提供与多个 WMI 次要 IRP 编号对应的功能。

微型端口驱动程序将调用 SCSI 端口 WMI 库调度例程 ScsiPortWmiDispatchFunction,然后调度例程将调用相应的微型端口驱动程序回调例程。 端口驱动程序将 WMI 次要 IRP 号码传输到 SRB,以便调度例程可以咨询 SRB 以确定要调用的回调例程。

下图演示了 WMI 请求从存储端口驱动程序接收它的那一刻起发生的更改,直到存储微型端口驱动程序将其传递给 SCSI 端口 WMI 库调度例程。

how the storage stack handles a wmi irp .

  1. 以下步骤说明存储堆栈如何将 WMI IRP 重新打包为 SRB:

  2. Windows通过发送类型为 IRP_MJ_SYSTEM_CONTROL 的 IRP 来通知 WMI 请求的存储端口驱动程序。

  3. 端口驱动程序将 WMI IRP 重新打包为类型 为SCSIWMI_REQUEST_CONTEXT 的 WMI SRB,并将值SRB_FUNCTION_WMI分配给 SRB 的 函数 成员。 端口驱动程序将次要 WMI IRP 号传输到 SRB WMISubFunction 成员。 并安排 I/O 管理器通过调用 IoStartPacket 来调用微型端口驱动程序的启动 I/O 例程 HwScsiStartIo

  4. 微型端口驱动程序调用 SCSI 端口 WMI 库调度例程来处理 SRB。 有关详细信息,请参阅 使用 SCSI 端口 WMI 库