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

如果由 GuidIn dex 指定的块具有多个实例,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 例程,驱动程序必须将例程的地址放在 ExecuteWmiMethod 传递给 WmiSystemControlWMILIB_CONTEXT 结构的成员中。 如果驱动程序未实现 DpWmiExecuteMethod 例程,则必须 将 executeWmiMethod 设置为 NULL。 在后一种情况下,WMI 向调用方返回STATUS_INVALID_DEVICE_REQUEST,以响应任何 IRP_MN_EXECUTE_METHOD 请求。

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

  • 根据 WMILIB_CONTEXT 结构的 GuidCount 成员,验证 GuidIndex 值是否介于零和 GuidCount-1 之间。
  • 验证驱动程序是否已标记指定的数据块以供删除。 如果驱动程序最近在 WMIGUIDREGINFO 中指定了WMIREG_FLAG_REMOVE_GUID标志, 结构中包含的 WMILIB_CONTEXT 结构,则可能需要在删除之前收到其他请求。
  • 验证 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