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

Windows 通过发送 I/O 请求数据包 (IRP) 类型IRP_MJ_SYSTEM_CONTROL,通知 WMI 请求的存储端口驱动程序,如 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 库调度例程的那一刻起所经历的更改。

存储堆栈如何处理 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 的 Function 成员。 端口驱动程序将次要 WMI IRP 编号传输到 SRB WMISubFunction 成员。 并安排 I/O 管理器通过调用 IoStartPacket 来调用微型端口驱动程序的启动 I/O 例程 HwScsiStartIo

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