Erkennung einer speziellen Poolspeicherbeschädigung in der Treiberüberprüfung

Speicherbeschädigung ist ein häufiges Treiberproblem. Treiberfehler können zu Abstürzen führen, lange nachdem die Fehler gemacht wurden. Die häufigsten Fehler sind der Zugriff auf bereits freigegebenen Arbeitsspeicher, das Zuweisen von n Bytes und dann der Zugriff auf n+1 Bytes.

Um Speicherbeschädigungen zu erkennen, kann Driver Verifier Treiberspeicher aus einem speziellen Pool zuweisen und diesen Pool auf falschen Zugriff überwachen. Spezielle Poolunterstützung wird für vom Kernelmodus vom System bereitgestellte Routinen wie ExAllocatePoolWithTag und auch für die vom GDI-System bereitgestellten Routinen wie EngAllocMem bereitgestellt.

Spezieller Pool nach Ausrichtungen

Zwei Ausrichtungen des speziellen Pools sind verfügbar:

  • Die Ausrichtung "Start überprüfen " ist beim Erkennen von Zugriffsunterläufen besser geeignet.
  • Die Ausrichtung "Ende überprüfen" ist beim Erkennen von Zugriffsüberläufen besser geeignet.

Weitere Informationen zur Verwendung der Optionen "Start überprüfen" und "Ende überprüfen" finden Sie unter Erkennen von Überschreitungen und Unterläufen. Beachten Sie, dass die überwiegende Mehrheit der Speicherbeschädigungen auf Überschreitungen und nicht auf Unterläufe zurückzuführen ist.

Wenn das Feature "Spezieller Pool" aktiv ist und "Ende überprüfen" ausgewählt wurde, wird jede vom Treiber angeforderte Speicherbelegung auf einer separaten Seite platziert. Die höchstmögliche Adresse, die es der Zuordnung ermöglicht, auf die Seite zu passen, wird zurückgegeben, sodass der Arbeitsspeicher am Ende der Seite ausgerichtet ist. Der vorherige Teil der Seite ist mit speziellen Mustern geschrieben. Die vorherige Seite und die nächste Seite sind als nicht zugänglich markiert.

Wenn der Treiber versucht, nach dem Ende der Zuordnung auf Arbeitsspeicher zuzugreifen, erkennt Driver Verifier dies sofort und gibt die Fehlerüberprüfung 0xCD aus. Wenn der Treiber vor Beginn des Puffers in den Speicher schreibt, werden die Muster (vermutlich) geändert. Wenn der Puffer freigegeben wird, erkennt Driver Verifier die Änderung und gibt die Fehlerüberprüfung 0xC1 aus.

Wenn der Treiber den Puffer liest oder in den Puffer schreibt, nachdem er ihn freigegeben hat, gibt Driver Verifier die Fehlerüberprüfung 0xCC aus.

Wenn Start überprüfen ausgewählt ist, wird der Speicherpuffer am Anfang der Seite ausgerichtet. Bei dieser Einstellung führen Unterläufe zu einer sofortigen Fehlerüberprüfung und Überschreitungen führen zu einer Fehlerüberprüfung, wenn der Arbeitsspeicher freigegeben wird. Diese Option ist andernfalls mit der Option Ende überprüfen identisch.

Vergewissern Sie sich, dass End die Standardausrichtung ist, da Überschreitungsfehler in Treibern viel häufiger auftreten als Fehler bei Unterlauf.

Eine einzelne Speicherzuordnung kann diese Einstellungen überschreiben und ihre Ausrichtung auswählen, indem ExAllocatePoolWithTagPriority aufgerufen wird, wobei der Priority-Parameter auf XxxSpecialPoolOverrun oder XxxSpecialPoolUnderrun festgelegt ist. (Diese Routine kann das Feature "Special Pool" nicht aktivieren oder deaktivieren oder den speziellen Pool für eine Speicherzuordnung anfordern, die andernfalls aus dem normalen Pool zugewiesen würde. Nur die Ausrichtung kann von dieser Routine aus gesteuert werden.)

In Windows 7 und höheren Versionen des Windows-Betriebssystems unterstützt die Option Special Pool Arbeitsspeicher, der mithilfe der folgenden Kernel-APIs zugewiesen wurde:

Spezielle Poolgröße nach Pooltag oder Zuordnungsgröße

Zusätzlich zum Special Pool Feature von Driver Verifier, das einen speziellen Pool für Zuordnungen durch einen angegebenen Treiber anfordert, gibt es zwei weitere Möglichkeiten, den speziellen Pool zu verwenden:

  • Pooltag. Fordern Sie einen speziellen Pool für alle Zuordnungen mit einem angegebenen Pooltag an.

  • Größe Fordern Sie einen speziellen Pool für alle Zuordnungen innerhalb eines angegebenen Größenbereichs an.

Um einen speziellen Pool für ein Pooltag oder einen Größenbereich anzufordern, verwenden Sie Gflags, ein Tool, das in Debugtools für Windows enthalten ist. Ausführliche Informationen finden Sie unter Verwenden des Global Flags-Hilfsprogramms.

Sie können das Feature "Special Pool" von Driver Verifier und die speziellen Poolfeatures von Gflags gleichzeitig nutzen. Wenn Sie dies tun, denken Sie daran, dass der spezielle Pool begrenzt ist, dass nicht alle Versuche, einen speziellen Pool zuzuweisen, erfolgreich sind und dass Windows einen erfolgreichen status für fehlgeschlagene Versuche zur Zuordnung aus einem speziellen Pool zurückgibt, die durch Zuordnungen aus den regulären Speicherpools erfüllt werden.

Besondere Pooleffizienz

