共用方式為


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 函式是與使用者模式 EventWrite 函式相等的核心模式。 若要確保您發行的事件有取用者,您可以在呼叫 EtwWrite 之前呼叫 EtwEventEnabledEtwProviderEnabled

您必須先向 EtwRegister 註冊提供者,才能呼叫 EtwWrite 函式來發佈事件。 應該不會進行任何追蹤呼叫,其落在 EtwRegisterEtwUnregister 函式所系結的程式代碼之外。 為了獲得最佳效能,您可以在 DriverEntry 例程中呼叫 EtwRegister 函式和 DriverUnload 例程中的 EtwUnregister 函式。

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

您可以在任何 IRQL 呼叫 EtwWrite 。 不過,當 IRQL 大於APC_LEVEL時,傳遞至 EtwWriteEtwWriteEx、EtwWriteStringEtwWriteTransfer 函式的任何數據都不得分頁。 也就是說,在 IRQL 上執行的任何核心模式例程大於APC_LEVEL都無法存取可分頁的記憶體。 傳遞至 EtwWrite、EtwWriteExEtwWriteStringEtwWriteTransfer 函式的數據必須位於系統空間記憶體中,不論 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
    }              

//

規格需求

需求
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL 任何層級 (請參閱批注一節。)

另請參閱

EtwEventEnabled

EtwProviderEnabled

EtwRegister

EtwUnregister

EtwWriteEx

EtwWriteString

EtwWriteTransfer

EventDataDescCreate