Bagikan melalui


struktur WNODE_HEADER

Struktur WNODE_HEADER adalah anggota struktur EVENT_TRACE_PROPERTIES .

Sintaks

typedef struct _WNODE_HEADER {
  ULONG BufferSize;
  ULONG ProviderId;
  union {
    ULONG64 HistoricalContext;
    struct {
      ULONG Version;
      ULONG Linkage;
    };
  };
  union {
    HANDLE        KernelHandle;
    LARGE_INTEGER TimeStamp;
  };
  GUID  Guid;
  ULONG ClientContext;
  ULONG Flags;
} WNODE_HEADER, *PWNODE_HEADER;

Anggota

BufferSize

Ukuran total memori yang dialokasikan, dalam byte, untuk properti sesi pelacakan peristiwa. Ukuran memori harus menyertakan ruang untuk struktur EVENT_TRACE_PROPERTIES ditambah string nama sesi dan string nama file log yang mengikuti struktur dalam memori.

ProviderId

Dicadangkan untuk penggunaan internal.

HistorisKonteks

Pada output, handel ke sesi pelacakan peristiwa.

Versi

Dicadangkan untuk penggunaan internal.

Linkage

Dicadangkan untuk penggunaan internal.

KernelHandle

Dicadangkan untuk penggunaan internal.

Timestamp

Waktu di mana informasi dalam struktur ini diperbarui, dalam interval 100 nanodetik sejak tengah malam, 1 Januari 1601.

Guid

GUID yang Anda tentukan untuk sesi tersebut.

Untuk sesi NT Kernel Logger, atur anggota ini ke SystemTraceControlGuid.

Jika anggota ini diatur ke SystemTraceControlGuid atau GlobalLoggerGuid, pencatat akan menjadi pencatat sistem.

Untuk sesi pencatat privat, atur anggota ini ke GUID penyedia yang akan Anda aktifkan untuk sesi tersebut.

Jika Anda memulai sesi yang bukan pencatat kernel atau sesi pencatat privat, Anda tidak perlu menentukan GUID sesi. Jika Anda tidak menentukan GUID, ETW akan membuatnya untuk Anda. Anda perlu menentukan GUID sesi hanya jika Anda ingin mengubah izin default yang terkait dengan sesi tertentu. Untuk detailnya, lihat fungsi EventAccessControl.

Anda tidak dapat memulai lebih dari satu sesi dengan GUID sesi yang sama.

Sebelum Windows Vista: Anda dapat memulai lebih dari satu sesi dengan GUID sesi yang sama.

ClientContext

Resolusi jam yang digunakan saat mencatat stempel waktu untuk setiap peristiwa. Defaultnya adalah Penghitung kinerja kueri (QPC).

Sebelum Windows Vista: Defaultnya adalah waktu sistem.

Sebelum Windows 10, versi 1703: Tidak lebih dari 2 jenis jam yang berbeda dapat digunakan secara bersamaan oleh pencatat sistem apa pun.

Dimulai dengan Windows 10, versi 1703: Pembatasan jenis jam telah dihapus. Ketiga jenis jam sekarang dapat digunakan secara bersamaan oleh pencatat sistem.

Anda bisa menentukan salah satu nilai berikut ini.

Nilai Makna
1
Penghitung kinerja kueri (QPC). Penghitung QPC menyediakan stempel waktu resolusi tinggi yang tidak terpengaruh oleh penyesuaian pada jam sistem. Stempel waktu yang disimpan dalam peristiwa setara dengan nilai yang dikembalikan dari API QueryPerformanceCounter. Untuk informasi selengkapnya tentang karakteristik stempel waktu ini, lihat Memperoleh stempel waktu resolusi tinggi.
Anda harus menggunakan resolusi ini jika Anda memiliki tingkat peristiwa yang tinggi atau jika konsumen menggabungkan peristiwa dari buffer yang berbeda. Dalam kasus ini, presisi dan stabilitas stempel waktu QPC memungkinkan akurasi yang lebih baik dalam mengurutkan peristiwa dari buffer yang berbeda. Namun, stempel waktu QPC tidak akan mencerminkan pembaruan pada jam sistem, misalnya jika jam sistem disesuaikan ke depan karena sinkronisasi dengan server NTP saat jejak sedang berlangsung, stempel waktu QPC dalam jejak akan terus mencerminkan waktu seolah-olah tidak ada pembaruan yang terjadi.
Untuk menentukan resolusi, gunakan anggota PerfFreqdari TRACE_LOGFILE_HEADER saat mengkonsumsi peristiwa.
Untuk mengonversi stempel waktu peristiwa menjadi 100-ns unit, gunakan rumus konversi berikut:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 10000000.0 / logfileHeader.PerfFreq.QuadPart
Perhatikan bahwa pada komputer yang lebih lama, stempel waktu mungkin tidak akurat karena penghitung terkadang melompat ke depan karena kesalahan perangkat keras.
2
Waktu sistem. Waktu sistem menyediakan stempel waktu yang melacak perubahan pada jam sistem, misalnya jika jam sistem disesuaikan ke depan karena sinkronisasi dengan server NTP saat jejak sedang berlangsung, stempel waktu Waktu Sistem dalam jejak juga akan melompat ke depan untuk mencocokkan pengaturan baru jam sistem.
  • Pada sistem sebelum Windows 10, stempel waktu yang disimpan dalam peristiwa setara dengan nilai yang dikembalikan dari GetSystemTimeAsFileTime API.
  • Pada Windows 10 atau yang lebih baru, stempel waktu yang disimpan dalam peristiwa setara dengan nilai yang dikembalikan dari GetSystemTimePreciseAsFileTime API.
