Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Možnost Různé kontroly nástroje Driver Verifier monitoruje ovladač u běžných chyb, které způsobují chybové ukončení ovladače nebo systému, například uvolnění paměti, která stále obsahuje aktivní objekty jádra.
Konkrétně možnost Různé kontroly hledá následující nesprávné chování ovladače:
Aktivní pracovní položky v uvolněné paměti. Ovladač volá ExFreePool k uvolnění bloku fondu, který obsahuje pracovní položky, které byly zařazeny do fronty pomocí IoQueueWorkItem.
Aktivní zdroje v uvolněné paměti. Ovladač volá ExFreePool k uvolnění bloku paměti, který obsahuje aktivní struktury ERESOURCE. Ovladač by měl volat ExDeleteResource odstranit objekty ERESOURCE před voláním ExFreePool.
Aktivní odkládací seznamy v uvolněné paměti. Ovladač volá ExFreePool k uvolnění bloku fondu, který stále obsahuje aktivní vyhledávací seznamy (NPAGED_LOOKASIDE_LIST nebo PAGED_LOOKASIDE_LIST struktury. Ovladač by měl zavolat ExDeleteNPagedLookasideList nebo ExDeletePagedLookasideList, aby odstranil seznamy vyhledávání před voláním ExFreePool.
Problémy s registrací Windows Management Instrumentation (WMI) a Sledování událostí pro Windows (ETW). Mezi tyto problémy zjištěné nástrojem Pro ověření ovladače patří:
Ovladač, který se pokusí uvolnit bez zrušení registrace zpětného volání rozhraní WMI.
Ovladač, který se pokusí odstranit objekt zařízení, který nebyl z rozhraní WMI zrušený.
Ovladač, který se pokusí uvolnit, aniž by odregistroval svého poskytovatele v režimu jádra ETW.
Ovladač, který se pokusí zrušit registraci poskytovatele, který je již zrušen.
Jádro řeší chyby. (Windows Vista a novější verze) Povolením možnosti Různé kontroly povolíte také trasování manipulátorů pro systémový proces, což pomáhá při vyšetřování úniků manipulátorů jádra a Chyba při kontrole 0x93: INVALID_KERNEL_HANDLE. Pokud je povolené trasování popisovačů, jádro bude shromažďovat trasování zásobníku pro nedávné operace otevření a zavření popisovače. Trasování zásobníku lze zobrazit v ladicím programu jádra pomocí rozšíření ladicího programu !htrace. Další informace o !htrace naleznete v dokumentaci nástroje ladění pro Windows.
Popisovač uživatelského režimu s přístupem k režimu jádra Počínaje Systémem Windows 7, když vyberete možnost Různé kontroly, Ovladač Verifier také kontroluje volání ObReferenceObjectByHandle. Nelze předat popisovač uživatelského režimu s přístupem v režimu jádra. Pokud k takové operaci dojde, ovladač Verifier vydá chybovou kontrolu 0xC4 s hodnotou parametru 1 0xF6.
Režim centrální procesorové jednotky čeká na synchronizační objekty přidělené na zásobník jádra
Počínaje Systémem Windows 7 může nástroj Driver Verifier rozpoznat další způsoby, jak ovladače mohou nesprávně používat mechanismy synchronizace multithreadingu, které operační systém poskytuje.
Přidělování synchronizačních objektů, jako jsou struktury KEVENT, jako lokální proměnné v zásobníku jádra je běžnou praxí. Zatímco je proces načten do paměti, zásobníky jádra vláken nejsou nikdy oříznuty z pracovní sady ani stránkovány na disk. Přidělení synchronizačních objektů v takové nestránkové paměti je správné.
Pokud však ovladače volají rozhraní API, jako je KeWaitForSingleObject nebo KeWaitForMultipleObjects, aby čekaly na objekt přidělený v zásobníku, musí zadat hodnotu KernelMode pro parametr WaitMode rozhraní API. Pokud všechna vlákna procesu čekají v režimu UserMode , bude tento proces způsobilý k prohození na disk. Proto pokud ovladač zadal UserMode jako parametr WaitMode, operační systém může vyměnit aktuální proces tak dlouho, dokud všechna ostatní vlákna ve stejném procesu čekají jako UserMode. Prohození celého procesu na disk zahrnuje stránkování zásobníků jádra. Čekání na objekt synchronizace, který operační systém vyřadil z paměti, je nesprávné. V určitém okamžiku musí vlákno přijít a signalizovat synchronizační objekt. Signalizace synchronizačního objektu zahrnuje manipulaci objektu jádrem Windows při IRQL = DISPATCH_LEVEL nebo vyšším. Při přístupu k stránkované nebo zaměněné paměti na úrovni DISPATCH_LEVEL nebo vyšší dojde k pádu systému.
Od systému Windows 7, když vyberete možnost Různé kontroly, Driver Verifier zkontroluje, zda synchronizační objekty, které ověřený ovladač používá pro čekání v režimu UserMode, nejsou přiděleny na zásobníku jádra aktuálního vlákna. Když kontrolátor ovladače zjistí takové nesprávné čekání, vydá kontrolu chyb 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION s hodnotou parametru 1 0x123.
Nesprávné odkazy na jádrové popisovače
Každý proces Windows má tabulku popisovačů. Tabulku popisovačů můžete zobrazit jako pole položek popisovače. Každá platná hodnota popisovače odkazuje na platnou položku v tomto poli.
Popisovač jádra, který je platný pro tabulku popisovačů systémového procesu. Uživatelský popisovač je platný pro jakýkoli proces s výjimkou systémového procesu.
Ve Windows 7 nástroj Driver Verifier zjistí pokusy o odkazování na nesprávné hodnoty popisovače jádra. Tyto závady ovladačů jsou hlášeny jako kontrola chyb 0x93: INVALID_KERNEL_HANDLE, pokud je povolena možnost Různé kontroly ovladače. Takovýto druh nesprávného odkazu na popisovač obvykle znamená, že ovladač tento popisovač již zavřel, ale přesto se ho snaží dál používat. Tento druh chyby může vést k nepředvídatelným problémům systému, protože hodnota popisovače, na kterou se odkazuje, již mohla být znovu použita jiným nesouvisejícím ovladačem.
Pokud ovladač jádra nedávno zavřel popisovač jádra a později odkazuje na uzavřený popisovač, Driver Verifier vynutí kontrolu chyb, jak je popsáno výše. V tomto případě výstup rozšíření ladicího programu !htrace poskytuje trasování zásobníku pro cestu kódu, která tento popisovač zavřela. Jako parametr pro !htrace použijte adresu systémového procesu. Pokud chcete najít adresu systémového procesu, použijte příkaz !process 4 0 .
Počínaje Windows 7, přidává Driver Verifier kontrolu ObReferenceObjectByHandle. Nyní je zakázáno předat uživatelský úchyt s přístupem KernelMode. Pokud je taková kombinace zjištěna, driver Verifier vydá kontrolu chyb 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION s hodnotou parametru 1 0xF6.
Aktivace této možnosti
Pro jeden nebo více ovladačů můžete aktivovat možnost Různé kontroly pomocí Správce ověření ovladačů nebo příkazového řádku Verifier.exe. Podrobnosti najdete v tématu Výběr možností ověření ovladače.
Na příkazovém řádku
Na příkazovém řádku je možnost Různé kontroly reprezentována bitem 11 (0x800). Chcete-li aktivovat různé kontroly, použijte hodnotu příznaku 0x800 nebo přidejte 0x800 k hodnotě příznaku. Například:
verifier /flags 0x800 /driver MyDriver.sysTato možnost bude aktivní po dalším spuštění.
V systému Windows Vista a novějších verzích systému Windows můžete také aktivovat a deaktivovat různé kontroly bez restartování počítače přidáním parametru /volatile do příkazu. Například:
verifier /volatile /flags 0x800 /adddriver MyDriver.sysToto nastavení je efektivní okamžitě, ale při vypnutí nebo restartování počítače dojde ke ztrátě. Podrobnosti najdete v tématu Použití volatile nastavení.
Možnost Různé kontroly je také součástí standardního nastavení. Například:
verifier /standard /driver MyDriver.sysPoužití Správce ověřovatele ovladačů
Spusťte Správce ověřovatele ovladačů. Do okna příkazového řádku zadejte ověřitel .
Vyberte Vytvořit vlastní nastavení (pro vývojáře kódu) a potom klikněte na Tlačítko Další.
Vyberte jednotlivá nastavení z úplného seznamu.
Vyberte Různé kontroly.
Funkce Různé kontroly je také součástí standardního nastavení. Chcete-li použít tuto funkci, klikněte ve Správci ověření ovladače na tlačítko Vytvořit standardní nastavení.
Zobrazení výsledků
Pokud chcete zobrazit výsledky možnosti Různé kontroly, použijte rozšíření !verifier v ladicím programu jádra. (Informace o nástroji !verifier naleznete v dokumentaci k nástrojům ladění pro Windows .)
V následujícím příkladu možnost Různé kontroly detekovala aktivní strukturu ERESOURCE v paměti, kterou se ovladač pokoušel uvolnit, čímž vznikla kontrola chyb 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION. Zobrazení kontroly chyb 0xC4 zahrnuje adresu ERESOURCE a ovlivněnou paměť.
1: kd> !verifier 1
Verify Level 800 ... enabled options are:
Miscellaneous checks enabled
Summary of All Verifier Statistics
RaiseIrqls 0x0
AcquireSpinLocks 0x0
Synch Executions 0x0
Trims 0x0
Pool Allocations Attempted 0x1
Pool Allocations Succeeded 0x1
Pool Allocations Succeeded SpecialPool 0x0
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x0
Resource Allocations Failed Deliberately 0x0
Current paged pool allocations 0x0 for 00000000 bytes
Peak paged pool allocations 0x0 for 00000000 bytes
Current nonpaged pool allocations 0x0 for 00000000 bytes
Peak nonpaged pool allocations 0x0 for 00000000 bytes
Driver Verification List
Entry State NonPagedPool PagedPool Module
8459ca50 Loaded 00000000 00000000 buggy.sys
*** Fatal System Error: 0x000000c4
(0x000000D2,0x9655D4A8,0x9655D468,0x000000B0)
0xD2 : Freeing pool allocation that contains active ERESOURCE.
2 - ERESOURCE address.
3 - Pool allocation start address.
4 - Pool allocation size.
Pokud chcete prozkoumat přidělení fondu, použijte rozšíření ladicího programu !pool s počáteční adresou přidělení fondu 9655D468. (Příznak 2 zobrazuje informace v hlavičce pouze pro fond, který obsahuje zadanou adresu. Hlavičky ostatních fondů se nezobrazují.)
1: kd> !pool 9655d468 2
Pool page 9655d468 region is Paged pool
*9655d468 size: b0 previous size: 8 (Allocated) *Bug_
Informace o ERESOURCE najdete pomocí rozšíření ladicího programu !locks (!kdext*.locks) s adresou struktury.
1: kd> !locks 0x9655D4A8 <<<<<- ERESOURCE @0x9655D4A8 lives inside the pool block being freed
Resource @ 0x9655d4a8 Available
1 total locks
Můžete také použít příkaz ladicího programu kb k zobrazení sledování zásobníku volání, která vedla k selhání. Následující příklad ukazuje zásobník, včetně volání ExFreePoolWithTag, zachycené Driver Verifierem.
1: kd> kb
ChildEBP RetAddr Args to Child
92f6374c 82c2c95a 00000003 92f68cdc 00000000 nt!RtlpBreakWithStatusInstruction
92f6379c 82c2d345 00000003 9655d468 000000c4 nt!KiBugCheckDebugBreak+0x1c
92f63b48 82c2c804 000000c4 000000d2 9655d4a8 nt!KeBugCheck2+0x5a9
92f63b6c 82e73bae 000000c4 000000d2 9655d4a8 nt!KeBugCheckEx+0x1e
92f63b88 82e78c32 9655d4a8 9655d468 000000b0 nt!VerifierBugCheckIfAppropriate+0x3c
92f63ba4 82ca7dcb 9655d468 000000b0 00000000 nt!VfCheckForResource+0x52
92f63bc8 82e7fb2d 000000b0 00000190 9655d470 nt!ExpCheckForResource+0x21
92f63be4 82e6dc6c 9655d470 92f63c18 89b6c58c nt!ExFreePoolSanityChecks+0x1fb
92f63bf0 89b6c58c 9655d470 00000000 89b74194 nt!VerifierExFreePoolWithTag+0x28
92f63c00 89b6c0f6 846550c8 846550c8 846e2200 buggy!MmTestProbeLockForEverStress+0x2e
92f63c18 82e6c5f1 846e2200 846550c8 85362e30 buggy!TdDeviceControl+0xc4
92f63c38 82c1fd81 82d4d148 846550c8 846e2200 nt!IovCallDriver+0x251
92f63c4c 82d4d148 85362e30 846550c8 84655138 nt!IofCallDriver+0x1b
92f63c6c 82d4df9e 846e2200 85362e30 00000000 nt!IopSynchronousServiceTail+0x1e6
92f63d00 82d527be 00000001 846550c8 00000000 nt!IopXxxControlFile+0x684
92f63d34 82cb9efc 0000004c 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
92f63d34 6a22b204 0000004c 00000000 00000000 nt!KiFastCallEntry+0x12c