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
通过将驱动程序在传递给 WmiSystemControl 的 WMILIB_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 例程,则驱动程序必须将例程的地址放在它传递给 WmiSystemControl 的 WMILIB_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 提供的方法标识符是否是指定数据块的有效标识符,以及是否允许调用方执行该方法。
- 验证 Buffer 和 InBufferSize 描述的缓冲区是否足够大,足以包含指定方法的输入参数(包括如有必要的填充),并验证输入参数是否有效。
- 验证 Buffer 和 OutBufferSize 描述的缓冲区是否足够大,可以接收指定方法的输出数据,包括如有必要的填充。
如果指定的方法执行导致数据丢失的操作(例如提取和重置一组计数器的内容),则驱动程序应在执行操作之前验证输出缓冲区大小。 这样,驱动程序可以返回STATUS_BUFFER_TOO_SMALL并允许调用方重新提交具有较大缓冲区的请求,而无需过早重置计数器。
执行 方法并将任何输出数据写入缓冲区后,驱动程序将调用 WmiCompleteRequest 以完成请求。
此例程可以分页。
有关实现此例程的详细信息,请参阅 调用 WmiSystemControl 以处理 WMI IRP。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | wmilib.h (包括 Wmilib.h) |
IRQL | 在 PASSIVE_LEVEL 调用。 |