Ověřování vstupně-výstupních operací

Ověřovač ovladačů má dvě úrovně I/O ověřování:

  • Ověřování vstupně-výstupních operací úrovně 1 je vždy aktivní, kdykoli je vybráno ověřování vstupně-výstupních operací.

  • Ověřování vstupně-výstupních operací úrovně 2 je vždy aktivní, když je vybráno ověření vstupně-výstupních operací ve Windows XP a novějších.

Viz Také:Rozšířené ověřování vstupně-výstupních operací ve Windows 7 a novějších verzích operačního systému Windows, rozšířené vstupně-výstupní ověřování se aktivuje automaticky při výběru V/V Ověření. Není k dispozici nebo je nutné ji vybrat jako samostatnou možnost.

Ověřování vstupně-výstupních operací úrovně 1

Pokud je povolené ověřování vstupně-výstupních operací úrovně 1, přidělují se všechny IRP získané prostřednictvím IoAllocateIrp ze speciálního fondu a jejich použití se sleduje.

Kromě toho nástroj Driver Verifier kontroluje neplatná volání vstupně-výstupních operací, včetně:

  • Pokusí se uvolnit IRP, jehož typ není IO_TYPE_IRP

  • Předávání neplatných objektů zařízení do funkce IoCallDriver.

  • Předávání IRP do IoCompleteRequest , které obsahuje neplatný stav nebo má stále nastavenou rutinu zrušení.

  • Změny IRQL během volání dispečerské rutiny ovladače

  • Pokusy o uvolnění protokolu IRP, který zůstává přidružený k vláknu

  • Předává objekt zařízení do IoInitializeTimer , který již obsahuje inicializovaný časovač.

  • Opakované předání neplatné vyrovnávací paměti do funkcí IoBuildAsynchronousFsdRequest nebo IoBuildDeviceIoControlRequest.

  • Předání bloku stavu vstupně-výstupních operací do IRP, když je tento blok přidělen na zásobníku, který se příliš rozbalil.

  • Předání objektu události do IRP, když je tento objekt události přidělen do zásobníku, který byl příliš rozvinutý.

Vzhledem k tomu, že speciální fond IRP má omezenou velikost, je ověřování vstupně-výstupních operací nejúčinnější, pokud se používá pouze na jednom ovladači najednou.

Selhání ověřování vstupně-výstupních operací úrovně 1 způsobují vyvolání kontroly chyb 0xC9. První parametr této kontroly chyb označuje, k jakému narušení došlo. Úplný výpis parametrů najdete v části Kontrola chyb 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION).

Ověřování vstupně-výstupních operací úrovně 2

Chyby ověřování vstupně-výstupních operací úrovně 2 se zobrazují různými způsoby: na modré obrazovce, v souboru s výpisem stavu systému a v ladicím programu jádra.

Na modré obrazovce jsou tyto chyby zaznamenány zprávou IO SYSTEM VERIFICATION ERROR a řetězec WDM DRIVER ERRORXXX, kde XXX je V/V kód chyby.

V souboru s výpisem stavu systému je většina těchto chyb zaznamenána zprávou BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) spolu s kódem chyby vstupně-výstupní operace. V tomto případě se kód chyby vstupně-výstupní operace zobrazí jako první parametr kontroly chyb 0xC9. Zbytek je zaznamenán zprávou Kontrola chyb 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) spolu s kódem chyby Driver Verifier. V tomto případě se kód chyby Driver Verifier zobrazí jako první parametr kontroly chyb 0xC4.

V ladicím programu jádra (KD nebo WinDbg) jsou tyto chyby zaznamenány zprávou WDM DRIVER ERROR a popisným textovým řetězcem. Pokud je ladicí program jádra aktivní, je možné ignorovat chyby úrovně 2 a pokračovat v provozu systému. (To není možné u jiných kontrol chyb.)

Modrá obrazovka, soubor s výpisem stavu systému a ladicí program jádra zobrazují také další informace. Úplný popis většiny chybových zpráv úrovně V/V 2 najdete v tématu Chyba kontroly 0xC9. Zbývající část najdete v části Kontrola chyb 0xC4.