Nicht alle speziellen Poolanforderungen werden erfüllt. Jede Zuordnung aus dem speziellen Pool verwendet eine Seite nicht ausgelagerten physischen Arbeitsspeicher und zwei Seiten virtuellen Adressraum. Wenn der Pool erschöpft ist, wird der Arbeitsspeicher standardmäßig zugewiesen, bis der spezielle Pool wieder verfügbar ist. Wenn eine spezielle Poolanforderung aus dem Standardpool ausgefüllt wird, gibt die anfordernde Funktion keinen Fehler zurück, da die Poolanforderung erfolgreich war. Es wird daher nicht empfohlen, mehrere Treiber gleichzeitig zu überprüfen, wenn das Feature "Special Pool" aktiviert ist.

Ein einzelner Treiber, der viele kleine Speicheranforderungen anfordert, kann diesen Pool ebenfalls erschöpfen. In diesem Fall kann es vorzuziehen sein, den Speicherzuordnungen des Treibers Pooltags zuzuweisen und den speziellen Pool jeweils einem Pooltag zuzuweisen.

Die Größe des speziellen Pools erhöht sich mit der Menge des physischen Arbeitsspeichers auf dem System; Im Idealfall sollte dies mindestens 1 Gigabyte (GB) sein. Verwenden Sie auf x86-Computern nicht die Startoption /3GB , da virtueller (zusätzlich zum physischen) Speicherplatz belegt wird. Es empfiehlt sich auch, die Mindest-/Höchstmengen der Seitendatei um den Faktor zwei oder drei zu erhöhen.

Um sicherzustellen, dass alle Zuordnungen eines Fahrers getestet werden, wird empfohlen, den Fahrer über einen längeren Zeitraum zu belasten.

Überwachung des Spezialpools

Statistiken zu Poolzuordnungen können überwacht werden. Diese können vom Treiberüberprüfungs-Manager, der Verifier.exe-Befehlszeile oder in einer Protokolldatei angezeigt werden. Weitere Informationen finden Sie unter Überwachen globaler Leistungsindikatoren .

Wenn der Leistungsindikator Poolzuordnungen erfolgreich im speziellen Pool dem Zähler Poolzuordnungen erfolgreich entspricht, hat der spezielle Pool für alle Speicherzuordnungen ausreichend. Wenn der frühere Zähler niedriger als der zweite ist, wurde der spezielle Pool mindestens einmal erschöpft.

Diese Indikatoren verfolgen keine Zuordnungen, deren Größe eine Seite oder größer ist, da der spezielle Pool für sie nicht anwendbar ist.

Wenn das Feature "Spezieller Pool" aktiviert ist, aber weniger als 95 % aller Poolzuordnungen aus dem speziellen Pool zugewiesen wurden, wird eine Warnung im Treiberüberprüfungs-Manager angezeigt. In Windows 2000 wird diese Warnung auf dem Bildschirm Treiberstatus angezeigt. In Windows XP und höher wird diese Warnung auf dem Bildschirm Globale Leistungsindikatoren angezeigt. In diesem Fall sollten Sie eine kürzere Liste von Treibern überprüfen, einzelne Pools anhand des Pooltags überprüfen oder Ihrem System mehr physischen Arbeitsspeicher hinzufügen.

Die Kerneldebuggererweiterung !verifier kann auch verwendet werden, um die spezielle Poolnutzung zu überwachen. Es stellt ähnliche Informationen wie die des Treiberüberprüfungs-Managers dar. Informationen zu Debuggererweiterungen finden Sie unter Windows-Debuggen.

Aktivieren der speziellen Pooloption

Sie können das Feature "Special Pool" für einen oder mehrere Treiber aktivieren, indem Sie den Treiberüberprüfungs-Manager oder die befehlszeile Verifier.exe verwenden. Ausführliche Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.

Hinweis

Verwenden Sie das Hilfsprogramm Global Flags, um die Funktion "Special Pool" nach Pooltag oder "Zuordnungsgröße" zu aktivieren oder die Ausrichtungen "Start überprüfen " (Unterläufe erkennen) und "Ende überprüfen" (Überschreitungen erkennen) festzulegen. Diese Ausrichtungseinstellungen gelten für alle speziellen Poolzuordnungen.

  • An der Befehlszeile

    In der Befehlszeile wird die Option Special Pool durch Bit 0 (0x1) dargestellt. Verwenden Sie zum Aktivieren des Sonderpools den Flagwert 0x1, oder fügen Sie dem Flagwert 0x1 hinzu. Beispiel:

    verifier /flags 0x1 /driver MyDriver.sys
    

    Das Feature ist nach dem nächsten Start aktiv.

    Sie können den Spezialpool auch aktivieren und deaktivieren, ohne den Computer neu zu starten, indem Sie dem Befehl den Parameter /volatile hinzufügen. Beispiel:

    verifier /volatile /flags 0x1 /adddriver MyDriver.sys
    

    Diese Einstellung ist sofort wirksam, geht aber verloren, wenn Sie den Computer herunterfahren oder neu starten. Ausführliche Informationen finden Sie unter Verwenden flüchtiger Einstellungen.

    Das Feature "Special Pool" ist auch in den Standardeinstellungen enthalten. Beispiel:

    verifier /standard /driver MyDriver.sys
    
  • Verwenden des Treiberüberprüfungs-Managers

    1. Wählen Sie Benutzerdefinierte Einstellungen erstellen (für Codeentwickler) aus, und klicken Sie dann auf Weiter.
    2. Wählen Sie Einzelne Einstellungen aus einer vollständigen Liste auswählen aus.
    3. Wählen Sie (überprüfen) Spezialpool aus.

    Das Feature "Special Pool" ist auch in den Standardeinstellungen enthalten. Um dieses Feature zu verwenden, klicken Sie im Treiberüberprüfungs-Manager auf Standardeinstellungen erstellen.