WMI-händelsespårning

I det här avsnittet beskrivs WMI-tilläggen till WDM (stöds av Windows 2000 och senare) som drivrutiner i kernelläge, som informationsprovidrar, kan använda för att tillhandahålla information till informationskonsumenter. Drivrutiner tillhandahåller vanligtvis information som en konsument använder för att fastställa drivrutinens konfiguration och resursanvändning. Förutom WMI-tilläggen till WDM stöder ett användarläges-API leverantörer eller användare av WMI-händelseinformation – mer information finns i Windows SDK.

Händelsespårningsloggaren stöder upp till 32 instanser. En av instanserna är reserverad för spårning av kerneln. Loggern stöder spårning av en hög händelsefrekvens.

Spårningshändelser definieras på samma sätt som andra WMI-händelser. WMI-händelser beskrivs i MOF-filen. Mer information om WMI-händelsebeskrivningar finns i MOF-syntax för WMI-data och händelseblock.

Den process genom vilken kernellägesdrivrutiner loggar information är integrerad i den befintliga WMI-infrastrukturen. För att logga spårningshändelser utför en drivrutin följande:

  1. Registrera dig som WMI-provider genom att anropa IoWMIRegistrationControl.

  2. Markera händelser som spårningsbara genom att ange WMIREG_FLAG_TRACED_GUID i flaggmedlemmen i WMIREGGUID-strukturen som skickas när drivrutinen registrerar händelser med WMI.

  3. Ange en händelse som kontrollhändelse för övergripande aktivering/inaktivering av en uppsättning spårningshändelser genom att ange WMIREG_FLAG_TRACE_CONTROL_GUID i flags-medlemmen i WMIREGGUID-strukturen som skickas när drivrutinen registrerar händelser med WMI.

  4. När du tar emot en begäran från WMI om att aktivera händelser där GUID matchar guiden för spårningskontroll bör drivrutinen lagra handtaget till loggaren. Värdet behövs när en händelse skrivs. Information om hur du använder det här handtaget finns i steg 6. Loggningsreferensvärdet finns i HistoricalContext-medlemmen i den WNODE_HEADER delen av WMI-bufferten som ingår i parametrarna i begäran om att aktivera händelser.

  5. Bestäm om spårningshändelsen ska skickas till WMI-händelsekonsumenter eller om den endast är avsedd för WMI-händelseloggaren. Detta avgör var minnet för den EVENT_TRACE_HEADER strukturen ska komma ifrån. Det här minnet skickas så småningom till IoWMIWriteEvent.

    Om händelsen endast är en logghändelse tas inte minnet bort av WMI. I det här fallet ska drivrutinen skicka in en buffert på stacken eller återanvända en allokerad buffert för detta ändamål. Av prestandaskäl bör drivrutinen minimera onödiga anrop för allokering eller frigöring av minne. Om du inte följer den här rekommendationen äventyras integriteten för tidsinformationen i loggfilen.

    Om händelsen ska skickas till både loggern och WMI-händelsekonsumenterna måste minnet allokeras från en icke-sidsidig pool. I det här fallet skickas händelsen till loggaren och vidarebefordras sedan till WMI för att skickas till WMI-händelsekonsumenter som har begärt meddelande om händelsen. Minnet för händelsen frigörs sedan av WMI enligt beteendet för IoWMIWriteEvent.

  6. När minnet för EVENT_TRACE_HEADER och eventuella drivrutinshändelsedata, om några, har skyddats, bör följande information anges:

    Ange medlemmet Size till storleken av sizeof(EVENT_TRACE_HEADER) och storleken av eventuella ytterligare drivrutinshändelsedata som kommer att läggas till i slutet av EVENT_TRACE_HEADER.

    Ställ in flags-medlemmen på WNODE_FLAG_TRACED_GUID så att händelsen skickas till loggaren. Om händelsen också ska skickas till WMI-eventkonsumenter anger du WNODE_FLAG_LOG_WNODE. Observera att du inte behöver ange WNODE_FLAG_TRACED_GUID om du ställer in WNODE_FLAG_LOG_WNODE. Om båda anges har WNODE_FLAG_TRACED_GUID företräde och händelsen skickas inte till WMI-händelsekonsumenter.

    Ange medlemmarna Guid eller GuidPtr. Om du använder GuidPtr, ställ in WNODE_FLAG_USE_GUID_PTR i flags-medlemmen.

    Du kan också ange ett värde för TimeStamp. Om drivrutinen inte anger ett TimeStamp-värde fyller loggaren i detta. Om drivrutinen inte vill att loggaren ska ange tidsstämpeln bör den ange WNODE_FLAG_USE_TIMESTAMP i flags-medlemmen .

    Ange någon av följande EVENT_TRACE_HEADER medlemmar som har betydelse för drivrutinen: Class.Type, Class.Level och Class.Version.

    Lägg slutligen EVENT_TRACE_HEADER till en WNODE_HEADER och ange värdet HistoricalContext för Wnode till loggningshandtaget som sparades i steg 4 ovan.

  7. Anropa IoWMIWriteEvent med en pekare till strukturen EVENT_TRACE_HEADER.

Drivrutinen bör fortsätta att logga spårningshändelser som är associerade med kontroll-GUID tills drivrutinen får ett meddelande om att inaktivera händelseloggning via en IRP_MN_DISABLE_EVENTS begäran.