Megbízható Kernel-Mode illesztőprogramok létrehozása

Az illesztőprogramok a kernel módban végrehajtott teljes kód jelentős részét teszik ki. A kernel módú illesztőprogram valójában az operációs rendszer összetevője. Ezért a megbízható és biztonságos illesztőprogramok jelentősen hozzájárulnak az operációs rendszer általános megbízhatóságához. Megbízható kernelmódú illesztőprogram létrehozásához kövesse az alábbi irányelveket:

  • Az eszközobjektumok megfelelő védelme.

    A rendszer illesztőprogramjaihoz és eszközeihez való felhasználói hozzáférést a rendszer által eszközobjektumokhoz rendelt biztonsági leírók vezérlik. A rendszer leggyakrabban az eszköz telepítésekor állítja be az eszköz biztonsági paramétereit. További információ: Biztonságos eszköztelepítések létrehozása. Előfordulhat, hogy az illesztőprogramnak szerepet kell játszania az eszközhöz való hozzáférés szabályozásában. További információ: Eszközobjektumok biztonságossá tétele.

  • Ellenőrizze megfelelően az eszközobjektumokat.

    Ha egy illesztőprogram több típusú eszközobjektumot hoz létre, ellenőriznie kell, hogy az egyes IRP-ekben melyik típust kapja meg. További információ: Eszközobjektumok ellenőrzésének sikertelensége.

  • Használjon "biztonságos karakterlánc" függvényeket.

    A sztringek manipulálásakor az illesztőknek biztonságos sztringfüggvényeket kell használniuk a C/C++ nyelvi futtatókörnyezeti kódtárakhoz biztosított sztringfüggvények helyett. További információ: Biztonságos karaktersor-függvények használata.

  • Objektumfogópontok ellenőrzése.

    Azok az illesztőprogramok, amelyek bemenetként kapják meg az objektumfogópontokat, ellenőrizni kell, hogy a fogópontok érvényesek-e, elérhetők-e, és a várt típusúak-e. Az objektumfogópontok használatával kapcsolatos további információkért tekintse meg az alábbi témaköröket:

    Objektumkezelési

    Nem sikerült ellenőrizni az objektumleírókat

  • A többprocesszorok megfelelő támogatása.

    Soha ne feltételezze, hogy az illesztőprogram csak egyprocesszoros rendszereken fog futni. Az illesztőprogram többprocesszoros rendszereken való megfelelő működésének biztosításához használható programozási technikákkal kapcsolatos információkért tekintse meg az alábbi témaköröket:

    Szinkronizálási technikák

    Hibák többprocesszoros környezetben

  • Az illesztőprogram állapotát megfelelően kezelje.

    Fontos, hogy mindig ellenőrizze, hogy az illesztőprogram abban az állapotban van, amelyet feltételez. Ha például az illesztőprogram IRP-t kap, az már ugyanahhoz a típushoz tartozó IRP-t szervizel? Ha a meghajtó nem ellenőrzi ezt a helyzetet, az első IRP elveszhet. További információ: A meghajtó állapotának ellenőrzési hibája.

  • IRP-bemeneti értékek ellenőrzése.

    Mind megbízhatósági, mind biztonsági szempontból elengedhetetlen az IRP-hez társított összes érték ellenőrzése, például puffercímek és hosszúságok. Az alábbi témakörök az IRP bemeneti értékeinek érvényesítéséről nyújtanak információt:

    DispatchReadWrite pufferelt I/O használatával

    Hibák a pufferelt I/O-ban

    DispatchReadWrite közvetlen I/O használatával

    közvetlen I/O hibák

    I/O-vezérlőkódokkal kapcsolatos biztonsági problémák

    Hibák a hivatkozási User-Space-címekben

  • Kezelje megfelelően az I/O-köteget.

    Az IRP-k illesztőprogram-veremben való átadásakor fontos, hogy az illesztőprogramok meghívják az IoSkipCurrentIrpStackLocation vagy IoCopyCurrentIrpStackLocationToNext függvényt a következő illesztőprogram I/O veremhelyének beállításához. Ne írjon olyan kódot, amely közvetlenül másol egy I/O-veremhelyet a következőre.

  • Az IRP-befejezési műveletek megfelelő kezelése.

    Az illesztőprogramnak soha nem szabad STATUS_SUCCESS állapotértékkel rendelkező IRP-t befejeznie, kivéve, ha ténylegesen támogatja és feldolgozza az IRP-t. Az IRP-k befejezésének helyes módjairól további információt a "Az IRP-k befejezése" című részben talál.

  • Az IRP-lemondási műveletek megfelelő kezelése.

    A megszakítási műveletek kódolása nehéz lehet, mert általában aszinkron módon futnak. A megszakítási műveleteket kezelő kód problémái hosszú ideig észrevétlenek lehetnek, mivel ezt a kódot általában nem gyakran hajtják végre egy futó rendszerben.

    Mindenképpen olvassa el és ismerje meg a IrP-k megszakításacímű témakörben megadott összes információt. Különös figyelmet kell fordítani az IRP-lemondások szinkronizálására és az IRP-lemondáskor figyelembe veendő szempontokra.

    A megszakítási műveletekhez kapcsolódó szinkronizálási problémák elkerülésének egyik módja egy biztonságos IRP-üzenetsor implementálása. A megszakításmentes IRP-üzenetsor egy illesztőprogram által felügyelt üzenetsor, amely a Windows XP és újabb operációsrendszer-verziókhoz lett bevezetve, de a korábbi verziókkal is kompatibilis.

  • Kezelje az IRP-karbantartást, és zárja be a műveleteket megfelelően.

    Ügyeljen arra, hogy megértse a IRP_MJ_CLEANUP és IRP_MJ_CLOSE kérések közötti különbséget. A törlési kérelmek akkor érkeznek meg, ha egy alkalmazás bezárja egy fájlobjektum összes leíróját, de néha még az összes I/O-kérés befejeződése előtt. A kérelmek bezárása a fájlobjektumra vonatkozó összes I/O-kérés befejezése vagy megszakítása után érkezik. További információkért tekintse meg a következő témaköröket:

    DispatchCreate, DispatchClose és DispatchCreateClose rutinok

    DispatchCleanup rutinok

    Hibák a tisztítási és bezárási műveletek kezelésében

További információ az IRP-k helyes kezeléséről: További hibák az IRP-k kezelésében.

Illesztőprogram-ellenőrző használata

A Driver Verifier az illesztőprogram megbízhatóságának biztosításához használható legfontosabb eszköz. A Driver Verifier számos gyakori illesztőprogram-problémát kereshet, beleértve az ebben a szakaszban tárgyalt problémák némelyikét is. A Driver Verifier használata azonban nem helyettesíti a gondos, átgondolt szoftvertervezést.