Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Illesztőprogram-ellenőrző Egyéb ellenőrzések lehetőségével figyeli az illesztőprogramot olyan gyakori hibák esetén, amelyek az illesztőprogram vagy a rendszer összeomlását okozzák, például az aktív kernelobjektumokat tartalmazó memória felszabadítása.
Pontosabban a Vegyes ellenőrzések beállítás a következő helytelen illesztőprogram-viselkedést keresi:
Aktív munkaelemek felszabadított memóriában. Az illesztőprogram meghívja az ExFreePoolt egy készletblokk felszabadítására, amely az IoQueueWorkItem használatával várólistára helyezett munkaelemeket tartalmaz.
Aktív erőforrások felszabadított memóriában. Az illesztőprogram meghívja az ExFreePoolt , hogy felszabadítsa az aktív ERESOURCE-struktúrákat tartalmazó készletblokkot. Az illesztőprogramnak az ExFreePool hívása előtt meg kell hívnia az ExDeleteResource-t az ERESOURCE-objektumok törléséhez.
Aktív lookaside listák felszabadított memóriában. Az illesztőprogram meghívja az ExFreePoolt egy készletblokk felszabadítására, amely továbbra is aktív lookaside-listákat (NPAGED_LOOKASIDE_LIST vagy PAGED_LOOKASIDE_LIST struktúrákat tartalmaz. Az illesztőprogramnak az ExFreePool hívása előtt meg kell hívnia az ExDeleteNPagedLookasideList vagy az ExDeletePagedLookasideList parancsot a lookaside listák törléséhez.
Windows Management Instrumentation (WMI) és Event Tracing for Windows (ETW) regisztrációval kapcsolatos problémák. Az illesztőprogram-ellenőrző által észlelt ilyen problémák a következők:
Olyan illesztőprogram, amely a WMI-visszahívás regisztrációjának törlése nélkül próbál kipakolni.
Olyan illesztőprogram, amely olyan eszközobjektumot próbál törölni, amely nem lett regisztrálva a WMI-ből.
Olyan illesztőprogram, amely az ETW kernel módú szolgáltatói regisztrációjának törlése nélkül próbál meg kipakolni.
Egy olyan illesztőprogram, amely megkísérli törölni a regisztrációt egy már regisztrációból törölt szolgáltatóhoz.
Kernelkezelő hibák. (Windows Vista és újabb verziók) A Vegyes ellenőrzések lehetőség engedélyezése lehetővé teszi a rendszerfolyamat leírókövetését is, hogy segítsen a kernel leíró szivárgások kivizsgálásában és a Hibaellenőrzés 0x93: INVALID_KERNEL_HANDLE. Ha a fogantyúkövetés engedélyezve van, a kernel veremnyomokat gyűjt a legutóbbi leírók megnyitási és bezárási műveleteinél. A veremnyomok a ! htrace hibakereső bővítmény használatával jeleníthetők meg a kernel-hibakeresőben. A !htrace-ről további információt a Windows hibakeresési eszközeinek dokumentációjában talál.
Felhasználói módú kezelő kernel módú hozzáféréssel A Windows 7-től kezdve, amikor a Vegyes ellenőrzések lehetőséget választja, az Illesztőprogram-ellenőrző az ObReferenceObjectByHandle hívásait is ellenőrzi. Kernel módú hozzáféréssel nem lehet felhasználói módú fogantyút átadni. Ha ilyen művelet történik, az Illesztőprogram-ellenőrző kiad egy 0xC4 hibajelentést, ahol az 1. paraméter értéke 0xF6.
UserMode várakozás kernel veremre allokált szinkronizációs objektumokra
A Windows 7-től kezdve az Illesztőprogram-ellenőrző képes észlelni azokat a további módszereket, amelyekkel az illesztőprogramok helytelenül használhatják az operációs rendszer által biztosított többszálú szinkronizálási mechanizmusokat.
A kernelverem helyi változóiként szinkronizálási objektumokat, például KEVENT-struktúrákat használni gyakori eljárás. Miközben egy folyamat betöltődik a memóriába, a szálak kernelveremei soha nem lesznek levágva a munkakészletből, és nem lapozhatók ki a lemezre. Az ilyen nem lapozható memóriában lévő szinkronizálási objektumok kiosztása helyes.
Ha azonban az illesztőprogramok olyan API-kat hívnak meg, mint a KeWaitForSingleObject vagy a KeWaitForMultipleObjects, hogy megvárják a veremen lefoglalt objektumot, meg kell adniuk az API WaitMode paraméterének KernelMode értékét. Ha egy folyamat összes szála UserMode módban várakozik, a folyamat jogosulttá válik arra, hogy kiíródjon a lemezre. Ezért ha egy illesztő a UserMode paramétert adta meg a WaitMode paraméterként, az operációs rendszer felcserélheti az aktuális folyamatot mindaddig, amíg az ugyanabban a folyamatban lévő összes többi szál is a UserMode-ra vár. A teljes folyamat lemezre való áthelyezése magában foglalja a kernelveremek lapozását is. Az operációs rendszer által felcserélt szinkronizálási objektumra való várakozás helytelen. Egy ponton létre kell jönnie egy szálnak, és jeleznie kell a szinkronizálási objektumot. A szinkronizáló objektum jelzése során a Windows kernel módosítja az objektumot IRQL = DISPATCH_LEVEL vagy magasabb szinten. Ha a DISPATCH_LEVEL vagy annál magasabb szinten kilapozott vagy felcserélt memóriát megérinti, rendszerösszeomlást eredményez.
A Windows 7-től kezdve, amikor a Vegyes ellenőrzések lehetőséget választja, az Illesztőprogram-ellenőrző ellenőrzi, hogy az ellenőrzött illesztőprogram által a UserMode-ban való várakozáshoz használt szinkronizálási objektumok nincsenek-e lefoglalva az aktuális szál kernelveremén. Ha az Illesztőprogram-ellenőrző ilyen helytelen várakozást észlel, kiad egy Hibaellenőrzés 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION hibát, 1-es paraméter értékével (0x123).
Helytelen kernelkezelő-hivatkozások
Minden Windows-folyamat rendelkezik egy leírótáblával. A fogantyútáblázatot tekintheti egy fogantyú bejegyzések tömbjeként. Minden érvényes fogantyúérték érvényes bejegyzésre hivatkozik ebben a tömbben.
A rendszermag fogópontja a rendszerfolyamat leírótáblájára érvényes fogópont. Egy felhasználói leíró, amely minden folyamathoz érvényes, kivéve a rendszerfolyamatot.
A Windows 7-ben az Illesztőprogram-ellenőrző észleli, hogy a rendszermag helytelen leíró értékeire próbál hivatkozni. Ezek az illesztőprogrami hibák hibaellenőrzés 0x93 ként jelennek meg: INVALID_KERNEL_HANDLE, ha engedélyezve van az Illesztőprogram-ellenőrző egyéb ellenőrzések opció. Az ilyen típusú helytelen fogantyú hivatkozás általában azt jelenti, hogy az illesztőprogram már bezárta ezt a fogantyút, de a használatát próbálja folytatni. Ez a fajta hiba kiszámíthatatlan problémákat okozhat a rendszer számára, mivel a hivatkozott leíróértéket már egy másik, nem kapcsolódó illesztőprogram is újra felhasználhatta.
Ha egy kernelillesztő nemrég bezárt egy kernelfogópontot, és később a bezárt fogópontra hivatkozik, az Illesztőprogram-ellenőrző a már említett módon hibaellenőrzést kezdeményez. Ebben az esetben a !htrace hibakereső bővítmény kimenete adja meg a fogópontot lezáró kódútvonal veremkövetését. Használja a rendszerfolyamat címét a !htrace paramétereként. A rendszerfolyamat címének megkereséséhez használja a !process 4 0 parancsot.
A Windows 7-től kezdve az Illesztőprogram-ellenőrző hozzáad egy ellenőrzést az ObReferenceObjectByHandle-hez. Mostantól tilos KernelMode hozzáféréssel rendelkező felhasználói tér leírót átadni. Ha ilyen kombinációt észlel az Illesztőprogram-ellenőrző, Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION jelenik meg, az 1. paraméter értéke 0xF6.
A beállítás aktiválása
Az Illesztőprogram-ellenőrző kezelő vagy a Verifier.exe parancssor használatával aktiválhatja egy vagy több illesztőprogram Eltérő ellenőrzések beállítását. További részletekért lásd: Illesztőprogram-ellenőrző beállításainak kiválasztása.
A parancssorban
A parancssorban a Vegyes ellenőrzések lehetőséget a 11. bit (0x800) jelöli. A vegyes ellenőrzések aktiválásához használjon egy 0x800 jelzőértéket, vagy adjon hozzá 0x800 a jelzőértékhez. Például:
verifier /flags 0x800 /driver MyDriver.sysA beállítás a következő rendszerindítás után aktív lesz.
A Windows Vista és a Windows újabb verzióiban is aktiválhatja és inaktiválhatja a vegyes ellenőrzéseket a számítógép újraindítása nélkül, ha hozzáadja a /volatile paramétert a parancshoz. Például:
verifier /volatile /flags 0x800 /adddriver MyDriver.sysEz a beállítás azonnal érvénybe lép, de a számítógép leállítása vagy újraindításakor elveszik. További részletekért lásd Illékony beállítások használata.
A Vegyes ellenőrzések lehetőség a szokásos beállítások között is szerepel. Például:
verifier /standard /driver MyDriver.sysDriver Verifier Manager használata
Indítsa el a Meghajtó Ellenőrző Kezelőt. Írja be Verifier parancssori ablakba.
Válassza az Egyéni beállítások létrehozása (kódfejlesztők számára) lehetőséget, majd kattintson a Tovább gombra.
Válassza Egyéni beállítások kiválasztása a teljes listából.
Válassza a Vegyes ellenőrzések lehetőséget.
A vegyes ellenőrzések funkció a szokásos beállításokban is megtalálható. A funkció használatához a Driver Verifier Managerben kattintson a Standard beállítások létrehozásaelemre.
Az eredmények megtekintése
A Vegyes ellenőrzések lehetőség eredményeinek megtekintéséhez használja a !verifier bővítményt a kernel hibakeresőjében. (A !verifierről további információt a Windows hibakeresési eszközeinek dokumentációjában talál.)
A következő példában a Vegyes ellenőrzések opció aktív ERESOURCE-struktúrát észlelt a memóriában, amelyet az illesztőprogram megpróbált felszabadítani, ami hibaellenőrzést eredményezett 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION. A Hibaellenőrzés 0xC4 kijelző tartalmazza az ERESOURCE címét és az érintett memóriát.
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.
A készletfoglalás vizsgálatához használja a !készlet hibakereső bővítményét a készletfoglalás kezdőcímével( 9655D468). (A 2 jelző csak a megadott címet tartalmazó készlet fejlécadatait jeleníti meg. A többi készlet fejlécadatai le vannak tiltva.)
1: kd> !pool 9655d468 2
Pool page 9655d468 region is Paged pool
*9655d468 size: b0 previous size: 8 (Allocated) *Bug_
Az ERESOURCE-val kapcsolatos információk megkereséséhez használja a !locks (!kdext*.locks) hibakereső bővítményt a struktúra címével.
1: kd> !locks 0x9655D4A8 <<<<<- ERESOURCE @0x9655D4A8 lives inside the pool block being freed
Resource @ 0x9655d4a8 Available
1 total locks
A kb hibakereső paranccsal is megjelenítheti a hibához vezető hívások stack-nyomkövetését. Az alábbi példa a vermet mutatja be, beleértve az ExFreePoolWithTag hívását is, amelyet a Driver Verifier eszköz elfogott.
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