Condividi tramite


Tracciamento eventi WMI

Questa sezione descrive le estensioni WMI a WDM (supportate da Windows 2000 e versioni successive) che i driver operanti in modalità kernel, come fornitori di informazioni, possono utilizzare per fornire informazioni ai consumatori di informazioni. I driver in genere forniscono 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 fornitori o consumatori di informazioni sugli eventi WMI. Per ulteriori informazioni, consultare Windows SDK.

Il logger di traccia eventi supporta fino a 32 istanze. Una delle istanze è riservata al tracciamento del 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 dati WMI e i blocchi eventi.

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. Eseguire la registrazione come provider WMI chiamando IoWMIRegistrationControl.

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

  3. Specificare un evento come evento di controllo per l'abilitazione/disabilitazione complessiva di un set di eventi di traccia impostando WMIREG_FLAG_TRACE_CONTROL_GUID nel membro Flags 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 nel logger. Il valore sarà necessario durante la stesura di un evento. Per informazioni su come usare questo handle, vedere il 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 consumatori di eventi WMI o è destinato solo al registratore degli eventi WMI. In questo modo si determinerà da dove deve provenire la memoria per la struttura EVENT_TRACE_HEADER . Questa memoria verrà infine passata a IoWMIWriteEvent.

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

    Se l'evento deve essere inviato sia al logger sia ai consumatori di eventi WMI, la memoria deve essere allocata da un pool non paginato. 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 per l'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 del 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 accodati alla fine di EVENT_TRACE_HEADER.

    Impostare il membro Flags su WNODE_FLAG_TRACED_GUID in modo che l'evento venga inviato al logger. Se l'evento deve essere inviato anche ai consumer di eventi WMI, impostare il WNODE_FLAG_LOG_WNODE. Si noti che 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 consumatori di eventi WMI.

    Impostare il GUID o il membro GuidPtr . Se si utilizza GuidPtr, imposti WNODE_FLAG_USE_GUID_PTR nel membro Flags.

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

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

    Infine, eseguire il cast del EVENT_TRACE_HEADER in un WNODE_HEADER e impostare il valore HistoricalContext di Wnode sull'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 non riceve la notifica per disabilitare la registrazione degli eventi tramite una richiesta di IRP_MN_DISABLE_EVENTS .