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 fájlobjektum megnyitását szemléltető ábra egy két I/O veremhelyet tartalmazó IRP-t jelenít meg, de az IRP tetszőleges számú I/O-veremhelyet tartalmazhat attól függően, hogy hány rétegzett illesztőprogram fogja kezelni az adott kérést.
Az alábbi ábra részletesebben szemlélteti, hogy a Fájlobjektum megnyitása ábrán szereplő illesztőprogramok hogyan használják az I/O támogatási rutinokat (IoXxx rutinok) az IRP olvasási vagy írási kérések feldolgozásához.
Az I/O-kezelő meghívja a fájlrendszer-illesztőprogramot (FSD) az alrendszer olvasási/írási kéréséhez lefoglalt IRP-vel. Az FSD hozzáfér az I/O verem helyéhez az IRP-ben annak meghatározásához, hogy milyen műveletet kell végrehajtania.
Az FSD egy I/O támogatási rutin (IoAllocateIrp) egy vagy több alkalommal történő meghívásával kisebb kérésekre (esetleg több eszközillesztőre) bonthatja az eredeti kérést. Az FSD-be az extra IRP-k nullával kitöltött I/O-veremhelyekkel kerülnek visszaadásra az alacsonyabb szintű illesztőprogramok számára. Az FSD saját belátása szerint újra felhasználhatja az eredeti IRP-t ahelyett, hogy további integrációs modulokat állít be az előző ábrán látható módon, ha beállítja a következő alacsonyabb szintű illesztőprogram I/O-veremhelyét az eredeti IRP-ben, és továbbadja az alacsonyabb illesztőprogramoknak.
Minden illesztőprogram által lefoglalt IRP esetében az FSD az előző ábrán egy I/O támogatási rutint hív meg az FSD által biztosított befejezési rutin regisztrálásához; a befejezési rutinban az FSD meg tudja állapítani, hogy az alacsonyabb illesztőprogramok teljesítették-e a kérést, és felszabadíthatják-e az egyes illesztőprogramok által lefoglalt IRP-t, amikor az alacsonyabb illesztőprogramok befejezték azt. Az I/O-kezelő mindig meghívja az FSD által biztosított befejezési rutint, akár az illesztőprogram által kiosztott IRP sikeresen fejeződött be, hibás állapottal fejeződött be, vagy megszakításra került. A magasabb szintű illesztőprogramok feladata, hogy felszabadítsa az általa lefoglalt és saját nevében létrehozott IRP-ket az alacsonyabb szintű illesztőprogramok számára. Az I/O-kezelő felszabadítja azokat az IRP-ket (I/O kéréscsomagokat), amelyeket lefoglal, miután az összes illesztőprogram feldolgozta azokat.
Ezután az FSD meghív egy I/O támogatási rutint (IoGetNextIrpStackLocation) a következő alsó szintű illesztőprogram I/O-veremhelyének eléréséhez a következő alacsonyabb szintű illesztőprogram kérésének beállításához. (Az előző ábrán a következő alacsonyabb illesztőprogram a legalacsonyabb szintű illesztőprogram.) Az FSD ezután meghív egy I/O támogatási rutint (IoCallDriver), hogy továbbítsa az IRP-t a következő alsó illesztőprogramnak.
Az IRP meghívásakor a legalacsonyabb szintű illesztőprogram ellenőrzi az I/O-verem helyét, hogy meghatározza, milyen műveletet kell végrehajtania a céleszközön (amelyet a IRP_MJ_XXX függvénykód jelez). A céleszközt az eszközobjektum jelöli a kijelölt I/O-veremhelyen, és az IRP-vel együtt továbbítja az illesztőprogramnak. A legalacsonyabb szintű illesztőprogram feltételezheti, hogy az I/O-kezelő átirányította az IRP-t a IRP_MJ_XXX művelethez definiált belépési pontra (itt IRP_MJ_READ vagy IRP_MJ_WRITE), és hogy a magasabb szintű illesztőprogram ellenőrizte a kérés egyéb paramétereinek érvényességét.
Ha nincs magasabb szintű illesztőprogram, a legalacsonyabb szintű illesztőprogram ellenőrzi, hogy egy IRP_MJ_XXX művelet bemeneti paraméterei érvényesek-e. Ha igen, az illesztőprogram általában meghívja az I/O támogatási rutinjait, hogy tájékoztassa az I/O-kezelőt arról, hogy egy eszközművelet függőben van az IRP-n, és vagy várólistára állítja az IRP-t, vagy átadja azt egy másik, a céleszközhöz hozzáférő illesztőprogram által biztosított rutinnak (itt egy fizikai vagy logikai eszköznek: a lemeznek vagy a lemezen lévő partíciónak).
Az I/O-kezelő határozza meg, hogy az illesztőprogram már foglalt-e egy másik IRP-t a céleszközhöz, várólistára állítja az IRP-t, ha van, és visszatér. Ellenkező esetben az I/O-kezelő átirányítja az IRP-t egy illesztőprogram által biztosított rutinhoz, amely elindítja az I/O-műveletet az eszközén. (Ebben a szakaszban az előző ábrán szereplő illesztőprogramok és az I/O-kezelő is visszaadja a vezérlést.)
Amikor az eszköz megszakít, a meghajtó megszakítási szolgáltatási rutinja (ISR) csak annyi munkát végez el, amennyit feltétlenül szükséges ahhoz, hogy megakadályozza az eszköz további megszakítását, és mentse a művelettel kapcsolatos szükséges környezetet. Az ISR ezután meghív egy I/O támogatási rutint (IoRequestDpc) az IRP-vel az illesztőprogram által biztosított DPC (Késleltetett eljáráshívás) rutin várólistára helyezéséhez, hogy a kért műveletet az ISR-nél alacsonyabb hardverprioritáson hajtsa végre.
Amikor az illesztőprogram DPC-je kap vezérlést, a kontextust (amelyet az ISR IoRequestDpc hívásában adtak át) használja, hogy végrehajtsa az I/O-műveletet. A DPC egy támogatási rutint hív meg a következő IRP lekéréséhez (ha van ilyen), és adja át az IRP-t az eszközön I/O-műveleteket indító illesztőprogram által biztosított rutinnak (lásd: 5. lépés). A DPC ezután beállítja az IRP I/O állapotblokkjában az imént befejezett művelet állapotát, és visszaadja az I/O-kezelőnek az IoCompleteRequest használatával.
Az I/O-kezelő nullára állítja a legalacsonyabb szintű illesztőprogram I/O-veremhelyét az IRP-ben, és meghívja a fájlrendszer regisztrált befejezési rutinját (lásd a 3. lépést) az FSD által lefoglalt IRP-vel. Ez a befejezési rutin ellenőrzi az I/O állapotblokkot annak megállapításához, hogy újrapróbálkozza-e a kérést, vagy frissítse-e az eredeti kérelemről karbantartott belső állapotot, és felszabadítsa az illesztőprogram által lefoglalt IRP-t. A fájlrendszer képes azon állapotinformációk összegyűjtésére, amelyeket az összes, alacsonyabb szintű illesztőprogramnak továbbított és illesztőprogramok által lefoglalt IRP számára tartanak fenn, hogy beállíthassa az I/O állapotát, és véghez vigye az eredeti IRP-t. Amikor a fájlrendszer befejezte az eredeti IRP-t, az I/O-kezelő egy NTSTATUS értéket ad vissza az I/O művelet kérelmének eredeti benyújtójának (a rendszerhez tartozó natív függvény).
A Rétegzett illesztőprogramokban IRP-k feldolgozása ábrán látható fájlrendszer-illesztőhöz hasonlóan bármely új illesztőprogram, amely egy meglévő illesztőprogramok láncához hozzáadásra kerül, a következőkre is képes:
Állítsa be a saját befejezési rutinját egy IRP-be. Az IoCompletion rutin ellenőrzi az I/O állapotblokkot annak megállapításához, hogy az alacsonyabb szintű illesztőprogramok sikeresen befejezték-e az IRP-t, megszakították-e az IRP-t, és/vagy hibával fejezték-e be. A befejezési rutin az illesztőprogram által esetleg mentett IRP-specifikus állapotokat is frissítheti, felszabadíthat minden olyan műveletspecifikus erőforrást, amelyet az illesztőprogram lefoglalt, és így tovább, mielőtt befejezné az IRP-t. Emellett a befejezési rutin elhalaszthatja az IRP befejezését (az I/O-kezelő tájékoztatásával, hogy további feldolgozásra van szükség az IRP-n), és egy újabb kérést küldhet a következő alacsonyabb szintű illesztőprogramnak, mielőtt engedélyezi az IRP befejezését.
Állítsa be a következő alacsonyabb szintű illesztőprogram I/O-veremhelyét az általa lefoglalt IRP-kben, és küldje el a kéréseket a következő alacsonyabb szintű illesztőprogramnak.
Adja át a bejövő kéréseket az alacsonyabb illesztőprogramoknak a következő alacsonyabb szintű illesztőprogram I/O-veremhelyének beállításával az egyes IRP-kben, és hívja meg az IoCallDriver-t. (Vegye figyelembe, hogy a fő függvénykóddal IRP_MJ_POWER rendelkező IRP-k esetében az illesztőprogramoknak a PoCallDriver-t kell használni.)
Minden illesztőprogram által létrehozott eszközobjektum egy fizikai, logikai vagy virtuális eszközt jelöl, amelyhez egy adott illesztőprogram I/O-kéréseket hajt végre. Az eszközobjektumok létrehozásával és beállításával kapcsolatos részletes információkért lásd: Eszközobjektumok és eszközveremek.
Ahogy azt a rétegzett illesztőprogramok irp-jeinek feldolgozása is mutatja, a legtöbb illesztőprogram az egyes IRP-ket szakaszosan dolgozza fel a rendszer által meghatározott standard rutinok illesztőprogramokkal ellátott készletén keresztül, de a lánc különböző szintjein lévő illesztőprogramok szükségszerűen eltérő standard rutinokkal rendelkeznek. Például csak a legalacsonyabb szintű illesztőprogramok kezelik a fizikai eszköz megszakításait, így csak a legalacsonyabb szintű illesztőprogram rendelkezik ISR-sel és egy olyan DPC-vel, amely megszakításalapú I/O-műveleteket hajt végre. Másrészt, mivel az ilyen illesztőprogram tudja, hogy az I/O befejeződött, amikor megszakítást kap az eszközéről, nincs szükség befejezési rutinra. Csak egy magasabb szintű illesztőprogram rendelkezik egy vagy több teljesítési rutinnal, például az FSD-vel ebben az ábrán.