Megosztás:


Automatikus ellenőrzések

Az Illesztőprogram-ellenőrző a következő ellenőrzéseket hajtja végre, amikor egy vagy több illesztőprogramot ellenőriz. Ezeket az ellenőrzéseket nem lehet aktiválni vagy inaktiválni. A Windows 10 1709-es verziójától kezdve ezek az automatikus ellenőrzések át lettek helyezve a megfelelő szabványos jelzőkbe. Ennek eredményeképpen az illesztőprogram-ellenőrzőt a szabványos jelzőkkel engedélyező felhasználók nem láthatják az ellenőrzések csökkenését.

Az IRQL és a memória rutinjainak monitorozása

A Driver Verifier a következő tiltott műveletekhez figyeli a kiválasztott illesztőprogramot:

  • Az IRQL növelése a KeLowerIrql meghívásával

  • Az IRQL csökkentése a KeRaiseIrql meghívásával

  • Nulla méretű memóriafoglalás kérése

  • Lapozott készlet kiosztása vagy felszabadítása IRQL-APC_LEVEL >

  • Nem lapozható készlet kiosztása vagy felszabadítása IRQL-DISPATCH_LEVEL >

  • Egy korábbi foglalásból nem visszaadott cím felszabadítása

  • Kísérlet egy már felszabadított cím újbóli felszabadítására

  • Gyors mutex megszerzése vagy elengedése IRQL APC_LEVEL >

  • IRQL nem egyenlő a DISPATCH_LEVEL-el spin lock beszerzése vagy feloldása.

  • Forgózár kétszeri feloldása.

  • Kiosztási kérelem megjelölése: MUST_SUCCEED. Ilyen kérések soha nem megengedettek.

Ha az Illesztőprogram-ellenőrző nem aktív, előfordulhat, hogy ezek a szabálysértések nem okoznak azonnali rendszerösszeomlást minden esetben. Az Illesztőprogram-ellenőrző figyeli az illesztőprogram viselkedését, és 0xC4-es hibaellenőrzést ad ki, ha ezek a szabálysértések előfordulnak. Lásd a Hibaellenőrzés 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) című témakört a hibaellenőrzési paraméterek listájáért.

Ellenőrzése a veremcserének

Az Illesztőprogram-ellenőrző az ellenőrzés alatt álló illesztőprogram veremhasználatát figyeli. Ha az illesztőprogram átváltja a vermet, és az új verem nem szálverem vagy DPC-verem, a rendszer hibaellenőrzést ad ki. (Ez a 0xC4 hibaellenőrzés az első paraméterrel egyenlő 0x90.) A KB hibakereső parancs által megjelenített verem általában felfedi a műveletet végrehajtó illesztőprogramot.

Az illesztőprogram eltávolításának ellenőrzése

Miután az ellenőrzött illesztőprogramot eltávolították, a Driver Verifier több ellenőrzést is végrehajt, hogy meggyőződjön arról, hogy az illesztőprogram ki lett takarítva.

A Driver Verifier különösen a következőket keresi:

  • Nem törölt időzítők

  • Függőben lévő halasztott eljáráshívások (DPC-k)

  • Nem törölt lookaside listák

  • Nem törölt feldolgozói szálak

  • Nem törölt üzenetsorok

  • Egyéb hasonló erőforrások

Az ilyen problémák miatt előfordulhat, hogy az illesztőprogram kiürítése után egy ideig rendszerhiba-ellenőrzéseket kell kibocsátani, és a hibaellenőrzések okát nehéz lehet megállapítani. Ha a Driver Verifier aktív, az ilyen szabálysértések a 0xC7 hibaellenőrzés kiadását eredményezik közvetlenül az illesztőprogram eltávolítása után. A hibaellenőrzési paraméterek listáját a Hibaellenőrző 0xC7 (TIMER_OR_DPC_INVALID) résznél találja.

Memórialeírók (MDL) használatának monitorozása

Windows Vista rendszerben az Illesztőprogram-ellenőrző a kijelölt illesztőprogramot is figyeli a következő tiltott műveletekhez:

  • Az MmProbeAndLockPages vagy az MmProbeAndLockProcessPages meghívása olyan MDL-en, amely nem rendelkezik a megfelelő jelzőkkel. Helytelen például az MmProbeAndLockPages meghívása az MmBuildMdlForNonPagedPool használatával létrehozott MDL-hez.

  • Az MmMapLockedPages meghívása olyan MDL-n, amely nem rendelkezik a megfelelő jelzőkkel. Helytelen például az MmMapLockedPages meghívása egy olyan MDL-hez, amely már le van képezve egy rendszercímre, vagy egy olyan MDL-re, amely nincs zárolva.

  • Az MmUnlockPages vagy az MmUnmapLockedPages meghívása a részleges MDL-n, azaz az IoBuildPartialMdl használatával létrehozott MDL-n.

  • Az MmUnmapLockedPages meghívása egy olyan MDL objektumon, amely nincs rendszercímre leképezve.

