Traccia eventi WMI

Questa sezione descrive le estensioni WMI a WDM (supportate da Windows 2000 e versioni successive) che i driver in modalità kernel, come provider di informazioni, possono usare per fornire informazioni ai consumer di informazioni. I driver forniscono in genere informazioni usate da un consumer per determinare la configurazione e l'utilizzo delle risorse del driver. Oltre alle estensioni WMI a WDM, un'API in modalità utente supporta provider o consumer di informazioni sugli eventi WMI, vedere Windows SDK per altre informazioni.

Il logger di traccia eventi supporta fino a 32 istanze. Una delle istanze è riservata per tracciare il kernel. Il logger supporta la traccia di una frequenza di eventi elevata.

Gli eventi di traccia vengono definiti nello stesso modo degli altri eventi WMI. Gli eventi WMI sono descritti nel file MOF. Per altre informazioni sulle descrizioni degli eventi WMI, vedere Sintassi MOF per i blocchi di eventi e dati WMI.

Processo in base al quale le informazioni di log dei driver in modalità kernel sono integrate nell'infrastruttura WMI esistente. Per registrare gli eventi di traccia, un driver esegue le operazioni seguenti:

  1. Registrare come provider WMI chiamando IoWMIRegistrationControl.

  2. Contrassegnare gli eventi come traccia impostando WMIREG_FLAG_TRACED_GUID nel membro Flag della struttura WMIREGGUID passata quando il driver registra eventi con WMI.

  3. Specificare un evento come evento di controllo per abilitare/disabilitare complessivamente un set di eventi di traccia impostando WMIREG_FLAG_TRACE_CONTROL_GUID nel membro Flag della struttura WMIREGGUID passata quando il driver registra eventi con WMI.

  4. Dopo aver ricevuto una richiesta da WMI per abilitare gli eventi in cui il GUID corrisponde al GUID del controllo di traccia, il driver deve archiviare l'handle al logger. Il valore sarà necessario durante la scrittura di un evento. Per informazioni su come usare questo handle, vedere passaggio 6. Il valore dell'handle del logger è contenuto nel membro HistoricalContext della parte WNODE_HEADER del buffer WMI che fa parte dei parametri nella richiesta di abilitazione degli eventi.

  5. Decidere se l'evento di traccia verrà inviato ai consumer di eventi WMI o è destinato solo al logger di eventi WMI. Ciò determina la posizione in cui deve venire la memoria per la struttura EVENT_TRACE_HEADER . Alla fine questa memoria verrà passata a IoWMIWriteEvent.

    Se l'evento è solo un evento di log, la memoria non verrà eliminata da WMI. In questo caso, il driver deve passare un buffer nello stack o riutilizzare un buffer allocato per questo scopo. Per motivi di prestazioni, il driver deve ridurre al minimo le chiamate non necessarie per allocare o liberare memoria. Non è possibile rispettare questa raccomandazione compromettere l'integrità delle informazioni di temporizzazione contenute nel file di log.

    Se l'evento deve essere inviato sia al logger che ai consumer di eventi WMI, la memoria deve essere allocata da un pool non a pagina. In questo caso l'evento verrà inviato al logger e quindi inoltrato a WMI per essere inviato ai consumer di eventi WMI che hanno richiesto la notifica dell'evento. La memoria dell'evento verrà quindi liberata da WMI in base al comportamento di IoWMIWriteEvent.

  6. Dopo che la memoria per il EVENT_TRACE_HEADER e i dati degli eventi driver, se presenti, sono state protette, è necessario impostare le informazioni seguenti:

    Impostare il membro Size sulla dimensioneof(EVENT_TRACE_HEADER) più le dimensioni di eventuali dati aggiuntivi dell'evento driver che verranno aggiunti alla fine di EVENT_TRACE_HEADER.

    Impostare il membro Flags su WNODE_FLAG_TRACED_GUID per avere l'evento inviato al logger. Se l'evento deve essere inviato anche ai consumer di eventi WMI, impostare il WNODE_FLAG_LOG_WNODE. Nota, non è necessario impostare WNODE_FLAG_TRACED_GUID se si imposta WNODE_FLAG_LOG_WNODE. Se entrambi sono impostati, WNODE_FLAG_TRACED_GUID avrà la precedenza e l'evento non verrà inviato ai consumer di eventi WMI.

    Impostare il Guid o il membro GuidPtr . Se si usa GuidPtr, impostare WNODE_FLAG_USE_GUID_PTR nel membro Flags .

    Facoltativamente, specificare un valore per TimeStamp. Se il driver non specifica un valore TimeStamp , il logger riempirà questo valore. Se il driver non vuole che il logger imposta il timestamp, deve impostare WNODE_FLAG_USE_TIMESTAMP nel membro Flags .

    Impostare uno dei membri di EVENT_TRACE_HEADER seguenti che hanno un significato per il driver: Class.Type, Class.Level e Class.Version.

    Infine eseguire il cast del EVENT_TRACE_HEADER su un WNODE_HEADER e impostare il valore HistoricalContext dell'handle del logger salvato nel passaggio 4 precedente.

  7. Chiamare IoWMIWriteEvent con il puntatore alla struttura EVENT_TRACE_HEADER .

Il driver deve continuare a registrare gli eventi di traccia associati al GUID del controllo fino a quando il driver riceve la notifica per disabilitare la registrazione eventi tramite una richiesta di IRP_MN_DISABLE_EVENTS .