Freigeben über


Erkennung spezieller Speicherbeschädigungen im Treiberprüfer

Speicherbeschädigung ist ein häufiges Treiberproblem. Treiberfehler können zu Abstürzen führen, nachdem die Fehler aufgetreten sind. Die häufigsten dieser Fehler sind der Zugriff auf Speicher, der bereits freigegeben wurde, und die Zuweisung von n Bytes, gefolgt von dem Zugriff auf n+1 Bytes.

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

Spezieller Pool nach Ausrichtungen

Es stehen zwei Ausrichtungen des speziellen Pools zur Verfügung:

  • Die Ausrichtung " Start überprüfen" ist besser beim Erkennen von Zugriffsunterläufen.
  • Die Ausrichtung Ende überprüfen ist besser darin, Zugriffsüberläufe zu erkennen.

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

Wenn das Feature "Sonderpool" aktiv ist und "Ende überprüfen " ausgewählt wurde, wird jede vom Treiber angeforderte Speicherzuweisung auf einer separaten Seite platziert. Die höchste mögliche Adresse, die die Zuordnung optimal auf der Seite platziert, wird zurückgegeben, sodass der Speicherbereich mit dem Ende der Seite ausgerichtet ist. Der vorherige Teil der Seite wird mit speziellen Mustern geschrieben. Auf die vorherige Seite und die nächste Seite kann nicht zugegriffen werden.

Wenn der Treiber nach dem Ende der Zuordnung versucht, auf den Speicher zuzugreifen, erkennt Driver Verifier dies sofort und gibt Bug Check 0xCD aus. Wenn der Treiber vor dem Anfang des Puffers im Arbeitsspeicher schreibt, wird dies (vermutlich) die Muster ändern. Wenn der Puffer freigegeben wird, erkennt Driver Verifier die Änderung und gibt fehlerüberprüfung 0xC1 aus.

Wenn der Treiber nach dem Freigeben in den Puffer liest oder schreibt, gibt Driver Verifier Bug Check 0xCC aus.

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

Verify End ist die Standardeinstellung, da Überlauffehler bei Treibern viel häufiger auftreten als Unterlauffehler.

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

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

Spezieller Pool nach Pooltag oder Zuordnungsgröße

Zusätzlich zur Sonderpoolfunktion von Driver Verifier, die speziellen Pool für Zuordnungen durch einen bestimmten Treiber anfordert, gibt es zwei weitere Möglichkeiten, den speziellen Pool zu verwenden:

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

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

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

Sie können das Feature "Special Pool" von Driver Verifier und die speziellen Poolfeatures von Gflags gleichzeitig verwenden. Denken Sie daran, dass der spezielle Pool begrenzt ist, dass nicht alle Versuche, aus dem speziellen Pool zu allokieren, erfolgreich sind, und dass Windows einen Erfolgsstatus für fehlgeschlagene Versuche zurückgibt, aus dem speziellen Pool zu allokieren, wenn diese 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 mit nicht-seitenauslagerbarem physischem Speicher und zwei Seiten des virtuellen Adressraums. Wenn der Pool ausgelastet ist, wird der Speicher auf standardmäßige Weise zugewiesen, bis der spezielle Pool wieder verfügbar ist. Wenn eine spezielle Poolanforderung aus dem Standardpool gefüllt wird, gibt die anfordernde Funktion keinen Fehler zurück, da die Poolanforderung erfolgreich war. Daher wird nicht empfohlen, dass mehrere Treiber gleichzeitig überprüft werden, wenn das Feature "Spezieller Pool" aktiviert ist.

Ein einzelner Treiber, der viele kleine Speicheranforderungen stellt, kann diesen Pool ebenfalls erschöpfen. Wenn dies geschieht, ist es möglicherweise vorzuziehen, Pooltags den Speicherzuweisungen des Treibers zuzuweisen und den speziellen Pool jeweils einem Pooltag zu widmen.

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) betragen. Verwenden Sie auf x86-Computern nicht die Startoption "/3 GB ", da virtueller (zusätzlich zum physischen) Speicherplatz verbraucht wird. Es empfiehlt sich auch, die Seitendatei-Mindest-/Höchstmengen um einen Faktor von zwei oder drei zu erhöhen.

Um sicherzustellen, dass alle Zuordnungen eines Fahrers getestet werden, wird empfohlen, den Fahrer über längere Zeiträume zu betonen.

Überwachen des speziellen Pools

Statistiken zu Poolzuweisungen können überwacht werden. Diese können vom Treiberprüfer-Manager, der Verifier.exe Befehlszeile oder in einer Protokolldatei angezeigt werden. Details finden Sie unter Monitoring Global Counters .

Wenn der Zähler Poolzuordnungen im spez. Pool erfolgreich dem Zähler Poolzuordnungen erfolgreich entspricht, dann war der spezielle Pool ausreichend, um alle Speicherzuweisungen abzudecken. Wenn der erste Zähler niedriger als der zweite ist, wurde der spezielle Pool mindestens einmal erschöpft.

Diese Zähler erfassen keine Zuordnungen, deren Größe eine Seite oder mehr beträgt, da der spezielle Pool nicht für sie gilt.

Wenn das Feature "Sonderpool" aktiviert ist, aber weniger als 95% aller Poolzuweisungen aus dem Sonderpool zugewiesen wurden, wird im Driver Verifier Manager eine Warnung 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. Wenn dies der Fall ist, sollten Sie eine kürzere Liste von Treibern überprüfen, einzelne Pools nach Pooltag überprüfen oder Ihrem System mehr physischen Arbeitsspeicher hinzufügen.

Die Kerneldebuggererweiterung !verifier kann auch verwendet werden, um die Verwendung des speziellen Pools zu überwachen. Es stellt ähnliche Informationen wie der Treiberprüfer-Manager dar. Informationen zu Debuggererweiterungen finden Sie unter Windows Debugging.

Aktivieren der Speziellen Pooloption

Sie können das Feature "Sonderpool" 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

Um das Feature "Sonderpool" nach Pooltag oder Zuordnungsgröße zu aktivieren oder die Ausrichtungen "Start überprüfen" (Erkennen von Unterläufen) und " End überprüfen" (Überläufe erkennen) festzulegen, verwenden Sie das Hilfsprogramm "Globale Kennzeichnungen"; Diese Ausrichtungseinstellungen gelten für alle speziellen Poolzuordnungen.

  • An der Befehlszeile

    In der Befehlszeile wird die Option "Sonderpool" durch Bit 0 (0x1) dargestellt. Verwenden Sie zum Aktivieren eines speziellen Pools einen Flagwert von 0x1, oder fügen Sie 0x1 zum Flagwert hinzu. Beispiel:

    verifier /flags 0x1 /driver MyDriver.sys
    

    Das Feature wird nach dem nächsten Start aktiv.

    Yyou kann 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 von flüchtigen Einstellungen.

    Das Feature "Spezieller 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 aus einer vollständigen Liste "Einzelne Einstellungen" aus.
    3. Wählen Sie den speziellen Pool (überprüfen) aus.

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