WNODE_HEADER结构(wmistr.h)

WNODE_HEADER 结构是所有其他 WNODE_XXX 结构的第一个成员。 它包含所有此类结构通用的信息。

语法

typedef struct _WNODE_HEADER {
  ULONG BufferSize;
  ULONG ProviderId;
  union {
    ULONG64 HistoricalContext;
    struct {
      ULONG Version;
      ULONG Linkage;
    } DUMMYSTRUCTNAME;
  } DUMMYUNIONNAME;
  union {
    ULONG         CountLost;
    HANDLE        KernelHandle;
    LARGE_INTEGER TimeStamp;
  } DUMMYUNIONNAME2;
  GUID  Guid;
  ULONG ClientContext;
  ULONG Flags;
} WNODE_HEADER, *PWNODE_HEADER;

成员

BufferSize

此成员指定要返回的任何 WNODE_XXX 数据(包括此 WNODE_HEADER 结构、标志指示的类型 WNODE_XXX 结构的附加成员以及任何附带该结构的 WMI 或驱动程序确定的数据的非分页缓冲区的大小(以字节为单位)。

ProviderId

如果 标志 设置为WNODE_FLAG_EVENT_ITEM或WNODE_FLAG_EVENT_REFERENCE,ProviderId 应包含与设备对象关联的 WMI 提供程序的 ID。 可以通过调用 IoWMIDeviceObjectToProviderId来获取 ProviderId 值。 如果 标志 设置为任何其他值,则保留此成员。

DUMMYUNIONNAME

DUMMYUNIONNAME.HistoricalContext

此成员存储事件跟踪会话的句柄。

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.Version

此成员是为 WMI 保留的。

DUMMYUNIONNAME.DUMMYSTRUCTNAME.Linkage

此成员是为 WMI 保留的。

DUMMYUNIONNAME2

DUMMYUNIONNAME2.CountLost

保留

DUMMYUNIONNAME2.KernelHandle

此成员是为 WMI 保留的。

DUMMYUNIONNAME2.TimeStamp

此成员指示驱动程序收集 WNODE_XXX 数据的时间。 此时间值以绝对系统时间格式表示。 绝对系统时间是公历 1601 年初以来的 100 纳秒间隔数。 驱动程序可以调用 KeQuerySystemTime 来获取此值。 如果要将块写入日志文件(WNODE_FLAG_LOG_WNODE),NT 驱动程序也可能在 标志 中设置WNODE_FLAG_USE_TIMESTAMP,以请求系统记录器保留 TimeStamp 不变的值。

Guid

此成员指示表示要返回 WNODE_XXX 关联的数据块的 GUID。

ClientContext

此成员存储会话的时钟类型。 下表中包含可能的值。

价值 描述
1 性能计数器值(也称为 QPC、QueryPerformanceCounter 或 PerfCounter)
2 系统计时器
3 CPU 周期

Flags

此成员指示包含WNODE_HEADER结构的 WNODE_XXX 结构的类型:

WNODE_FLAG_ALL_DATA

WNODE_ALL_DATA 结构的其余部分遵循缓冲区中的 WNODE_HEADER 结构。

WMI 在 WNODE_HEADER 结构中设置此标志,该标志使用 IRP_MN_QUERY_ALL_DATA 请求传递。

驱动程序在事件 WNODE_HEADER 结构中设置此标志,该结构由数据块的所有实例组成。 如果所有实例的数据块大小相同,驱动程序也会设置WNODE_FLAG_FIXED_INSTANCE_SIZE。

WNODE_FLAG_EVENT_ITEM

驱动程序设置此标志以指示生成 WNODE_XXX 结构作为事件。 仅当还设置了WNODE_FLAG_ALL_DATA、WNODE_FLAG_SINGLE_INSTANCE或WNODE_FLAG_SINGLE_ITEM时,此标志才有效。

WNODE_FLAG_EVENT_REFERENCE

其余 WNODE_EVENT_REFERENCE 结构遵循缓冲区中的 WNODE_HEADER 结构。

驱动程序在生成大于事件注册表中指定的最大大小的事件时设置此标志。 WMI 使用 WNODE_EVENT_REFERENCE 结构中的信息来请求事件数据,并根据WNODE_FLAG_SEVERITY_MASK的值计划此类请求。

WNODE_FLAG_METHOD_ITEM

WNODE_METHOD_ITEM 结构的其余部分遵循缓冲区中的 WNODE_HEADER 结构。

WMI 在 WNODE_HEADER 结构中设置此标志,该标志使用 IRP_MN_EXECUTE_METHOD 请求传递。

WNODE_FLAG_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE 结构的其余部分遵循缓冲区中的 WNODE_HEADER 结构。

WMI 在 WNODE_HEADER 结构中设置此标志,该标志通过请求查询或更改实例。

驱动程序在由数据块的单个实例组成的事件 WNODE_HEADER 结构中设置此标志。

WNODE_FLAG_SINGLE_ITEM

WNODE_SINGLE_INSTANCE 结构的其余部分遵循缓冲区中的 WNODE_HEADER 结构。

WMI 在 WNODE_HEADER 结构中设置此标志,该标志通过请求更改项。

驱动程序在由单个数据项组成的事件的 WNODE_HEADER 结构中设置此标志。

WNODE_FLAG_TOO_SMALL

WNODE_TOO_SMALL 结构的其余部分遵循缓冲区中的 WNODE_HEADER 结构。

驱动程序在传递 WNODE_TOO_SMALL 结构时设置此标志,指示缓冲区太小,无法返回所有 WNODE_XXX 数据。

此外,可以使用以下一个或多个标志设置 标志,这些标志提供有关 WNODE_XXX的其他信息:

WNODE_FLAG_FIXED_INSTANCE_SIZE

数据块的所有实例的大小都相同。 仅当同时设置WNODE_FLAG_ALL_DATA时,此标志才有效。

WNODE_FLAG_INSTANCES_SAME

要返回的 WNODE_ALL_DATA 结构中的实例数和动态实例名称与从上一个 WNODE_ALL_DATA 查询返回的实例数相同。 仅当同时设置WNODE_FLAG_ALL_DATA时,此标志才有效。 对于使用静态实例名称注册的数据块,将忽略此标志。

为了优化性能,如果驱动程序可以跟踪对其数据块的数量或名称的更改,驱动程序应设置此标志。 然后,WMI 可以跳过检测和更新动态实例名称所需的处理。

WNODE_FLAG_STATIC_INSTANCE_NAMES

要返回 WNODE_XXX 数据不包括实例名称。

WMI 在请求 WNODE_XXX 使用静态实例名称注册的数据块之前设置此标志。 从驱动程序接收返回的 WNODE_XXX 后,WMI 会在注册时填写在注册中指定的静态实例名称,然后再将返回 WNODE_XXX 传递给数据使用者。

WNODE_FLAG_PDO_INSTANCE_NAMES

静态实例名称基于设备的 PDO 的设备实例 ID。 驱动程序通过在 WMIREGGUID 中设置WMIREG_FLAG_INSTANCE_PDO来请求此类名称, 它用于注册块。

WMI 在请求 WNODE_XXX 数据块(使用基于 PDO 的实例名称注册的数据块)之前设置此标志。

WNODE_FLAG_SEVERITY_MASK

与返回的 WNODE_EVENT_REFERENCE关联的事件的驱动程序确定严重级别,0x00指示最严重且指示最严重级别的0xff。

WMI 使用此标志的值来确定事件数据请求的优先级。

WNODE_FLAG_USE_TIMESTAMP

系统记录器不应修改驱动程序设置的 TimeStamp 的值。

NT 驱动程序还可以将 标志 设置为以下一个或多个值,以便将事件块写入系统日志文件:

WNODE_FLAG_LOG_WNODE

事件块将发送到系统记录器。 事件标头是标准 WNODE_HEADER 结构。 如果驱动程序清除WNODE_FLAG_TRACED_GUID,该块也会发送到 WMI,以便传递给已启用该事件的任何数据使用者。 驱动程序必须从池内存中分配 WNODE_XXX。 WMI 将事件传送到数据使用者后释放内存。

WNODE_FLAG_TRACED_GUID

事件块仅发送到系统记录器。 它不会发送到 WMI 数据使用者。 事件标头是在 evntrace.h 中声明的 EVENT_TRACE_HEADER 结构,而不是 WNODE_HEADER。 驱动程序必须为 WNODE_XXX 分配内存,并在 IoWMIWriteEvent 返回后释放内存。 如果驱动程序创建和维护自己的线程池,驱动程序可以从驱动程序的线程本地存储中分配和释放内存的开销,驱动程序可以从堆栈分配和释放此类内存。

WNODE_FLAG_USE_GUID_PTR

Guid 成员指向内存中的 GUID,而不是包含 GUID 本身。 系统记录器在将数据传递给使用者之前取消引用指针。 仅当同时设置了WNODE_FLAG_LOG_WNODE或WNODE_FLAG_TRACED_GUID时,此标志才有效。

WNODE_FLAG_USE_MOF_PTR

遵循 WNODE_XXX 结构的固定成员的数据由一组在 Evntrace.h 中定义的MOF_FIELD结构构成,其中包含指向数据和大小的指针,而不是数据本身。 该数组最多可以包含MAX_MOF_FIELD个元素。 系统记录器在将数据传递给使用者之前取消引用指针。此标志仅对注册WMIREG_FLAG_TRACED_GUID的块有效。

言论

IRP_MN_CHANGE_XXXIRP_MN_EXECUTE_METHOD 请求中,IRP 中的 BufferSize 指示输出缓冲区的最大大小(以字节为单位),而此类请求的输入 WNODE_HEADERBufferSize 表示缓冲区中输入数据的大小(以字节为单位)。

要求

要求 价值
标头 wmistr.h (包括 Wmistr.h)

另请参阅

IoWMIDeviceObjectToProviderId

IoWMIWriteEvent

KeQuerySystemTime

WNODE_ALL_DATA

WNODE_EVENT_ITEM

WNODE_EVENT_REFERENCE

WNODE_METHOD_ITEM

WNODE_SINGLE_INSTANCE

WNODE_SINGLE_ITEM

WNODE_TOO_SMALL