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.
A Driver Verifier két szintű I/O-ellenőrzéssel rendelkezik:
Az 1. szintű I/O-ellenőrzés mindig aktív az I/O-ellenőrzés kiválasztásakor.
A 2. szintű I/O-ellenőrzés mindig aktív, amikor az I/O-ellenőrzés ki van választva a Windows XP és újabb verziókban.
Lásd még:Továbbfejlesztett I/O-ellenőrzés A Windows operációs rendszer Windows 7-ben és újabb verzióiban a továbbfejlesztett I/O-ellenőrzés automatikusan aktiválódik az I/O-ellenőrzés kiválasztásakor. Nem érhető el, és nem szükséges külön beállításként kiválasztani.
1. szintű I/O-ellenőrzés
Ha az 1. szintű I/O-ellenőrzés engedélyezve van, az IoAllocateIrp használatával beszerzett összes IRP egy speciális medencéből vannak lefoglalva, és a használatuk nyomon követhető.
Emellett az Illesztőprogram-ellenőrző ellenőrzi az érvénytelen I/O-hívásokat, ideértve a következő elemeket is:
Olyan IRP felszabadítására tett kísérletek, amelyek típusa nem IO_TYPE_IRP
Érvénytelen eszközobjektumok átadása az IoCallDriver-nak
Egy IRP átadva az IoCompleteRequestnek , amely érvénytelen állapotot tartalmaz, vagy amelynek még van megszakítási rutinkészlete
Az IRQL módosítása az illesztőprogram-küldési rutin hívása során
Kísérlet egy szálhoz társított IRP felszabadítására
Egy eszközobjektum átadva az IoInitializeTimernek , amely már tartalmaz inicializált időzítőt
Érvénytelen puffert ad át az IoBuildAsynchronousFsdRequest vagy az IoBuildDeviceIoControlRequest funkciónak.
Egy I/O állapotblokkot ad át egy IRP-nek, amikor az az I/O állapotblokk egy olyan veremen van lefoglalva, amely túl messzire került visszagöngyölítés során.
Eseményobjektum átadása egy IRP-nek, ha az eseményobjektum egy olyan veremen van lefoglalva, amely túl messze van a megkerülő megoldástól
Mivel a speciális IRP-készlet mérete korlátozott, az I/O-ellenőrzés akkor a leghatékonyabb, ha egyszerre csak egy illesztőprogramon használják.
Az 1. szintű I/O-ellenőrzési hibák hibakeresési 0xC9 kiadását okozzák. A hibaellenőrzés első paramétere jelzi, hogy milyen szabálysértés történt. A teljes paraméterlista a 0xC9-es hibaellenőrzés (DRIVER_VERIFIER_IOMANAGER_VIOLATION) alatt található.
2. szintű I/O-ellenőrzés
A 2. szintű I/O-ellenőrzési hibák különböző módokon jelennek meg: a kék képernyőn, egy összeomlási memóriaképfájlban és egy kernel-hibakeresőben.
A kék képernyőn ezeket a hibákat az IO SYSTEM VERIFICATION ERROR és a WDM DRIVER ERRORXXX sztring jelzi, ahol a XXX egy I/O hibakód.
Egy összeomlási memóriaképfájlban a hibák többségét a BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) üzenet, valamint az I/O hibakód jelzi. Ebben az esetben az I/O hibakód jelenik meg a hibaellenőrzési 0xC9 első paramétereként. A fennmaradókat a Hibaellenőrzés 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) üzenet, valamint egy Illesztőprogram-ellenőrző hibakód jelzi. Ebben az esetben az Illesztőprogram-ellenőrző hibakód jelenik meg a hibaellenőrzés első paramétereként 0xC4.
Egy kernel-hibakeresőben (KD vagy WinDbg) ezeket a hibákat a WDM DRIVER ERROR üzenet és egy leíró szöveges sztring jelzi. Ha a kernel hibakeresője aktív, figyelmen kívül hagyhatja a 2. szintű hibákat, és folytathatja a rendszerműveletet. (Ez más hibaellenőrzésekkel nem lehetséges.)
A kék képernyő, az összeomlási memóriaképfájl és a kernel hibakeresője is további információkat jelenít meg. A legtöbb 2. szintű I/O-ellenőrzési hibaüzenet teljes leírását a Hibaellenőrzési 0xC9 című témakörben találhatja meg. A többit lásd: Hibaellenőrzés 0xC4.
A Windows Vista-tól kezdve az I/O-ellenőrzés beállítás a következő illesztőprogram-hibákat ellenőrzi:
A felhasználói módú alkalmazásokból származó I/O-kérelmek befejezése és megszakítása túl sokáig tart.
A még nem megszerzett eltávolítási zárolás feloldása.
Az IoReleaseRemoveLock vagy az IoReleaseRemoveLockAndWait hívása olyan címkeparaméterrel, amely eltér a megfelelő IoAcquireRemoveLock-hívásban használt címkeparamétertől.
Az IoCallDriver meghívása letiltott megszakításokkal.
Az IoCallDriver hívása DISPATCH_LEVEL feletti IRQL-en.
Visszaérkezés az illesztőprogramok diszpécserelési rutinjából letiltott megszakításokkal.
Visszatérés egy illesztőprogram-feladási rutinból egy módosított IRQL-vel.
Visszaérkezés egy illesztőprogram-feladási rutinból letiltott APCs-ekkel. Ebben az esetben előfordulhat, hogy az illesztőprogram többször hívta meg a KeEnterCriticalRegion függvényt, mint a KeLeaveCriticalRegion-t, ami a 0x20-as hibakeresés (KERNEL_APC_PENDING_DURING_EXIT) és a 0x1-es hibakeresés (APC_INDEX_MISMATCH) elsődleges oka.
A Windows 7-től kezdődően az I/O-ellenőrzési beállítás a következő illesztőprogram-hibákat ellenőrzi:
- Megpróbálja felszabadítani az I/O kéréscsomagokat az ExFreePool meghívásával. Az IRP-ket az IoFreeIrp használatával kell felszabadítani.
Emellett ezzel a beállítással egy másik gyakori illesztőprogram-hibát is észlelhet – az eltávolítási zárak újbóli inicializálását. Az adatstruktúrák, amelyek eltávolítják a zárolásokat, az eszközbővítményeken belül legyenek lefoglalva. Ez biztosítja, hogy az I/O-kezelő csak az eszközobjektum törlésekor szabadítsa fel a IO_REMOVE_LOCK struktúrát tartalmazó memóriát. Ha az illesztőprogram a következő három lépést hajtja végre, lehetséges, hogy a 2. lépés után egy alkalmazás vagy illesztőprogram továbbra is hivatkozik az 1. eszközre:
- Az Eszköz1-nek megfelelő IO_REMOVE_LOCK struktúrát foglalja le, de a kiosztás nem az Eszköz1 bővítményén kívül történik.
- Az IoReleaseRemoveLockAndWait hívása az Eszköz1 eltávolításakor.
- Meghívja az IoInitializeRemoveLock függvényt ugyanahhoz a zároláshoz, hogy azt újra felhasználja a Device2 eltávolítási zárolásaként.
Lehetséges, hogy a 2. lépés után egy alkalmazás vagy illesztőprogram továbbra is hivatkozik az Eszköz1 eszközre. Az alkalmazás vagy az illesztőprogram továbbra is küldhet kéréseket az Eszköz1 eszköznek, annak ellenére, hogy az eszköz el lett távolítva. Ezért nem biztonságos újra felhasználni ugyanazt a memóriát, mint egy új eltávolítási zárolás, amíg az I/O-kezelő nem törli az Eszköz1 eszközt. Azonos zár újrainicializálása, miközben egy másik szál megpróbálja megszerezni, a zár sérüléséhez vezethet, és a meghajtóprogram, valamint az egész rendszer kiszámíthatatlan eredményeihez vezethet.
A Windows operációs rendszer Windows 7- és újabb verzióiban a bővített I/O-ellenőrzés automatikusan aktiválódik az I/O-ellenőrzés kiválasztásakor.
A beállítás aktiválása
Egy vagy több illesztőprogram I/O-ellenőrzési funkcióját az Illesztőprogram-ellenőrző kezelő vagy a Verifier.exe parancssor használatával aktiválhatja. További részletekért lásd: Illesztőprogram-ellenőrző beállításainak kiválasztása.
A parancssorban.
A parancssorban az I/O-ellenőrzés lehetőséget a 4. bit (0x10) jelöli. Az I/O-ellenőrzés aktiválásához használjon egy 0x10 jelzőértéket, vagy adjon hozzá 0x10 a jelzőértékhez. Például:
verifier /flags 0x10 /driver MyDriver.sysA funkció a következő rendszerindítás után aktív lesz.
Az I/O-ellenőrzés aktiválása és inaktiválása a számítógép újraindítása nélkül is lehetővé teszi a /volatile paraméter hozzáadását a parancshoz. Például:
verifier /volatile /flags 0x10 /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.
Az I/O-ellenőrzés funkció a szokásos beállításokban is megtalálható. Például:
verifier /standard /driver MyDriver.sysDriver Verifier Manager használata
- Válassza Egyéni beállítások létrehozása (kódfejlesztőknek) lehetőséget, majd kattintson a Továbbgombra.
- Válassza Egyéni beállítások kiválasztása a teljes listából.
- Válassza ki (ellenőrizze) az I/O-ellenőrzést.
Az I/O-ellenőrzés 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.