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 magasabb szintű illesztőprogramok eltérő standard rutinkészlettel rendelkeznek, mint a legalacsonyabb szintű eszközillesztők, és a standard rutinok átfedésben lévő részhalmaza mindkét illesztőprogramtípusra jellemző.
A köztes és a legmagasabb szintű illesztőprogramok rutinkészlete is az alábbi feltételek szerint változik:
A mögöttes fizikai eszköz jellege
Az, hogy egy mögöttes eszközillesztő beállítja-e az eszközobjektumokat a közvetlen vagy pufferelt I/O-hoz
Az egyes magasabb szintű meghajtók tervezése
Az alábbi ábra azt mutatja be, hogy az IRP milyen utat járhat be egy rétegzett tükörillesztő szokásos rutinjain, valahol a alacsonyabb szintű eszközillesztő fölött, ahogyan az előző szakaszban leírták.
Az alábbi ábrán látható illesztőprogram jellemzői a következők:
Az illesztőprogram több fizikai eszközre van rétegzve, és valószínűleg több eszközillesztőre is.
Az illesztőprogram néha további IRP-ket foglal le az alacsonyabb szintű illesztőprogramok számára, a bemeneti IRP-ban kért művelet függvényében.
Az illesztőprogram legalább egy fájlrendszer-illesztővel rendelkezik felette, és a fájlrendszer-illesztő más köztes illesztőprogramok fölé is rétegezhető ennél magasabb szinten.
Ahogy az ábra is mutatja, az I/O-kezelő létrehoz egy IRP-t, és elküldi azt az adott fő függvénykódhoz tartozó illesztői diszpécsernek. Feltételezve, hogy a függvénykód IRP_MJ_WRITE, a kézbesítési rutin DDDispatchWrite. A köztes illesztő I/O veremhelye középen jelenik meg, a magasabb és az alacsonyabb szintű illesztőprogramok I/O-veremhelyeinek határozatlan számú helye pedig árnyékolt.
I/O kéréscsomagok kiosztása
A tükrözött illesztőprogram célja, hogy írási kéréseket küldjön több fizikai eszköznek, és olvasási kéréseket küldjön felváltva ezeknek az eszközöknek az illesztőprogramjainak. Írási kérelmek esetén az illesztőprogram minden eszközhöz, amelyre az adatokat írni kell, duplikált IRP-ket hoz létre, feltéve, hogy a bemeneti IRP paraméterei érvényesek.
Az előző ábrán IoAllocateIrp hívása látható, de a magasabb szintű illesztőprogramok használhatnak más támogató rutinokat is IRP-k lefoglalására az alsó szintű illesztőprogramok számára. Lásd I/O kérő csomagok létrehozása Lower-Level illesztőprogramok számára.
Amikor a kézbesítési rutin meghívja IoAllocateIrp, megadja az IRP-hez szükséges I/O-veremhelyek számát. Az illesztőnek meg kell adnia egy veremhelyet a lánc minden alacsonyabb illesztőprogramjához, és le kell kérnie a megfelelő értéket az egyes illesztőprogramok eszközobjektumaiból a tükörillesztő alatt. Ha szeretné, az illesztőprogram hozzáadhat egyet ehhez az értékhez, amikor meghívja IoAllocateIrp, hogy minden lefoglalt IRP-hez saját veremhelyet kapjon, ahogyan az előző ábrán is látható.
A köztes illesztőprogram diszpécserprogramja meghívja IoGetCurrentIrpStackLocation (nem látható) az eredeti IRP-vel, hogy ellenőrizze a paramétereket.
Meghívja IoSetNextIrpStackLocation, mert minden újonnan létrehozott IRP-ben lefoglalta a saját veremhelyét, és az IoGetCurrentIrpStackLocation segítségével egy olyan környezetet hoz létre magának, amelyet később a IoCompletion rutinban használ.
Ezután minden újonnan létrehozott IRP-hez meghívja a IoGetNextIrpStackLocation függvényt, hogy beállíthassa a következő alacsonyabb szintű illesztőprogramok I/O-veremhelyeit az általa lefoglalt IRP-kben. A tükörillesztő irányítói rutinja az IRP-függvénykódokat és paramétereket (az átviteli pufferre mutató mutatót, a IRP_MJ_WRITEátviendő bájtokban lévő hosszt) az alacsonyabb szintű illesztőprogramok I/O-veremhelyeire másolja. Ezek az illesztőprogramok viszont beállítják az I/O veremhelyeket az alattuk lévő illesztőprogramokhoz, ha vannak ilyenek.
Az IoSetCompletionRoutine és az IoCallDriver hívása
Az előző ábra kézbesítési rutinja meghívja a IoSetCompletionRoutine az általa hozzárendelt minden egyes IRP-hez. Mivel az előző ábrán szereplő illesztőprogramnak el kell távolítania a lefoglalt I/O kéréscsomagokat, az illesztőprogram beállítja, hogy a IoCompletion rutin meghívásra kerüljön, amikor az alacsonyabb szintű illesztőprogramok lezárják az I/O kéréscsomagokat, függetlenül attól, hogy az I/O-művelet sikeresen befejeződött, meghiúsult vagy megszakadt.
Mivel az előző ábrán szereplő illesztőprogram párhuzamosan tükröz, az általa lefoglalt mindkét IRP-t továbbítja a következő alacsonyabb szintű illesztőprogramoknak kétszeri IoCallDriver hívással, egyszer-egyszer a tükrözött partíciót képviselő céleszköz-objektumok esetében.
IrP-k feldolgozása az illesztőprogram IoCompletion rutinjában
Ha az alacsonyabb szintű illesztőprogramok bármelyike végrehajtja a kért műveletet, az I/O-kezelő meghívja a köztes tükörillesztő IoCompletion rutinját. A tükörillesztő a saját I/O-verem helyén tartja számon az eredeti IRP-ket annak érdekében, hogy nyomon követhesse, mikor fejezték be az alacsonyabb illesztőprogramok az összes duplikált IRP-t.
Feltételezve, hogy az I/O állapotblokk azt jelzi, hogy az alacsonyabb illesztőprogramok egy készlete teljesítette az előző ábrán látható duplikált IRP-t, a tükrözött illesztő IoCompletion rutinja csökkenti a számát, de az eredeti IRP-t nem tudja befejezni, amíg nullára nem csökkenti a számot. Ha a dekrementált szám még nem nulla, az IoCompletion rutin az illesztőprogram által lefoglalt elsőként visszaadott IRP-vel (DupIRP1 a korábbi ábrán) hívja meg a IoFreeIrp-t, és visszaadja a STATUS_MORE_PROCESSING_REQUIRED értéket.
Amikor a tükörillesztő IoCompletion rutinját az előző ábrán látható DupIRP2-vel ismét meghívják, az IoCompletion rutin csökkenti az eredeti IRP-ben szereplő számokat, és megállapítja, hogy mindkét alacsonyabb szintű illesztőprogram-készlet elvégezte a kért műveleteket.
Feltételezve, hogy a DupIRP2 I/O állapotblokkja is STATUS_SUCCESS van beállítva, az IoCompletion rutin a DupIRP2 I/O állapotblokkot az eredeti IRP-be másolja, és felszabadítja a DupIRP2-t. Meghívja IoCompleteRequest az eredeti IRP-vel, és a STATUS_MORE_PROCESSING_REQUIRED értéket adja vissza. Ennek az állapotnak a visszaadása megakadályozza, hogy az I/O-kezelő megkísérlje a DupIRP2 további befejező feldolgozását; Mivel az IRP nincs szálhoz társítva, a befejező feldolgozásnak az azt létrehozó illesztőprogrammal kell befejeződnie.
Ha az alacsonyabb szintű illesztőprogramok egyik készlete sem fejezi be sikeresen a tükrözött illesztőprogram integrációs moduljait, a tükrözött illesztőprogram IoCompletion rutinjának naplóznia kell egy hibát, és meg kell kísérelnie a megfelelő tükrözött adatok helyreállítását. További információ: naplózási hibák.