Bagikan melalui


Fungsi EtwWrite (wdm.h)

Fungsi EtwWrite adalah fungsi pelacakan untuk menerbitkan peristiwa dalam kode driver mode kernel Anda.

Sintaksis

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

Parameter

[in] RegHandle

Penunjuk ke handel pendaftaran penyedia peristiwa, yang dikembalikan oleh fungsi EtwRegister jika pendaftaran penyedia peristiwa berhasil.

[in] EventDescriptor

Penunjuk ke struktur EVENT_DESCRIPTOR.

[in, optional] ActivityId

Pengidentifikasi yang menunjukkan aktivitas yang terkait dengan peristiwa. ActivityID menyediakan cara untuk mengelompokkan peristiwa terkait dan digunakan dalam pelacakan end-to-end.

[in] UserDataCount

Jumlah struktur EVENT_DATA_DESCRIPTOR di UserData.

[in, optional] UserData

Penunjuk ke array struktur EVENT_DATA_DESCRIPTOR.

Mengembalikan nilai

Jika peristiwa berhasil diterbitkan, EtwWrite mengembalikan STATUS_SUCCESS.

Jika penunjuk ke handel pendaftaran penyedia peristiwa tidak valid, EtwWrite mengembalikan STATUS_INVALID_HANDLE. Penyedia peristiwa harus didaftarkan sebelum EtwWrite dipanggil. EtwWrite juga dapat mengembalikan STATUS_INVALID_HANDLE jika tidak dapat mencatat peristiwa.

Jika jumlah struktur EVENT_DATA_DESCRIPTOR yang ditentukan dalam UserDataCount lebih besar dari maksimum yang diizinkan (128), EtwWrite mengembalikan STATUS_INVALID_PARAMETER.

Jika ActivityID ditentukan, tetapi tidak ada cukup memori yang tersedia untuk mencatat data yang terkait dengan peristiwa, EtwWrite mengembalikan STATUS_NO_MEMORY.

Jika penyedia tidak diaktifkan untuk sesi apa pun, EtwWrite mengembalikan STATUS_SUCCESS dan peristiwa tidak dicatat.

Peristiwa dapat hilang karena beberapa alasan; misalnya, jika tingkat peristiwa terlalu tinggi atau jika ukuran peristiwa lebih besar dari ukuran buffer. Dalam kasus ini, penghitung EventsLost, anggota struktur EVENT_TRACE_PROPERTIES untuk pencatat yang sesuai, diperbarui dengan jumlah peristiwa yang tidak direkam.

Komentar

Fungsi EtwWrite setara dengan mode pengguna fungsi EventWrite. Untuk memastikan bahwa ada konsumen untuk peristiwa yang Anda terbitkan, Anda dapat mendahului panggilan ke EtwWrite dengan panggilan ke EtwEventEnabled atau EtwProviderEnabled.

Sebelum Anda dapat memanggil fungsi EtwWrite untuk menerbitkan peristiwa, Anda harus mendaftarkan penyedia dengan EtwRegister. Tidak ada panggilan pelacakan yang harus dilakukan yang berada di luar kode yang dibatasi oleh EtwRegister dan fungsi EtwUnregister. Untuk performa terbaik, Anda dapat memanggil fungsi EtwRegister dalam rutinitas DriverEntry dan fungsi EtwUnregister dalam rutinitas DriverUnload Anda.

Jika Anda menggunakan parameter UserData opsional dalam fungsi Etwrite untuk mencatat data peristiwa tambahan, Anda dapat menggunakan makro EventDataDescreate untuk menyederhanakan pembuatan struktur EVENT_DATA_DESCRIPTOR. Contoh berikut menggunakan makro EventDataDescreate untuk menginisialisasi struktur EVENT_DATA_DESCRIPTOR dengan nama perangkat dan statusnya. Makro EventDataDescreate menyimpan pointer ke data (artinya, tidak menyimpan salinan data). Pointer harus tetap valid sampai panggilan ke EtwWrite kembali.

Anda dapat memanggil EtwWrite di IRQL apa pun. Namun, ketika IRQL lebih besar dari APC_LEVEL, data apa pun yang diteruskan ke EtwWrite, EtwWriteEx, EtwWriteString, fungsi EtwWriteTransfer tidak boleh dapat dipatuhi. Artinya, setiap rutinitas mode kernel yang berjalan di IRQL lebih besar dari APC_LEVEL tidak dapat mengakses memori yang dapat di-pageable. Data yang diteruskan ke EtwWrite, EtwriteEx, fungsi EtwWriteString, dan EtwWriteTransfer harus berada di memori ruang sistem, terlepas dari apa itu IRQL.

Contoh

 
 //
 // 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
    }              

//

Persyaratan

Syarat Nilai
Platform Target Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Tingkat apa pun (Lihat bagian Komentar.)

Lihat juga

EtwEventEnabled

EtwProviderEnabled

EtwRegister

EtwUnregister

EtwWriteEx

EtwriteString

EtwWriteTransfer

EventDataDescBuat