Share via


struttura WNODE_HEADER

La struttura WNODE_HEADER è un membro della struttura EVENT_TRACE_PROPERTIES .

Sintassi

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;

Members

BufferSize

Dimensioni totali della memoria allocata, in byte, per le proprietà della sessione di traccia eventi. Le dimensioni della memoria devono includere la stanza per la struttura EVENT_TRACE_PROPERTIES più la stringa del nome sessione e la stringa del nome del file di log che seguono la struttura in memoria.

ProviderId

Riservato per utilizzo interno.

HistoricalContext

Nell'output l'handle per la sessione di traccia eventi.

Versione

Riservato per utilizzo interno.

Collegamento

Riservato per utilizzo interno.

KernelHandle

Riservato per utilizzo interno.

Timestamp

Ora in cui le informazioni in questa struttura sono state aggiornate, in intervalli di 100 nanosecondi dalla mezzanotte del 1° gennaio 1601.

Guid

GUID definito per la sessione.

Per una sessione del Logger del kernel NT, impostare questo membro su SystemTraceControlGuid.

Se questo membro è impostato su SystemTraceControlGuid o GlobalLoggerGuid, il logger sarà un logger di sistema.

Per una sessione del logger privato, impostare questo membro sul GUID del provider che si intende abilitare per la sessione.

Se si avvia una sessione che non è un logger del kernel o una sessione di logger privato, non è necessario specificare un GUID di sessione. Se non si specifica un GUID, ETW ne crea uno automaticamente. È necessario specificare un GUID di sessione solo se si desidera modificare le autorizzazioni predefinite associate a una sessione specifica. Per informazioni dettagliate, vedere la funzione EventAccessControl.

Non è possibile avviare più di una sessione con lo stesso GUID di sessione.

Prima di Windows Vista: È possibile avviare più sessioni con lo stesso GUID di sessione.

ClientContext

Risoluzione dell'orologio da usare durante la registrazione del timestamp per ogni evento. Il valore predefinito è Query Performance Counter (QPC).

Prima di Windows Vista: Il valore predefinito è l'ora di sistema.

Prima di Windows 10, versione 1703: non più di 2 tipi di clock distinti possono essere usati contemporaneamente da qualsiasi logger di sistema.

A partire da Windows 10 versione 1703: la restrizione del tipo di orologio è stata rimossa. Tutti e tre i tipi di orologio possono ora essere usati contemporaneamente dai logger di sistema.

È possibile specificare uno dei valori seguenti.

Valore Significato
1
Contatore delle prestazioni delle query (QPC). Il contatore QPC fornisce un timestamp ad alta risoluzione che non è interessato dalle modifiche apportate all'orologio di sistema. Il timestamp archiviato nell'evento equivale al valore restituito dall'API QueryPerformanceCounter. Per altre informazioni sulle caratteristiche di questo timestamp, vedere Acquisizione di timestamp ad alta risoluzione.
È consigliabile usare questa risoluzione se si dispone di frequenze di eventi elevate o se il consumer unisce eventi da buffer diversi. In questi casi, la precisione e la stabilità del timestamp QPC consentono una migliore accuratezza nell'ordinamento degli eventi da buffer diversi. Tuttavia, il timestamp QPC non rifletterà gli aggiornamenti dell'orologio di sistema, ad esempio se l'orologio di sistema viene modificato in avanti a causa della sincronizzazione con un server NTP mentre la traccia è in corso, i timestamp QPC nella traccia continueranno a riflettere l'ora come se non si fosse verificato alcun aggiornamento.
Per determinare la risoluzione, usare il membro PerfFreq di TRACE_LOGFILE_HEADER quando si utilizza l'evento.
Per convertire il timestamp di un evento in 100-ns unità, usare la formula di conversione seguente:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 10000000.0 / logfileHeader.PerfFreq.QuadPart
Si noti che nei computer meno recenti, il timestamp potrebbe non essere accurato perché il contatore a volte salta in avanti a causa di errori hardware.
2
Ora di sistema. L'ora di sistema fornisce un timestamp che tiene traccia delle modifiche apportate all'orologio del sistema, ad esempio se l'orologio di sistema viene modificato in avanti a causa della sincronizzazione con un server NTP mentre la traccia è in corso, anche i timestamp dell'ora di sistema nella traccia salteranno in avanti per corrispondere alla nuova impostazione dell'orologio di sistema.
  • Nei sistemi precedenti a Windows 10, il timestamp archiviato nell'evento equivale al valore restituito dall'API GetSystemTimeAsFileTime.
  • In Windows 10 o versione successiva, il timestamp archiviato nell'evento equivale al valore restituito dall'API GetSystemTimePreciseAsFileTime.
