EventWriteEx 函式 (evntprov.h)

寫入具有活動識別碼、選擇性相關活動識別碼、會話篩選準則和特殊選項的 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 (中繼資料) ,包括識別碼、版本、層級、關鍵字、通道、Opcode 和工作。

重要

ProviderId、Level 和 Keyword 是篩選事件的主要方法。 其他類型的篩選是可行的,但額外負荷較高。 一律將非零層級和關鍵字指派給每個事件。

[in] Filter

64 位位元遮罩值。 每個設定位都表示此事件應該從特定的追蹤會話中排除。

Filter參數會與事件提供者搭配使用,這些提供者會根據EnableCallbackFilterData來執行自訂事件篩選。

如果您不支援自訂事件篩選,或事件應該寫入所有追蹤會話,請將 Filter 設定為零。 否則,請將 Filter 設定為不應該接收事件的會話識別碼的位 OR。

[in] Flags

[旗標 ] 設定為零,用於一般事件處理。

旗標 設定為特殊事件處理 EVENT_WRITE_FLAG 值的組合。

  • EVENT_WRITE_FLAG_INPRI加值稅E (0x2)

    表示此事件應該從已設定 EVENT_ENABLE_PROPERTY_EXCLUDE_INPRI加值稅E 選項的任何記錄器中排除。

[in, optional] ActivityId

此事件的 128 位活動識別碼選擇性指標。 如果這是非 Null, EventWriteEx 會針對事件的活動識別碼使用指定的值。 如果這是 Null, EventWriteEx 將會使用目前線程的活動識別碼。

追蹤處理工具可以使用事件的活動識別碼,將事件組織成稱為活動的群組。 如需活動識別碼的其他資訊,請參閱 EventActivityIdControl

[in, optional] RelatedActivityId

這個事件活動的父系 128 位活動識別碼的選擇性指標。 如果這是非 Null, EventWriteEx 將會針對事件的相關活動識別碼使用指定的值。 如果這是 Null,事件就不會有相關的活動識別碼。 相關的活動識別碼通常會在活動的 START 事件上設定, (以 Opcode = START) 記錄的第一個事件。

追蹤處理工具可以使用事件的相關活動識別碼來判斷活動之間的關聯性,例如相關活動是新啟動活動的父系。 如需相關活動識別碼的其他資訊,請參閱 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
程式庫 Advapi32.lib
DLL Advapi32.dll

另請參閱

EventActivityIdControl

EventRegister

EventWrite

EventWriteTransfer

撰寫以資訊清單為基礎的事件