Ha az Illesztőprogram-ellenőrző nem aktív, előfordulhat, hogy ezek a szabálysértések miatt a rendszer nem válaszol azonnal minden esetben. Az Illesztőprogram-ellenőrző figyeli az illesztőprogram viselkedését, és 0xC4-es hibaellenőrzést ad ki, ha ezek a szabálysértések előfordulnak. Lásd a Hibaellenőrzés 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) című témakört a hibaellenőrzési paraméterek listájáért.

Szinkronizálási objektum lefoglalása a NonPagedPoolSession memóriából

A Windows 7-től kezdve az Illesztőprogram-ellenőrző ellenőrzi a munkamenet memóriájából származó szinkronizálási objektumokat.

A szinkronizálási objektumoknak nem lapozhatónak kell lenniük. Emellett a globális, rendszerszintű virtuális címtérben kell élniük.

A grafikus illesztőprogramok az API-k, például az EngAllocMem meghívásával lefoglalhatják a munkamenet memóriáját. A globális címtértől eltérően a munkamenet-címtér minden terminálkiszolgáló-munkamenethez virtualizálva van. Ez azt jelenti, hogy ugyanaz a virtuális cím, amelyet két különböző munkamenet kontextusában használnak, két különböző objektumra utal. A Windows kernelnek képesnek kell lennie a szinkronizálási objektumok elérésére bármely terminálkiszolgáló-munkamenetből. Ha egy munkamenet memóriacímére próbál hivatkozni egy másik munkamenetből, az kiszámíthatatlan eredményeket eredményez, például rendszerösszeomlást vagy egy másik munkamenet adatainak csendes sérülését.

Windows 7-től kezdve, amikor egy ellenőrzött illesztőprogram inicializál egy szinkronizálási objektumot olyan API-k meghívásával, mint a KeInitializeEvent vagy a KeInitializeMutex, az illesztőprogram-ellenőrző ellenőrzi, hogy az objektum címe a munkamenet virtuális címterébe esik-e. Ha az Illesztőprogram-ellenőrző ilyen típusú helytelen címet észlel, kiad egy 0xC4 hibaellenőrzést: DRIVER_VERIFIER_DETECTED_VIOLATION, ahol az 1. paraméter értéke 0xDF.

Objektumhivatkozás számlálója 0-ról 1-re módosul

A Windows 7-től kezdve az Illesztőprogram-ellenőrző ellenőrzi a helytelen objektumhivatkozások további osztályait.

Amikor a Windows kernelobjektum-kezelő létrehoz egy objektumot( például fájlobjektumot vagy szálobjektumot), az új objektum hivatkozásszámlálója 1 értékre van állítva. A referenciaszámlálót olyan API-k hívásai növelik, mint az ObReferenceObjectByPointer vagy az ObReferenceObjectByHandle. A referenciaszámlálót minden ObDereferenceObject hívás ugyanahhoz az objektumhoz dekrementálja.

Miután a hivatkozásszámláló elérte a 0 értéket, az objektum jogosulttá válik a felszabadításra. Előfordulhat, hogy az objektumkezelő azonnal felszabadítja, vagy később felszabadítja. Az ObReferenceObjectByPointer vagy ObDereferenceObject meghívása és a referenciaszámláló 0-ról 1-re történő módosítása egy már felszabadított objektum referenciaszámlálójának növelését jelenti. Ez mindig helytelen, mert az mások memóriafoglalásának sérülését okozhatja.

Rendszerleállítási blokkok vagy késések

A Windows 7-től kezdődően az Illesztőprogram-ellenőrző hibát okoz a kernel hibakeresőjében, ha a rendszer leállítása nem fejeződik be 20 perccel a kezdés után. A Driver Verifier a rendszerleállítás kezdetét rendeli hozzá a Windows kernel különböző alrendszereinek( például a Beállításjegyzék, a Plug And Play vagy az I/O-kezelő alrendszerek) leállításának megkezdéséhez.

Ha kernel- vagy rendszermagszintű hibakereső nincs csatlakoztatva a rendszerhez, az Illesztőprogram-ellenőrző kiad egy Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION hibát, az 1. paraméter értéke 0x115, a töréspont helyett.

A 20 percnél rövidebb ideig nem befejezhető rendszerleállítás gyakran azt jelzi, hogy a rendszeren futó egyik illesztőprogram hibásan működik. A kernel hibakeresőjének !analyze -v futtatása megjeleníti a leállításért felelős rendszer munkaszál veremnyomát. Meg kell vizsgálnia a verem nyomkövetését, és meg kell állapítania, hogy a leállítási szálat blokkolta-e a tesztelt illesztőprogramok egyike.

Néha a rendszer nem tud leállni, mert nagy terheléses tesztelésnek van alávetve – annak ellenére, hogy minden illesztőprogram megfelelően működik. A felhasználó dönthet úgy, hogy folytatja a végrehajtást az illesztőprogram-ellenőrző töréspontja után, és ellenőrizheti, hogy a rendszer végül leáll-e.