Poolnachverfolgung
Die Poolnachverfolgung überwacht die vom Treiber vorgenommenen Speicherbelegungen. Zum Zeitpunkt des Entladens des Treibers stellt driver verifier sicher, dass alle vom Treiber vorgenommenen Zuordnungen freigegeben wurden.
Nicht neu aufgesetzte Speicherbelegungen (auch als Speicherlecks bezeichnet) sind eine häufige Ursache für eine verringerte Betriebssystemleistung. Diese können die Systempools fragmentieren und schließlich zu Systemabstürzen führen.
Wenn diese Option aktiv ist, führt Driver Verifier eine Fehlerüberprüfung 0xC4 aus (wobei Parameter 1 gleich 0x62 ist), wenn ein Treiber entladen wird, ohne alle Zuordnungen freizusetzen.
Wenn die Treiberüberprüfung diese Fehlerüberprüfung mit Parameter 1 ausgibt, der 0x51, 0x52, 0x53, 0x54 oder 0x59 entspricht, hat der Treiber außerhalb seiner Zuordnungen in den Arbeitsspeicher geschrieben. In diesem Fall sollten Sie das Feature "Spezieller Pool " aktivieren, um die Fehlerquelle zu suchen.
Eine Liste der Fehlerüberprüfungsparameter finden Sie unter 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).
Ab Windows Vista ermöglicht die Aktivierung der Option Poolnachverfolgung auch die Nachverfolgung gesperrter Seiten. Wenn diese Option aktiv ist, gibt die Treiberüberprüfung 0xCB (DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS) aus, wenn ein Treiber gesperrte Seiten nach einem E/A-Vorgang nicht freigeben kann.
In Windows 7 und höheren Versionen des Windows-Betriebssystems unterstützt die Option Poolnachverfolgung Arbeitsspeicher, der mithilfe der folgenden Kernel-APIs zugeordnet wurde:
IoAllocateIrp und die anderen Routinen, die I/O-Anforderungspaket-Datenstrukturen (IRP) zuordnen können
RtlAnsiStringToUnicodeString und andere Zeichenfolgenroutinen der Laufzeitbibliothek (RTL)
In Windows 7 und höheren Versionen des Windows-Betriebssystems kann driver verifier bei Aktivierung der Poolnachverfolgung Versuche erkennen, Kernelpoolspeicher mit Kontingent im Kontext des Leerlaufprozesses zuzuweisen. Solche Versuche bedeuten in der Regel, dass der Treiber Speicher aus einer DPC-Routine zugibt. Der Thread- oder Prozesskontext für DPC-Routinen ist unzuverlässig, sodass der Versuch, das Kontingent für diesen Prozess zu berechnen, falsch ist.
Überwachen der Poolnachverfolgung
Statistiken zur Speicherpoolbelegung können für jeden zu überprüfenden Treiber separat überwacht werden. Diese Statistiken können vom Driver Verifier Manager, der Verifier.exe Befehlszeile oder in einer Protokolldatei angezeigt werden. Weitere Informationen finden Sie unter Überwachen einzelner Leistungsindikatoren .
Die Kerneldebuggererweiterung !verifier 0x3 kann verwendet werden, um ausstehende Speicherbelegungen zu suchen, nachdem der Treiber entladen wurde, oder um die aktuellen Zuordnungen während der Ausführung des Treibers nachzuverfolgen. Diese Erweiterung zeigt auch das Pooltag, die Größe des Pools und die Adresse der Zuweisung für jede Zuordnung an. Informationen zu Debuggererweiterungen finden Sie unter Windows-Debuggen.
Poolkontingentgebühren aus der DPC-Routine
Kerneltreiber können ExAllocatePoolWithQuotaTag aufrufen, um Kernelpoolspeicher zuzuweisen und die Anzahl der Bytes zu berechnen, die dem Poolkontingent des aktuellen Prozesses zugeordnet sind. Treiber verwenden in der Regel ein Kontingent für Speicherbelegungen, die sich direkt auf eine Anforderung beziehen, die von einer Anwendung stammt.
Routinen für verzögerte Prozeduraufrufe (DPC) können im Kontext eines beliebigen Prozesses ausgeführt werden. Daher wird beim Berechnen des Kontingents aus einer DPC-Routine ein zufälliger Prozess berechnet. Schlimmer noch: Wenn die DPC-Routine im Kontext des Leerlaufprozesses ausgeführt wird, kann diese Bedingung zu Speicherbeschädigungen oder Systemabstürzen führen.
Ab Windows 7 erkennt driver verifier ExAllocatePoolWithQuotaTag-Aufrufe von DPC-Routinen.
Aktivieren dieser Option
Sie können die Poolnachverfolgungsfunktion für einen oder mehrere Treiber aktivieren, indem Sie den Treiberüberprüfungs-Manager oder die befehlszeile Verifier.exe verwenden. Weitere Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.
Über die Befehlszeile
In der Befehlszeile wird die Option Poolnachverfolgung durch Bit 3 (0x8) dargestellt. Verwenden Sie zum Aktivieren der Poolnachverfolgung den Flagwert 0x8, oder fügen Sie dem Flagwert 0x8 hinzu. Beispiel:
verifier /flags 0x8 /driver MyDriver.sys
Das Feature ist nach dem nächsten Start aktiv.
Unter Windows Vista und höheren Versionen von Windows können Sie die Poolnachverfolgung auch aktivieren und deaktivieren, ohne den Computer neu zu starten, indem Sie dem Befehl den Parameter /volatile hinzufügen. Beispiel:
verifier /volatile /flags 0x8 /adddriver MyDriver.sys
Diese Einstellung wird sofort wirksam, geht aber verloren, wenn Sie den Computer herunterfahren oder neu starten. Weitere Informationen finden Sie unter Verwenden von flüchtigen Einstellungen.
Das Feature für die Poolnachverfolgung ist auch in den Standardeinstellungen enthalten. Beispiel:
verifier /standard /driver MyDriver.sys
Verwenden des Treiberüberprüfungs-Managers
- Starten Sie den Treiberüberprüfungs-Manager. Geben Sie Verifier in ein Eingabeaufforderungsfenster ein.
- Wählen Sie Benutzerdefinierte Einstellungen erstellen (für Codeentwickler) aus, und klicken Sie dann auf Weiter.
- Wählen Sie Einzelne Einstellungen aus einer vollständigen Liste auswählen aus.
- Wählen Sie pool tracking (überprüfen) aus.
Das Feature für die Poolnachverfolgung ist auch in den Standardeinstellungen enthalten. Um dieses Feature zu verwenden, klicken Sie im Treiberüberprüfungs-Manager auf Standardeinstellungen erstellen.