Sebelum Windows 10, resolusi stempel waktu ini adalah resolusi tanda jam sistem, seperti yang ditunjukkan oleh anggota TimerResolution TRACE_LOGFILE_HEADER. Dimulai dengan Windows 10, resolusi stempel waktu ini adalah resolusi penghitung kinerja, seperti yang ditunjukkan oleh anggota PerfFreq dari TRACE_LOGFILE_HEADER.
Untuk mengonversi stempel waktu peristiwa menjadi 100-ns unit, gunakan rumus konversi berikut:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Perhatikan bahwa ketika peristiwa ditangkap pada sistem yang menjalankan OS sebelum Windows 10, jika volume peristiwa tinggi, resolusi untuk waktu sistem mungkin tidak cukup baik untuk menentukan urutan peristiwa. Dalam hal ini, serangkaian peristiwa akan memiliki stempel waktu yang sama, tetapi urutan di mana ETW mengirimkan peristiwa mungkin tidak benar. Dimulai dengan Windows 10, stempel waktu ditangkap dengan presisi tambahan, meskipun beberapa ketidakstabilan mungkin masih terjadi dalam kasus di mana jam sistem disesuaikan saat jejak sedang ditangkap.
3
Penghitung siklus CPU. Penghitung CPU menyediakan stempel waktu resolusi tertinggi dan merupakan sumber daya yang paling tidak intensif untuk diambil. Namun, penghitung CPU tidak dapat diandalkan dan tidak boleh digunakan dalam produksi. Misalnya, pada beberapa komputer, timer akan mengubah frekuensi karena perubahan termal dan daya, selain berhenti di beberapa status.
Untuk menentukan resolusi, gunakan anggota CpuSpeedInMHzdari TRACE_LOGFILE_HEADER saat mengkonsumsi peristiwa.
Jika perangkat keras Anda tidak mendukung tipe jam ini, ETW menggunakan waktu sistem.
Windows Server 2003, Windows XP dengan SP1 dan Windows XP: Nilai ini tidak didukung, diperkenalkan di Windows Server 2003 dengan SP1 dan Windows XP dengan SP2.

 

Windows 2000: Anggota ClientContext tidak didukung.

Bendera

Harus berisi WNODE_FLAG_TRACED_GUID untuk menunjukkan bahwa struktur berisi informasi pelacakan peristiwa.

Keterangan

Pastikan untuk menginisialisasi memori untuk struktur ini ke nol sebelum mengatur anggota mana pun.

Untuk mengonversi tanda waktu ETW menjadi FILETIME, gunakan prosedur berikut:

1. Untuk setiap sesi atau file log yang sedang diproses (yaitu untuk setiap EVENT\_TRACE\_LOGFILE), periksa bidang logFile.ProcessTraceMode untuk menentukan apakah bendera PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP diatur. Secara default, bendera ini tidak diatur. Jika bendera ini tidak diatur, runtime ETW akan secara otomatis mengonversi tanda waktu setiap EVENT\_RECORD menjadi FILETIME sebelum mengirim EVENT\_RECORD ke fungsi EventRecordCallback Anda, sehingga tidak diperlukan pemrosesan tambahan. Langkah-langkah berikut hanya boleh digunakan jika jejak sedang diproses dengan set bendera PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP. 2. Untuk setiap sesi atau file log yang sedang diproses (yaitu untuk setiap EVENT\_TRACE\_LOGFILE), periksa bidang logFile.LogfileHeader.ReservedFlags untuk menentukan skala stempel waktu untuk file log. Berdasarkan nilai ReservedFlags, ikuti salah satu langkah berikut untuk menentukan nilai yang akan digunakan untuk timeStampScale di langkah-langkah yang tersisa:
a. Jika ReservedFlags == 1 (QPC): DOUBLE timeStampScale = 10000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. Jika ReservedFlags == 2 (Waktu sistem): DOUBLE timeStampScale = 1.0; Perhatikan bahwa langkah-langkah yang tersisa tidak perlu untuk peristiwa yang menggunakan waktu sistem, karena peristiwa sudah memberikan stempel waktunya di unit FILETIME. Langkah-langkah yang tersisa akan berfungsi tetapi tidak perlu dan akan menimbulkan kesalahan pembulatan kecil. c. Jika ReservedFlags == 3 (penghitung siklus CPU): DOUBLE timeStampScale = 10.0 / logFile.LogfileHeader.CpuSpeedInMHz;
3. Pada panggilan PERTAMA ke fungsi EventRecordCallback Anda untuk file log tertentu, gunakan data dari logFile (EVENT\_TRACE\_LOGFILE) dan dari eventRecord (EVENT\_RECORD) untuk menghitung timeStampBase yang akan digunakan untuk peristiwa yang tersisa dalam file log: IN TimeStampBaseT64 = logFile.LogfileHeader.StartTime.QuadPart - (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart); 4. Untuk setiap eventRecord (EVENT\_RECORD), konversikan tanda waktu peristiwa menjadi FILETIME sebagai berikut, menggunakan nilai timeStampScale dan timeStampBase yang dihitung dalam langkah 2 dan 3: INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung
Windows 2000 Professional [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung
Windows 2000 Server [aplikasi desktop | Aplikasi UWP]
Header
Wmistr.h

Lihat juga

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER