WMI-Ereignisablaufverfolgung

In diesem Abschnitt werden die WMI-Erweiterungen für WDM (unterstützt von Windows 2000 und höher) beschrieben, die Kernelmodustreiber als Informationsanbieter verwenden können, um Informationen für Informationsconsumer bereitzustellen. Treiber stellen in der Regel Informationen bereit, die ein Consumer verwendet, um die Konfiguration und Ressourcennutzung des Treibers zu bestimmen. Zusätzlich zu den WMI-Erweiterungen für WDM unterstützt eine Benutzermodus-API Anbieter oder Consumer von WMI-Ereignisinformationen. Weitere Informationen finden Sie im Windows SDK.

Die Ereignisablaufverfolgungsprotokollierung unterstützt bis zu 32 Instanzen. Eine der Instanzen ist für die Ablaufverfolgung des Kernels reserviert. Die Protokollierung unterstützt die Ablaufverfolgung einer hohen Ereignisrate.

Ablaufverfolgungsereignisse werden auf die gleiche Weise wie andere WMI-Ereignisse definiert. WMI-Ereignisse werden in der MOF-Datei beschrieben. Weitere Informationen zu WMI-Ereignisbeschreibungen finden Sie unter MOF-Syntax für WMI-Daten und -Ereignisblöcke.

Der Prozess, mit dem Kernelmodustreiber Protokollinformationen in die vorhandene WMI-Infrastruktur integriert werden. Um Ablaufverfolgungsereignisse zu protokollieren, führt ein Treiber folgendes aus:

  1. Registrieren Sie sich als WMI-Anbieter, indem Sie IoWMIRegistrationControl aufrufen.

  2. Markieren Sie Ereignisse als nachverfolgbar, indem Sie WMIREG_FLAG_TRACED_GUID im Flags-Member der WMIREGGUID-Struktur festlegen, die übergeben wird, wenn der Treiber Ereignisse bei WMI registriert.

  3. Geben Sie ein Ereignis als Steuerelementereignis für die allgemeine Aktivierung/Deaktivierung einer Reihe von Ablaufverfolgungsereignissen an, indem Sie WMIREG_FLAG_TRACE_CONTROL_GUID im Flags-Member der WMIREGGUID-Struktur festlegen, das übergeben wird, wenn der Treiber Ereignisse bei WMI registriert.

  4. Nach Dem Empfang einer Anforderung von WMI zum Aktivieren von Ereignissen, bei denen die GUID mit der Ablaufverfolgungssteuerelement-GUID übereinstimmt, sollte der Treiber das Handle in der Protokollierung speichern. Der Wert wird beim Schreiben eines Ereignisses benötigt. Informationen zur Verwendung dieses Handles finden Sie in Schritt 6. Der Wert des Protokollierungshandles ist im HistoricalContext-Member des WNODE_HEADER Teils des WMI-Puffers enthalten, der Teil der Parameter in der Anforderung zum Aktivieren von Ereignissen ist.

  5. Entscheiden Sie, ob das Ablaufverfolgungsereignis an WMI-Ereignisconsumer gesendet wird oder nur für die WMI-Ereignisprotokollierung vorgesehen ist. Dadurch wird bestimmt, wo der Speicher für die EVENT_TRACE_HEADER-Struktur stammen soll. Dieser Arbeitsspeicher wird schließlich an IoWMIWriteEvent übergeben.

    Wenn es sich bei dem Ereignis nur um ein Protokollereignis handelt, wird der Arbeitsspeicher nicht von WMI gelöscht. In diesem Fall sollte der Treiber einen Puffer auf dem Stapel übergeben oder einen zugeordneten Puffer zu diesem Zweck wiederverwenden. Aus Leistungsgründen sollte der Treiber unnötige Aufrufe zum Zuweisen oder Freigeben von Arbeitsspeicher minimieren. Wenn Sie diese Empfehlung nicht einhalten, wird die Integrität der in der Protokolldatei enthaltenen Zeitsteuerungsinformationen beeinträchtigt.

    Wenn das Ereignis sowohl an die Protokollierung als auch an WMI-Ereignisconsumer gesendet werden soll, muss der Arbeitsspeicher aus einem nicht auslagerten Pool zugewiesen werden. In diesem Fall wird das Ereignis an die Protokollierung gesendet und dann an WMI weitergeleitet, um an WMI-Ereignisconsumer gesendet zu werden, die eine Benachrichtigung über das Ereignis angefordert haben. Der Speicher für das Ereignis wird dann gemäß dem Verhalten von IoWMIWriteEvent von WMI freigegeben.

  6. Nachdem der Arbeitsspeicher für die EVENT_TRACE_HEADER und ggf. treiberbasierte Ereignisdaten gesichert wurden, sollten die folgenden Informationen festgelegt werden:

    Legen Sie das Size-Element auf sizeof(EVENT_TRACE_HEADER) plus die Größe aller zusätzlichen Treiberereignisdaten fest, die am Ende der EVENT_TRACE_HEADER angefügt werden.

    Legen Sie das Flags-Element auf WNODE_FLAG_TRACED_GUID fest, damit das Ereignis an die Protokollierung gesendet wird. Wenn das Ereignis auch an WMI-Ereignisconsumer gesendet werden soll, legen Sie die WNODE_FLAG_LOG_WNODE fest. Beachten Sie, dass es nicht erforderlich ist, WNODE_FLAG_TRACED_GUID festzulegen, wenn sie WNODE_FLAG_LOG_WNODE. Wenn beide festgelegt sind, hat WNODE_FLAG_TRACED_GUID Vorrang, und das Ereignis wird nicht an WMI-Ereignisconsumer gesendet.

    Legen Sie die GUID oder das GuidPtr-Element fest. Wenn Sie GuidPtr verwenden, legen Sie im Flags-Element WNODE_FLAG_USE_GUID_PTR fest.

    Geben Sie optional einen Wert für TimeStamp an. Wenn der Treiber keinen TimeStamp-Wert angibt, wird dieser von der Protokollierung ausgefüllt. Wenn der Treiber nicht möchte, dass die Protokollierung den Zeitstempel festlegen soll, sollte er WNODE_FLAG_USE_TIMESTAMP im Flags-Element festlegen.

    Legen Sie eines der folgenden EVENT_TRACE_HEADER-Member fest, die für den Treiber Bedeutung haben: Class.Type, Class.Level und Class.Version.

    Wandeln Sie schließlich die EVENT_TRACE_HEADER in eine WNODE_HEADER um, und legen Sie den HistoricalContext-Wert des Wnode auf das Protokollierungshandle fest, das in Schritt 4 oben gespeichert wurde.

  7. Rufen Sie IoWMIWriteEvent mit dem Zeiger auf die EVENT_TRACE_HEADER-Struktur auf.

Der Treiber sollte mit der Protokollierung von Ablaufverfolgungsereignissen fortfahren, die der Steuerelement-GUID zugeordnet sind, bis der Treiber eine Benachrichtigung erhält, um die Ereignisprotokollierung über eine IRP_MN_DISABLE_EVENTS-Anforderung zu deaktivieren.