处理 DispatchSystemControl 例程中的 WMI IRP

仅当 Parameters.WMI.ProviderId 上的设备对象指针匹配驱动程序在调用 IoWMIRegistrationControl 时传递的指针时,才能在其 DispatchSystemControl 例程中处理 WMI IRP。 否则,驱动程序必须将 IRP 转发到下一个较低的驱动程序。

如果驱动程序处理请求,则必须:

检查 Parameters.WMI.DataPath 上的 GUID,以确定它是否表示驱动程序支持的数据块,如果不支持,则使 IRP 失败并STATUS_WMI_GUID_NOT_FOUND。

处理以下任何请求时,驱动程序应检查 Parameters.WMI.Buffer 中的输入WNODE_XXX 结构作为实例名称:

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD 驱动程序应为实例名称检查,如下所示:

  • 如果在 WnodeHeader.Flags 中设置了WNODE_FLAG_STATIC_INSTANCE_NAMES,请使用 InstanceIndex 作为该块的驱动程序静态实例名称列表中的索引。

  • 如果在 WnodeHeader.Flags 中清除WNODE_FLAG_STATIC_INSTANCE_NAMES,请使用 OffsetInstanceName 作为输入 WNODE_XXX 结构中实例名称字符串的偏移量。 OffsetInstanceName 是结构开头到 USHORT 的偏移量(以字节为单位),表示实例名称字符串的长度(以字节 (而不是字符) ,包括 NUL 终止符(如果存在),后跟 Unicode 中的字符串本身。

如果驱动程序找不到 InstanceIndexOffsetInstanceName 指定的实例,则必须使 IRP 失败并STATUS_WMI_INSTANCE_NOT_FOUND。

对于IRP_MN_EXECUTE_METHOD请求,在输入WNODE_METHOD_ITEM中检查 MethodID,如果该方法对数据块无效,则 IRP 失败并STATUS_WMI_ITEMID_NOT_FOUND。

如果请求生成输出,则处理以下任何请求时,驱动程序应在 Parameters.WMI.BufferSize 中检查缓冲区的大小:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD 如果缓冲区太小而无法接收输出,但至少 大小 为 (WNODE_TOO_SMALL) ,驱动程序应继承 IRP 并将 WNODE_TOO_SMALL 结构写入 Parameters.WMI.Buffer 的缓冲区。 如果缓冲区 小于 (WNODE_TOO_SMALL) 的大小,则驱动程序因 NTSTATUS 代码STATUS_BUFFER_TOO_SMALL导致 IRP 失败。

如果请求生成输出并且缓冲区大小足够,请将以下输出写入 Parameters.WMI.Buffer 中的缓冲区:

  • 对于 IRP_MN_QUERY_ALL_DATA 请求,驱动程序会编写一个 WNODE_ALL_DATA 结构,该结构包含指定数据块的所有实例的数据。
  • 对于 IRP_MN_QUERY_SINGLE_INSTANCE 请求,驱动程序会编写一个 WNODE_SINGLE_INSTANCE 结构,该结构包含数据块的指定实例的数据。
  • 对于 IRP_MN_EXECUTE_METHOD 如果方法生成输出,驱动程序会按照缓冲区中的输入 WNODE_METHOD_ITEM 以驱动程序确定的格式写入方法输出, (覆盖输入数据(如果有) )。

Irp-IoStatus.Information> 设置为在 Parameters.WMI.BufferIrp-IoStatus.Status> 处写入缓冲区的字节数,以STATUS_SUCCESS。

调用 IoCompleteRequest 以完成 IRP。

有关详细信息,请参阅 WMI WNODE_XXX 结构