共用方式為


EtwWrite 函式 (wdm.h)

EtwWrite 函式是一個追蹤函式,可用於在內核模式驅動程式程式代碼中發佈事件。

語法

NTSTATUS EtwWrite(
  [in]           REGHANDLE              RegHandle,
  [in]           PCEVENT_DESCRIPTOR     EventDescriptor,
  [in, optional] LPCGUID                ActivityId,
  [in]           ULONG                  UserDataCount,
  [in, optional] PEVENT_DATA_DESCRIPTOR UserData
);

參數

[in] RegHandle

事件提供者註冊句柄的指標,如果事件提供者註冊成功,則由 EtwRegister 函式傳回。

[in] EventDescriptor

EVENT_DESCRIPTOR 結構的指標。

[in, optional] ActivityId

標識符,表示與事件相關聯的活動。 ActivityID 提供將相關事件分組的方式,並用於端對端追蹤。

[in] UserDataCount

UserData中的EVENT_DATA_DESCRIPTOR結構數目。

[in, optional] UserData

EVENT_DATA_DESCRIPTOR 結構的陣列指標。

傳回值

如果成功發行事件,EtwWrite 會傳回STATUS_SUCCESS。

如果事件提供者註冊句柄的指標無效,EtwWrite 傳回STATUS_INVALID_HANDLE。 呼叫 EtwWrite 之前,必須先註冊事件提供者。 EtwWrite 如果無法記錄事件,也可以傳回STATUS_INVALID_HANDLE。

如果 UserDataCount 中指定的EVENT_DATA_DESCRIPTOR結構數目大於允許的最大值 (128),EtwWrite 會傳回STATUS_INVALID_PARAMETER。

如果指定 ActivityID,但記憶體不足,無法記錄與事件相關聯的數據,EtwWrite 會傳回STATUS_NO_MEMORY。

如果未啟用任何會話的提供者,EtwWrite 會傳回STATUS_SUCCESS,而且不會記錄事件。

事件可能會因為數個原因而遺失;例如,如果事件速率太高,或事件大小大於緩衝區大小,則為 。 在這些情況下,EventsLost 計數器,對應記錄器之EVENT_TRACE_PROPERTIES結構的成員,會更新未記錄的事件數目。

言論

EtwWrite 函式是相當於 user-mode EventWrite 函式的核心模式。 若要確保您發行的事件有取用者,您可以在呼叫 EtwWrite 之前呼叫 EtwEventEnabledEtwProviderEnabled呼叫。

您必須先 向 etwRegister註冊提供者,才能呼叫 EtwWrite 函式來發佈事件。 不應該呼叫落在由 EtwRegister 系結的程式代碼之外,EtwUnregister 函式。 為了獲得最佳效能,您可以在 DriverEntry 例程中呼叫 EtwRegister 函式,並在 DriverUnload 例程中呼叫 EtwUnregister 函式。

如果您使用 EtwWrite 函式中的選擇性 UserData 參數來記錄其他事件數據,您可以使用 EventDataDescCreate 巨集來簡化EVENT_DATA_DESCRIPTOR結構的建立。 下列範例會使用 EventDataDescCreate 巨集,以裝置名稱及其狀態初始化EVENT_DATA_DESCRIPTOR結構。 EventDataDescCreate 巨集會儲存數據的指標(也就是說,它不會儲存數據的複本)。 指標必須維持有效狀態,直到呼叫 EtwWrite 傳回為止。

您可以在任何 IRQL 呼叫 EtwWrite。 不過,當 IRQL 大於APC_LEVEL時,任何傳遞至 EtwWriteEtwWriteExEtwWriteStringEtwWriteTransfer 函式的數據都不得分頁。 也就是說,在 IRQL 上執行且大於 APC_LEVEL 的任何內核模式例程都無法存取可分頁記憶體。 傳遞至 EtwWriteEtwWriteExEtwWriteString的數據,以及 EtwWriteTransfer 函式必須位於系統空間記憶體中,不論 IRQL 是什麼。

 
 //
 // Register the provider with ETW in DriverEntry
 // Unregister the provider in DriverUnload 
    //
 //  Build the EVENT_DATA_DESCRIPTOR structures using 
 //   the EventDataDescCreate macros 
 
 if (RegHandle != (REGHANDLE)NULL) {
 //
 // Log an Event with : DeviceNameLength
 //                      DeviceName
 //                      Status
 //
 
 EventDataDescCreate(&EventDataDescriptor[0],
                            (PVOID)&DeviceName.Length,
 sizeof(USHORT));
 

 EventDataDescCreate(&EventDataDescriptor[1],
                            (PVOID)DeviceName.Buffer,
 DeviceName.Length);
 
 EventDataDescCreate(&EventDataDescriptor[2],
                            (PVOID)&Status,
 sizeof(ULONG));
 
 EtwWrite(RegHandle,            // Handle from EtwRegister
                 &StartEvent,          // EventDescriptor
                 NULL,                 // Activity ID
                 3,                    // Number of data items
 EventDataDescriptor); // Array of data descriptors
    }              

//

要求

要求 價值
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、 Ntddk.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 任何層級 (請參閱批注一節。

另請參閱

EtwEventEnabled

EtwProviderEnabled

EtwRegister

EtwUnregister

EtwWriteEx

EtwWriteString

EtwWriteTransfer

EventDataDescCreate