Prima di Windows 10, la risoluzione di questo timestamp era la risoluzione di un tick dell'orologio di sistema, come indicato dal membro TimerResolution di TRACE_LOGFILE_HEADER. A partire da Windows 10, la risoluzione di questo timestamp è la risoluzione del contatore delle prestazioni, come indicato dal membro PerfFreq di TRACE_LOGFILE_HEADER.
Per convertire il timestamp di un evento in 100-ns unità, usare la formula di conversione seguente:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Si noti che quando gli eventi vengono acquisiti in un sistema che esegue un sistema operativo prima di Windows 10, se il volume di eventi è elevato, la risoluzione per il tempo di sistema potrebbe non essere sufficiente per determinare la sequenza di eventi. In questo caso, un set di eventi avrà lo stesso timestamp, ma l'ordine in cui ETW recapita gli eventi potrebbe non essere corretto. A partire da Windows 10, il timestamp viene acquisito con precisione aggiuntiva, anche se alcune instabilità possono verificarsi ancora nei casi in cui l'orologio di sistema è stato regolato durante l'acquisizione della traccia.
3
Contatore del ciclo della CPU. Il contatore della CPU fornisce il timestamp di risoluzione più elevato ed è il minor utilizzo di risorse da recuperare. Tuttavia, il contatore della CPU non è affidabile e non deve essere usato nell'ambiente di produzione. Ad esempio, in alcuni computer, i timer cambiano la frequenza a causa di variazioni termiche e elettriche, oltre ad arrestarsi in alcuni stati.
Per determinare la risoluzione, usare il membro CpuSpeedInMHz di TRACE_LOGFILE_HEADER durante l'utilizzo dell'evento.
Se l'hardware non supporta questo tipo di orologio, ETW usa l'ora di sistema.
Windows Server 2003, Windows XP con SP1 e Windows XP: Questo valore non è supportato, è stato introdotto in Windows Server 2003 con SP1 e Windows XP con SP2.

 

Windows 2000: Il membro ClientContext non è supportato.

Flag

Deve contenere WNODE_FLAG_TRACED_GUID per indicare che la struttura contiene informazioni sulla traccia eventi.

Commenti

Assicurarsi di inizializzare la memoria per questa struttura su zero prima di impostare i membri.

Per convertire un timestamp ETW in un fileTIME, seguire questa procedura:

1. Per ogni sessione o file di log in fase di elaborazione (ad esempio, per ogni evento\_TRACE\_LOGFILE), controllare il campo logFile.ProcessTraceMode per determinare se è impostato il flag PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP. Per impostazione predefinita, questo flag non è impostato. Se questo flag non è impostato, il runtime ETW convertirà automaticamente il timestamp di ogni EVENT\_RECORD in fileTIME prima di inviare event\_RECORD alla funzione EventRecordCallback, quindi non è necessaria alcuna elaborazione aggiuntiva. I passaggi seguenti devono essere usati solo se la traccia viene elaborata con il flag PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP impostato. 2. Per ogni sessione o file di log in fase di elaborazione (ad esempio, per ogni EVENTO\_TRACE\_LOGFILE), controllare il campo logFile.LogfileHeader.ReservedFlags per determinare la scala del timestamp per il file di log. In base al valore di ReservedFlags, seguire uno di questi passaggi per determinare il valore da usare per timeStampScale nei passaggi rimanenti:
a. Se ReservedFlags == 1 (QPC): DOUBLE timeStampScale = 100000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. Se ReservedFlags == 2 (ora di sistema): DOUBLE timeStampScale = 1,0; Si noti che i passaggi rimanenti non sono necessari per gli eventi che usano l'ora di sistema, poiché gli eventi forniscono già i timestamp nelle unità FILETIME. I passaggi rimanenti funzioneranno ma non sono necessari e presenteranno un piccolo errore di arrotondamento. c. Se ReservedFlags == 3 (contatore del ciclo CPU): DOUBLE timeStampScale = 10.0 / logFile.LogfileHeader.CpuSpeedInMHz;
3. Nella chiamata FIRST alla funzione EventRecordCallback per un determinato file di log, usare i dati del logFile (EVENT\_TRACE\_LOGFILE) e dall'eventRecord (EVENT\_RECORD) per calcolare timeStampBase che verrà usato per gli eventi rimanenti nel file di log: INT64 timeStampBase = logFile.LogfileHeader.StartTime.QuadPart - (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart); 4. Per ogni eventRecord (EVENT\_RECORD), convertire il timestamp dell'evento in FILETIME come indicato di seguito, usando i valori timeStampScale e timeStampBase calcolati nei passaggi 2 e 3: INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

Requisiti

Requisito Valore
Client minimo supportato
Windows 2000 Professional [app desktop | App UWP]
Server minimo supportato
Windows 2000 Server [app desktop | App UWP]
Intestazione
Wmistr.h

Vedi anche

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER