WMI_SET_DATAITEM_CALLBACK回调函数 (wmilib.h)
DpWmiSetDataItem 例程更改数据块实例中的单个数据项。 此例程是可选的。
WMI_SET_DATAITEM_CALLBACK WmiSetDataitemCallback;
NTSTATUS WmiSetDataitemCallback(
[in] PDEVICE_OBJECT DeviceObject,
[in] PIRP Irp,
[in] ULONG GuidIndex,
[in] ULONG InstanceIndex,
[in] ULONG DataItemId,
[in] ULONG BufferSize,
[in] PUCHAR Buffer
)
{...}
[in] DeviceObject
指向驱动程序的 WDM DEVICE_OBJECT 结构的指针。
[in] Irp
指向 IRP 的指针。
[in] GuidIndex
通过在 传递给 WmiSystemControl的 WMILIB_CONTEXT 结构中提供的驱动程序提供的 GUID 列表中提供从零开始的索引来指定数据块。
[in] InstanceIndex
如果由 GuidIn dex 指定的块具有多个实例,则 InstanceIndex 是一个从零开始的值,用于指定实例。
[in] DataItemId
指定要设置的数据项的 ID。
[in] BufferSize
指定缓冲区 缓冲区的大小(以字节为单位)。
[in] Buffer
指向包含数据项新值的缓冲区的指针。
DpWmiSetDataItem 返回STATUS_SUCCESS或相应的错误代码,如下所示:
在驱动程序调用 WmiSystemControl 响应 IRP_MN_CHANGE_SINGLE_ITEM 请求后,WMI 调用驱动程序的 DpWmiSetDataItem 例程。
请勿实现 DpWmiSetDataItem,除非你确定系统提供的用户模式组件需要此功能。 如果实现 DpWmiSetDataItem 例程,驱动程序必须将例程的地址放在 SetWmiDataItemWMILIB_CONTEXT 结构的成员中,该结构传递给 WmiSystemControl。 如果不实现 DpWmiSetDataItem 例程,驱动程序必须将 setWmiDataItem 设置为 NULL。 在后一种情况下,WMI 将STATUS_READ_ONLY返回到调用方。
驱动程序负责验证所有输入参数。 具体而言,驱动程序必须执行以下作:
- 根据 WMILIB_CONTEXT 结构的 GuidCount 成员,验证 GuidIndex 值是否介于零和 GuidCount-1 之间。
- 验证驱动程序是否已标记指定的数据块以供删除。 如果驱动程序最近在 WMIGUIDREGINFO 中指定了WMIREG_FLAG_REMOVE_GUID标志 结构(包含在 WMILIB_CONTEXT 结构中),则设置请求可以在删除发生前到达。
- 验证 InstanceIndex 值是否在数据块驱动程序支持的实例索引范围内。
- 验证 DataItemId 值是否在数据块驱动程序支持的数据项标识符范围内。
- 验证 Buffer 和 BufferSize 描述有效大小的数据项,以及缓冲区的内容是否对数据项有效。
- 验证指定的数据项是否为驱动程序允许调用方发起的修改之一。 换句话说,驱动程序不应允许修改预期为只读的数据项。
此例程可以分页。
有关实现此例程的详细信息,请参阅 调用 WmiSystemControl 来处理 WMI IRP。
要求 | 价值 |
---|---|
目标平台 | 桌面 |
标头 | wmilib.h (包括 Wmilib.h) |
IRQL | 在PASSIVE_LEVEL调用。 |