Vytváření spolehlivých ovladačů Kernel-Mode

Ovladače tvoří významné procento celkového kódu, který se spouští v režimu jádra. Ovladač režimu jádra je v podstatě součástí operačního systému. Ovladače, které jsou spolehlivé a zabezpečené, proto významně přispívají k celkové důvěryhodnosti operačního systému. Pokud chcete vytvořit spolehlivý ovladač v režimu jádra, postupujte podle těchto pokynů:

  • Zabezpečte objekty zařízení správně.

    Uživatelský přístup k ovladačům a zařízením systému je řízen popisovači zabezpečení, které systém přiřazuje k objektům zařízení. Systém nejčastěji nastavuje parametry zabezpečení zařízení při instalaci zařízení. Další informace najdete v tématu Vytváření zabezpečených instalací zařízení. Někdy je vhodné, aby ovladač hrál roli při řízení přístupu ke svému zařízení. Další informace naleznete v tématu Zabezpečení objektů zařízení.

  • Ověřte správně objekty zařízení.

    Pokud ovladač vytvoří více typů objektů zařízení, musí zkontrolovat, jaký typ přijímá v každém protokolu IRP. Další informace naleznete v tématu Selhání ověření objektů zařízení.

  • Používejte bezpečné řetězcové funkce.

    Při manipulaci s řetězci by ovladač měl místo řetězcových funkcí poskytovaných knihovnami jazyka C/C++ používat bezpečné řetězcové funkce. Další informace naleznete v tématu Použití bezpečných řetězcových funkcí.

  • Ověřte handles objektů.

    Ovladače, které přijímají popisovače objektů jako vstup, musí ověřit, zda jsou popisovače platné, přístupné a odpovídají očekávanému typu. Další informace o používání popisovačů objektů najdete v následujících tématech:

    správa objektů

    Selhání ověření popisovačů objektů

  • Podporujte víceprocesorové systémy správně.

    Nikdy nepředpokládáme, že váš ovladač bude běžet pouze v systémech s jedním procesorem. Informace o programovacích technikách, které můžete použít k zajištění správného fungování ovladače v multiprocesorových systémech, najdete v následujících tématech:

    Techniky synchronizace

    Chyby v prostředí s více procesory

  • Správně pracujte s ovladačem.

    Je důležité vždy ověřit, že váš ovladač je ve stavu, ve kterém ho předpokládáte. Pokud například ovladač obdrží IRP, už obsluhuje IRP stejného typu? Pokud řidič tuto situaci nezkontroluje, může dojít ke ztrátě prvního protokolu IRP. Další informace naleznete v tématu Selhání kontroly stavu řidiče.

  • Ověřte vstupní hodnoty protokolu IRP.

    Z hlediska spolehlivosti i zabezpečení je nezbytné ověřit všechny hodnoty spojené s protokolem IRP, jako jsou adresy vyrovnávací paměti a délky. Následující témata obsahují informace o ověřování vstupních hodnot protokolu IRP:

    DispatchReadWrite s využitím vyrovnávacího vstupně-výstupního systému

    Chyby ve vyrovnávací paměti při vstupně-výstupních operacích

    DispatchReadWrite s využitím přímého vstupu/výstupu

    Chyby v přímých vstupně-výstupních operacích

    problémy se zabezpečením pro kódy řízení vstupně-výstupních operací

    Chyby v odkazování na adresy User-Space

  • Správně zpracujte I/O zásobník.

    Při předávání irPs zásobníku ovladačů je důležité, aby ovladače volali IoSkipCurrentIrpStackLocation nebo IoCopyCurrentIrpStackLocationToNext , aby nastavili umístění zásobníku vstupně-výstupních operací dalšího ovladače. Nepište kód, který přímo kopíruje jednu polohu I/O zásobníku do další.

  • Správně zpracujte dokončení operací IRP.

    Ovladač nesmí nikdy dokončit protokol IRP se stavovou hodnotou STATUS_SUCCESS, pokud ve skutečnosti nepodporuje a nezpracuje protokol IRP. Informace o správných způsobech zpracování operací dokončení IRP najdete v tématu Dokončení IRP.

  • Zpracujte správně operace zrušení protokolu IRP.

    Operace zrušení můžou být obtížné správně kódovat, protože se obvykle provádějí asynchronně. Problémy s kódem, který zpracovává operace zrušení, mohou být dlouho bez upozornění, protože tento kód se obvykle nespustí často v běžícím systému.

    Nezapomeňte si přečíst a porozumět všem informacím uvedeným v části Zrušení IRPs. Věnujte zvláštní pozornost synchronizaci zrušení IRP a bodům, které je třeba zvážit při rušení IRP.

    Jedním ze způsobů, jak se vyhnout problémům se synchronizací spojenými s operacemi zrušení, je implementovat bezpečnou frontu IRP pro zrušení. Fronta IRP bezpečná při zrušení je fronta spravovaná ovladačem, která byla zavedena pro Windows XP a novější verze operačního systému, ale je také zpětně kompatibilní s dřívějšími verzemi.

  • Správně zpracujte operace vyčištění a uzavření IRP.

    Ujistěte se, že rozumíte rozdílu mezi požadavky IRP_MJ_CLEANUP a IRP_MJ_CLOSE. Žádosti o vyčištění dorazí poté, co aplikace uzavře všechny popisovače objektu souboru, ale někdy předtím, než jsou dokončeny všechny I/O požadavky. Požadavky na zavření přicházejí poté, co byly dokončeny nebo zrušeny všechny vstupně-výstupní požadavky na objekt souboru. Další informace najdete v následujících tématech:

    Rutiny DispatchCreate, DispatchClose a DispatchCreateClose

    Rutiny pro vyčištění odesílání

    Chyby při řízení operací úklidu a zavření

Další informace o správném zpracování IRP naleznete v tématu Další chyby při zpracování IRP.

Použití ověřovatele ovladačů

Driver Verifier je nejdůležitější nástroj, který můžete použít pro zajištění spolehlivosti vašeho ovladače. Kontrolér ovladačů může zkontrolovat různé běžné problémy s ovladači, včetně některých z těch, které jsou popsány v této části. Použití Driver Verifier však nenahrazuje pečlivé, promyšlené softwarové návrh.