EventWriteEx 函数 (evntprov.h)

写入具有活动 ID、可选相关活动 ID、会话筛选器和特殊选项的 ETW 事件。

语法

ULONG EVNTAPI EventWriteEx(
  [in]           REGHANDLE              RegHandle,
  [in]           PCEVENT_DESCRIPTOR     EventDescriptor,
  [in]           ULONG64                Filter,
  [in]           ULONG                  Flags,
  [in, optional] LPCGUID                ActivityId,
  [in, optional] LPCGUID                RelatedActivityId,
  [in]           ULONG                  UserDataCount,
  [in, optional] PEVENT_DATA_DESCRIPTOR UserData
);

参数

[in] RegHandle

提供程序的注册句柄。 句柄来自 EventRegister。 生成的事件将使用与句柄关联的 ProviderId。

[in] EventDescriptor

EVENT_DESCRIPTOR 事件信息 (元数据) 包括 ID、版本、级别、关键字、通道、操作码和任务。

重要

ProviderId、Level 和 Keyword 是筛选事件的主要方法。 其他类型的筛选是可能的,但开销要高得多。 始终为每个事件分配非零级别和关键字 (keyword) 。

[in] Filter

64 位位掩码值。 每个设置位指示应从特定的跟踪会话中排除此事件。

Filter 参数用于基于 EnableCallback 中的 FilterData 执行自定义事件筛选的事件提供程序。

如果不支持自定义事件筛选器,或者应将事件写入所有跟踪会话,请将 Filter 设置为零。 否则,请将 Filter 设置为不应接收事件的会话标识符的按位 OR。

[in] Flags

标志 设置为零,以便正常处理事件。

Flags 设置为用于特殊事件处理的 EVENT_WRITE_FLAG 值的组合。

  • EVENT_WRITE_FLAG_INPRIVATE (0x2)

    指示应将此事件从已设置 EVENT_ENABLE_PROPERTY_EXCLUDE_INPRIVATE 选项的任何记录器中排除。

[in, optional] ActivityId

指向此事件的 128 位活动 ID 的可选指针。 如果这是非 NULL, 则 EventWriteEx 将为事件的活动 ID 使用指定的值。 如果为 NULL,EventWriteEx 将使用当前线程的活动 ID。

跟踪处理工具可以使用事件的活动 ID 将事件组织成称为活动的组。 有关活动 ID 的其他信息,请参阅 EventActivityIdControl

[in, optional] RelatedActivityId

指向作为此事件活动的父级的 128 位活动 ID 的可选指针。 如果这是非 NULL, 则 EventWriteEx 将为事件的相关活动 ID 使用指定的值。 如果为 NULL,则事件将没有相关的活动 ID。 相关活动 ID 通常在活动的 START 事件 (活动的第一个事件上设置,记录为 Opcode = START) 。

跟踪处理工具可以使用事件的相关活动 ID 来确定活动之间的关系,例如,相关活动是新启动活动的父活动。 有关相关活动 ID 的其他信息,请参阅 EventActivityIdControl

[in] UserDataCount

UserData 中的EVENT_DATA_DESCRIPTOR结构数。 最大数目为 128。

[in, optional] UserData

UserDataCount的数组EVENT_DATA_DESCRIPTOR描述事件中要包含的数据的结构。 如果 UserDataCount 为零,UserData 可能为 NULL

每个 EVENT_DATA_DESCRIPTOR 描述要包含在事件中的一个内存块。 指定的块将按没有填充或对齐的顺序连接,以形成事件内容。 如果使用基于清单的解码,则事件内容必须与与清单中的事件关联的模板中指定的布局匹配。

返回值

如果成功或返回错误代码,则返回 ERROR_SUCCESS 。 可能的错误代码包括:

  • ERROR_INVALID_PARAMETER:一个或多个参数无效。
  • ERROR_INVALID_HANDLE:提供程序的注册句柄无效。
  • ERROR_ARITHMETIC_OVERFLOW:事件大小大于允许的最大 (64KB - 标头) 。
  • ERROR_MORE_DATA:会话缓冲区大小对于事件来说太小。
  • ERROR_NOT_ENOUGH_MEMORY:当已填充缓冲区尝试刷新到磁盘,但磁盘 IO 发生速度不够快时发生。 当磁盘速度缓慢且事件流量过大时,会发生这种情况。 最终,不再有空 () 缓冲区,事件将被删除。
  • STATUS_LOG_FILE_FULL:实时播放文件已满。 在实时使用者使用播放文件中的事件之前,事件不会记录到会话中。

错误代码主要用于调试和诊断方案。 即使无法编写 ETW 事件,大多数生产代码也应继续运行并继续报告事件,因此发布版本通常应忽略错误代码。

注解

大多数事件提供程序不会直接调用 EventWriteEx 。 相反,大多数事件提供程序都是使用 ETW 框架实现的,该框架包装对 EventRegisterEventWriteExEventUnregister 的调用。 例如,可以 编写事件清单 ,然后使用 消息编译器 为事件生成 C/C++ 代码,或者使用 TraceLogging 来避免需要清单。

EventWriteEx 将根据 RegHandle) 、Level、Keyword 和其他事件特征确定的 ProviderId (将事件路由到相应的跟踪会话。 如果没有跟踪会话正在记录此事件,此函数将不执行任何操作并返回 ERROR_SUCCESS

若要降低未由任何跟踪会话记录的事件的性能影响,可以调用 EventEnabled 以确定是否有任何跟踪会话正在记录事件,然后再准备数据和调用 EventWriteEx

提供程序可以定义会话用于根据事件数据筛选事件的筛选器。 核心筛选器基于级别和关键字。 事件提供程序可以支持更复杂的筛选器。 事件提供程序可以从 EnableCallbackFilterData 参数接收筛选器信息。 提供程序可以评估筛选器并使用 EventWriteExFilter 参数来指示某些跟踪会话未通过筛选器,因此不应接收事件。

要求

要求
最低受支持的客户端 Windows 7 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008 R2 [桌面应用 |UWP 应用]
目标平台 Windows
标头 evntprov.h
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

EventActivityIdControl

EventRegister

EventWrite

EventWriteTransfer

编写基于清单的事件