提供程序特征

提供程序特征是一种将更多数据附加到单个提供程序注册的方法。 它们可用于基于清单的提供程序或 TraceLogging 提供程序。 目前,这包括支持将提供程序名称和/或提供程序组添加到单个提供程序注册。 将来可能会添加更多特征类型。 此信息以设置格式的二进制 Blob 的形式存储在内核中。

对于注册,特征只能设置一次。 在注册上设置特征的任何进一步尝试都将失败。

若要在基于清单的提供程序上设置提供程序特征,请使用 EventProviderSetTraits 信息类调用 EventSetInformation 函数。 EventInformation 缓冲区应包含以下格式的二进制 Blob:

{
   UINT16 TraitsSize   // Total size of the traits including this field
   CHAR[] ProviderName // Null terminated utf-8 provider name
   TRAIT[] Traits      // Zero or more individual traits
}

各个特征应采用以下格式:

TRAIT {
      UINT16 TraitSize // Size of this individual trait including this field
      UINT8 Type       // ETW_PROVIDER_TRAIT_TYPE
      BYTE[] Data
      }

从单个特征中,ETW_PROVIDER_TRAIT_TYPE定义为:

typedef enum {
    EtwProviderTraitTypeGroup = 1,
    EtwProviderTraitTypeMax
} ETW_PROVIDER_TRAIT_TYPE;

调用 TraceLoggingRegister 函数时, TraceLogging 提供程序会自动设置提供程序特征。 TraceLogging 提供程序的名称将始终包含在其特征中。 可以使用提供程序定义中的 TraceLoggingOptionGroup 宏在 TraceLogging 提供程序上设置组。

自定义特征

尽管 255 种可能的特征类型中的大多数尚未定义,但特征类型 1-127 保留供 Microsoft 定义。 其余较高的索引类型值可由外部开发人员根据需要使用。 考虑将自己的自定义特征添加到其提供程序的任何人都应尝试将其总特征大小保持在 256 字节以下,原因如下:

  • 特征包含在为提供程序编写的每个事件中。 较大的特征可能会导致日志文件非常大。
  • 在提供程序的生存期内,特征存储在非分页内核池中。

提供程序组

提供程序组是 GUID 定义的可控制实体,非常类似于提供程序本身。 主要区别在于,虽然提供程序 GUID 用于仅控制其提供程序的注册,但组将控制其所有成员注册。 例如,启用具有给定关键字 (keyword) 和级别的提供程序组将启用具有该关键字 (keyword) 和级别的所有组成员注册。

组成员身份可能受权限限制。 如果 EventSetInformation 的调用方无权加入指定的组,则成员身份将被拒绝。

在某些情况下,跟踪会话控制器可能希望从对组的启用中排除一些提供程序。 这可以通过设置禁止列表来完成。 禁止列表是基于单个日志记录会话的组设置不会启用的提供程序 GUID 列表。 可以使用 TraceSetInformation 和 TraceSetDisallowList 信息类动态更改不允许列表。

虽然大多数启用操作可以采用与单个提供程序类似的方式对提供程序组执行,但也有一些例外。 不支持的情况如下:

  • 提供程序组不能由专用跟踪会话控制。
  • 事件名称、事件 ID 和有效负载筛选器不适用于提供程序组,因为它们假定单个提供程序的特定信息。