WMI_EXECUTE_METHOD_CALLBACK回调函数 (wmilib.h)

DpWmiExecuteMethod 例程执行与数据块关联的方法。 此例程是可选的。

语法

WMI_EXECUTE_METHOD_CALLBACK WmiExecuteMethodCallback;

NTSTATUS WmiExecuteMethodCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG MethodId,
  [in]      ULONG InBufferSize,
  [in]      ULONG OutBufferSize,
  [in, out] PUCHAR Buffer
)
{...}

参数

[in] DeviceObject

指向驱动程序的 WDM DEVICE_OBJECT 结构的指针。

[in] Irp

指向 IRP 的指针。

[in] GuidIndex

通过将驱动程序在传递给 WmiSystemControlWMILIB_CONTEXT 结构中提供的 GUID 列表中提供从零开始的索引来指定数据块。

[in] InstanceIndex

如果 GuidIndex 指定的块具有多个实例, 则 InstanceIndex 将指定一个标识该实例的从零开始的索引值。

[in] MethodId

指定要执行的方法的 ID。 驱动程序将方法 ID 定义为数据块中的项。

[in] InBufferSize

指示输入数据的大小(以字节为单位)。 如果没有输入数据, 则 InBufferSize 为零。

[in] OutBufferSize

指示缓冲区中可用于输出数据的字节数。

[in, out] Buffer

指向一个缓冲区的指针,该缓冲区保存输入数据(如果有)并接收方法的输出数据(如果有)。 如果缓冲区太小,无法接收所有输出数据,驱动程序将返回STATUS_BUFFER_TOO_SMALL并调用 WmiCompleteRequest 并满足所需大小。

返回值

DpWmiExecuteMethod 返回STATUS_SUCCESS或相应的错误代码,如下所示:

注解

WMI 在驱动程序调用 WmiSystemControl 以响应IRP_MN_EXECUTE_METHOD请求后调用驱动程序的 DpWmiExecuteMethod 例程。

如果驱动程序实现 DpWmiExecuteMethod 例程,则驱动程序必须将例程的地址放在它传递给 WmiSystemControlWMILIB_CONTEXT 结构的 ExecuteWmiMethod 成员中。 如果驱动程序未实现 DpWmiExecuteMethod 例程,则必须将 ExecuteWmiMethod 设置为 NULL。 在后一种情况下,WMI 会向调用方返回STATUS_INVALID_DEVICE_REQUEST以响应任何 IRP_MN_EXECUTE_METHOD 请求。

驱动程序负责验证所有输入参数。 具体而言,驱动程序必须执行以下操作:

  • 根据 WMILIB_CONTEXT 结构的 GuidCount 成员,验证 GuidIndex 值是否介于 0 和 GuidCount-1 之间。
  • 验证驱动程序是否未标记要删除的指定数据块。 如果驱动程序最近在 WMILIB_CONTEXT 结构中包含的 WMIGUIDREGINFO 结构中指定 了 WMIREG_FLAG_REMOVE_GUID 标志,则其他请求可能在删除发生之前到达。
  • 验证 InstanceIndex 值是否在数据块驱动程序支持的实例索引范围内。
  • 验证 MethodId 提供的方法标识符是否是指定数据块的有效标识符,以及是否允许调用方执行该方法。
  • 验证 BufferInBufferSize 描述的缓冲区是否足够大,足以包含指定方法的输入参数(包括如有必要的填充),并验证输入参数是否有效。
  • 验证 BufferOutBufferSize 描述的缓冲区是否足够大,可以接收指定方法的输出数据,包括如有必要的填充。
不要假设线程上下文是正在启动的用户模式应用程序的上下文,更高级别的驱动程序可能已更改它。

如果指定的方法执行导致数据丢失的操作(例如提取和重置一组计数器的内容),则驱动程序应在执行操作之前验证输出缓冲区大小。 这样,驱动程序可以返回STATUS_BUFFER_TOO_SMALL并允许调用方重新提交具有较大缓冲区的请求,而无需过早重置计数器。

执行 方法并将任何输出数据写入缓冲区后,驱动程序将调用 WmiCompleteRequest 以完成请求。

此例程可以分页。

有关实现此例程的详细信息,请参阅 调用 WmiSystemControl 以处理 WMI IRP

要求

要求
目标平台 桌面
标头 wmilib.h (包括 Wmilib.h)
IRQL 在 PASSIVE_LEVEL 调用。

另请参阅

IRP_MN_EXECUTE_METHOD

WMILIB_CONTEXT

WmiCompleteRequest

WmiSystemControl