WMI_SET_DATABLOCK_CALLBACK回调函数 (wmilib.h)
DpWmiSetDataBlock 例程更改数据块的单个实例中的所有数据项。 此例程是可选的。
语法
WMI_SET_DATABLOCK_CALLBACK WmiSetDatablockCallback;
NTSTATUS WmiSetDatablockCallback(
[in] PDEVICE_OBJECT DeviceObject,
[in] PIRP Irp,
[in] ULONG GuidIndex,
[in] ULONG InstanceIndex,
[in] ULONG BufferSize,
[in] PUCHAR Buffer
)
{...}
参数
[in] DeviceObject
指向驱动程序的 WDM DEVICE_OBJECT 结构的指针。
[in] Irp
指向 IRP 的指针。
[in] GuidIndex
通过从零开始的索引将数据块指定到驱动程序在传递给 WmiSystemControl 的WMILIB_CONTEXT结构中提供的 GUID 列表中。
[in] InstanceIndex
如果 GuidIndex 指定的块具有多个实例, 则 InstanceIndex 指定实例。
[in] BufferSize
指定 Buffer 处缓冲区的大小(以字节为单位)。
[in] Buffer
指向包含实例的新值的缓冲区的指针。
返回值
DpWmiSetDataBlock 返回STATUS_SUCCESS或适当的错误状态,如下所示:
如果驱动程序无法立即完成请求,它可以返回STATUS_PENDING。
注解
WMI 在驱动程序调用 WmiSystemControl 以响应IRP_MN_CHANGE_SINGLE_INSTANCE请求后调用驱动程序的 DpWmiSetDataBlock 例程。
驱动程序负责验证所有输入参数。 具体而言,驱动程序必须执行以下操作:
- 根据 WMILIB_CONTEXT 结构的 GuidCount 成员,验证 GuidIndex 值是否介于 0 和 GuidCount-1 之间。
- 验证驱动程序是否未标记要删除的指定数据块。 如果驱动程序最近在 WMILIB_CONTEXT 结构中包含的 WMIGUIDREGINFO 结构中指定 了WMIREG_FLAG_REMOVE_GUID 标志,则设置请求可能在删除发生之前到达。
- 验证 InstanceIndex 值是否在数据块驱动程序支持的实例索引范围内。
- 验证 Buffer 和 BufferSize 描述有效大小的数据块,包括数据项之间存在的任何填充,以及缓冲区的内容是否对数据块有效。
- 验证指定的数据块是否为驱动程序允许调用方发起的修改的数据块。 换句话说,驱动程序不应允许修改你打算为只读的数据块。
如果驱动程序实现 DpWmiSetDataBlock 例程,则驱动程序必须将例程的地址放置在它传递给 WmiSystemControl 的WMILIB_CONTEXT结构的 SetWmiDataBlock 成员中。 如果驱动程序未实现 DpWmiSetDataBlock 例程,则必须将 SetWmiDataBlock 设置为 NULL。 在后一种情况下,WMI 将STATUS_READ_ONLY返回给调用方。
此例程可以分页。
有关实现此例程的详细信息,请参阅 调用 WmiSystemControl 以处理 WMI IRP。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | wmilib.h (包括 Wmilib.h) |
IRQL | 在 PASSIVE_LEVEL 调用。 |