Ve Windows Vista zkontroluje možnost ověřování vstupně-výstupních operací následující chyby ovladače:

  • Dokončení a zrušení IRPs, které pocházejí z aplikací v uživatelském režimu, trvá příliš dlouho.

  • Uvolnění zámku pro odebrání, který ještě nebyl získán.

  • Volání IoReleaseRemoveLock nebo IoReleaseRemoveLockAndWait s značkou, která se liší od značky použité v příslušném volání IoAcquireRemoveLock.

  • Volání IoCallDriver se zakázanými přerušeními.

  • Volání IoCallDriver při IRQL přesahujícím DISPATCH_LEVEL.

  • Návrat z rutiny dispečera řidiče se zakázanými přerušeními.

  • Vrácení z dispečerské rutiny ovladače se změněným IRQL.

  • Návrat z výjezdní rutiny ovladače s vypnutými APCs. V tomto případě mohl ovladač zavolat KeEnterCriticalRegion vícekrát než KeLeaveCriticalRegion, což je primární příčina kontroly chyb 0x20 (KERNEL_APC_PENDING_DURING_EXIT) a kontroly chyb 0x1 (APC_INDEX_MISMATCH).

Ve Windows 7 zkontroluje možnost ověřování vstupně-výstupních operací následující chyby ovladače:

Kromě toho můžete pomocí této možnosti zjistit další běžnou chybu ovladače – opětovnou inicializaci odebrání zámků. Přidělování datových struktur pro zámky by mělo probíhat uvnitř rozšíření zařízení. Tím zajistíte, že správce vstupně-výstupních operací uvolní paměť, která obsahuje strukturu IO_REMOVE_LOCK pouze v případě, že se objekt zařízení odstraní. Pokud ovladač provede následující tři kroky, je možné, že po kroku 2 bude aplikace nebo ovladač stále obsahovat odkaz na Zařízení1:

  • Přiděluje strukturu IO_REMOVE_LOCK, která odpovídá zařízení Device1, ale provádí přidělení mimo rozšíření zařízení Device1.
  • Volá IoReleaseRemoveLockAndWait při odebrání zařízení1.
  • Zavolá IoInitializeRemoveLock pro stejný zámek, aby ho znovu použil jako zámek pro odebrání zařízení2.

Je možné, že po kroku 2 aplikace nebo ovladače stále obsahuje odkaz na zařízení 1. Aplikace nebo ovladač stále můžou odesílat žádosti do zařízení Device1, i když bylo toto zařízení odebráno. Proto není bezpečné opakovaně používat stejnou paměť jako nový zámek pro odebrání, dokud správce vstupně-výstupních operací neodstraní zařízení Device1. Opětovná inicializace stejného zámku, zatímco jiné vlákno se ho pokouší získat, může vést k poškození zámku s nepředvídatelnými výsledky pro řidiče a celý systém.

Ve Windows 7 a novějších verzích operačního systému Windows se rozšířené V/V Ověření automaticky aktivuje, když vyberete V/V Ověření.

Aktivace této možnosti

Funkci ověřování vstupně-výstupních operací můžete aktivovat pro jeden nebo více ovladačů 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 ověřování vstupně-výstupních operací reprezentována bitem 4 (0x10). K aktivaci V/V Ověření použijte hodnotu příznaku 0x10 nebo přidejte 0x10 k hodnotě příznaku. Například:

    verifier /flags 0x10 /driver MyDriver.sys
    

    Funkce bude aktivní po dalším spuštění.

    Můžete také aktivovat a deaktivovat vstupně-výstupní ověření bez restartování počítače přidáním parametru /volatile do příkazu. Například:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    Toto 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í.

    Funkce ověřování vstupně-výstupních operací je také součástí standardního nastavení. Například:

    verifier /standard /driver MyDriver.sys
    
  • Použití Správce ověřovatele ovladačů

    1. Vyberte Vytvořit vlastní nastavení (pro vývojáře kódu) a potom klikněte na Další.
    2. Vyberte jednotlivá nastavení z úplného seznamu.
    3. Vyberte (zkontrolovat) ověřování vstupně-výstupních operací.

    Funkce ověřování vstupně-výstupních operací 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í.