Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Abschnitt werden die WMI-Erweiterungen für WDM (unterstützt von Windows 2000 und höher) beschrieben, mit denen Kernelmodustreiber als Informationsanbieter Informationen für Verbraucher bereitstellen können. Treiber stellen in der Regel Informationen bereit, die ein Verbraucher verwendet, um die Konfiguration und Ressourcennutzung des Treibers zu ermitteln. Neben den WMI-Erweiterungen für WDM unterstützt eine Benutzermodus-API Anbieter oder Verbraucher von WMI-Ereignisinformationen – weitere Informationen finden Sie im Windows SDK.
Der Protokollierer für die Ereignisablaufverfolgung unterstützt bis zu 32 Instanzen. Eine der Instanzen ist für die Ablaufverfolgung des Kernels reserviert. Der Logger ermöglicht 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 Vorgang, mit dem Kernelmodustreiber Informationen protokollieren, ist in die bestehende WMI-Infrastruktur integriert. Um Trace-Ereignisse zu protokollieren, führt ein Treiber folgende Schritte aus:
Registrieren Sie sich als WMI-Anbieter, indem Sie IoWMIRegistrationControl aufrufen.
Markieren Sie Ereignisse als nachverfolgbar, indem Sie WMIREG_FLAG_TRACED_GUID im Flags-Element der WMIREGGUID-Struktur festlegen, die übergeben wird, wenn der Treiber Ereignisse bei WMI registriert.
Geben Sie ein Ereignis als Kontrollereignis für die allgemeine Aktivierung/Deaktivierung einer Reihe von Trace-Ereignissen an, indem Sie WMIREG_FLAG_TRACE_CONTROL_GUID im Flags-Element der WMIREGGUID-Struktur festlegen, das beim Registrieren von Ereignissen durch den Treiber an WMI übergeben wird.
Wenn Sie eine Anforderung von WMI erhalten, um Ereignisse zu aktivieren, bei denen die GUID mit der Trace Control GUID übereinstimmt, sollte der Treiber das Handle beim Logger speichern. Der Wert wird beim Schreiben eines Ereignisses benötigt. Informationen zur Verwendung dieses Handles finden Sie in Schritt 6. Der Loggerhandle-Wert ist im HistoricalContext-Member des WNODE_HEADER Teils des WMI-Puffers enthalten, der Teil der Parameter in der Anforderung für Aktivierungsereignisse ist.
Entscheiden Sie, ob das Tracing-Ereignis an WMI-Ereignisempfänger gesendet wird oder nur für den WMI-Ereignisprotokollierer bestimmt ist. Dadurch wird bestimmt, wo der Speicher für die EVENT_TRACE_HEADER-Struktur stammen soll. Dieser Speicher wird schließlich an IoWMIWriteEvent übergeben.
Wenn es sich bei dem Ereignis nur um ein Protokollereignis handelt, wird der Speicher nicht von WMI gelöscht. In diesem Fall sollte der Treiber einen Puffer im Stapelspeicher übergeben oder einen zu diesem Zweck bereits zugewiesenen Puffer erneut verwenden. Aus Leistungsgründen sollte der Treiber unnötige Aufrufe minimieren, um Arbeitsspeicher zuzuweisen oder freizugeben. Wenn diese Empfehlung nicht eingehalten wird, wird die Integrität der in der Protokolldatei enthaltenen Zeitinformationen beeinträchtigt.
Wenn das Ereignis sowohl an den Logger als auch an WMI-Ereigniskunden gesendet werden soll, muss der Speicher von einem nicht seitengebundenen Pool zugewiesen werden. In diesem Fall wird das Ereignis an den Logger gesendet und dann an WMI weitergeleitet, um an WMI-Ereigniskunden gesendet zu werden, die eine Benachrichtigung über das Ereignis angefordert haben. Der Speicher für das Ereignis wird dann von WMI gemäß dem Verhalten von IoWMIWriteEvent freigegeben.
Nachdem der Speicher für die EVENT_TRACE_HEADER und alle Treiberereignisdaten (sofern vorhanden) gesichert wurde, sollten die folgenden Informationen festgelegt werden:
Legen Sie das Size-Element auf die Sizeof(EVENT_TRACE_HEADER) sowie die Größe aller zusätzlichen Treiberereignisdaten fest, die am Ende der EVENT_TRACE_HEADER angefügt werden.
Legen Sie das Flags-Mitglied auf WNODE_FLAG_TRACED_GUID fest, damit das Ereignis an den Logger gesendet wird. Wenn das Ereignis auch an WMI-Ereignisempfänger gesendet werden soll, legen Sie WNODE_FLAG_LOG_WNODE fest. Beachten Sie, dass es nicht erforderlich ist, WNODE_FLAG_TRACED_GUID festzulegen, wenn WNODE_FLAG_LOG_WNODE festgelegt wird. Wenn beide festgelegt sind, hat WNODE_FLAG_TRACED_GUID Vorrang, und das Ereignis wird nicht an WMI-Ereigniskunden gesendet.
Legen Sie die GUID oder das GuidPtr-Element fest. Wenn Sie GuidPtr verwenden, legen Sie WNODE_FLAG_USE_GUID_PTR im Flags-Element fest.
Geben Sie optional einen Wert für TimeStamp an. Wenn der Treiber keinen TimeStamp-Wert angibt, füllt der Logger dies aus. Wenn der Treiber den Logger den Zeitstempel nicht festlegen lassen möchte, sollte er WNODE_FLAG_USE_TIMESTAMP im Flags-Element setzen.
Legen Sie eines der folgenden EVENT_TRACE_HEADER-Mitglieder fest, die für den Treiber relevant sind: 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 den Loggerhandle fest, der in Schritt 4 oben gespeichert wurde.
Rufen Sie IoWMIWriteEvent mit dem Zeiger auf die EVENT_TRACE_HEADER-Struktur auf.
Der Treiber sollte die Protokollierung von Traceereignissen fortsetzen, die der Kontroll-GUID zugeordnet sind, bis der Treiber eine Benachrichtigung empfängt, um die Ereignisprotokollierung durch eine IRP_MN_DISABLE_EVENTS Anforderung zu deaktivieren.