IRP-k továbbítása az illesztőprogram-veremben

Amikor egy illesztőprogram kézbesítési rutinja IRP-t kap, meg kell hívnia az IoGetCurrentIrpStackLocation parancsot , hogy ellenőrizze a saját I/O-verem helyét, és megállapíthassa, hogy a paraméterek érvényesek-e. Ha a meghajtó nem tudja teljesíteni és befejezni a kérést, a következők egyikét teheti:

  • Adja át az IRP-t az alacsonyabb szintű illesztőprogramok további feldolgozásához.

  • Hozzon létre egy vagy több új I/O kéréscsomagot (IRP), és adja át azokat alacsonyabb szintű illesztőprogramoknak.

A magasabb szintű illesztőknek az alábbiak szerint kell átadniuk egy I/O-kérést egy következő alacsonyabb illesztőprogramnak:

  1. Ha az illesztőprogram átadja a bemeneti IRP-t a következő alsó szintű illesztőnek, a küldési rutinnak meg kell hívnia az IoSkipCurrentIrpStackLocation vagy az IoCopyCurrentIrpStackLocationToNext metódust a következő alsó illesztő I/O veremhelyének beállításához.

    Ha az illesztőprogram meghívja az IoAllocateIrp-et egy vagy több további integrációs modul lefoglalására az alacsonyabb illesztőprogramok számára, a küldési rutinnak inicializálnia kell a következő alacsonyabb szintű illesztőprogram I/O-veremhelyét az Intermediate-Level-illesztő integrációs moduljainak feldolgozásában leírt lépések végrehajtásával.

    A küldési rutin bizonyos kérések esetében módosíthatja az illesztőprogram következő alacsonyabb szintű I/O-veremhelyének néhány paraméterét. Egy magasabb szintű illesztőprogram például módosíthatja egy nagy átviteli kérelem paramétereit, ha a mögöttes eszköz ismert átviteli kapacitáskorláttal rendelkezik, és újra felhasználhatja az IRP-t, hogy részleges átviteli kéréseket küldjön az alapul szolgáló eszközillesztőnek.

  2. Hívja meg IoSetCompletionRoutine-t.

    Ha a küldési rutin egy fogadott IRP-t ad át a következő alacsonyabb szintű illesztőprogramnak, az IoCompletion rutin beállítása nem kötelező, de hasznos, mivel a rutin olyan feladatokat hajthat végre, mint például annak meghatározása, hogy az alacsonyabb szintű illesztőprogramok hogyan fejezték be a kérést, az IRP újbóli használata részleges átvitelekhez, az illesztőprogram által fenntartott állapot frissítése, ha nyomon követi az integrációs modulokat, és egy hibával visszaadott kérés újrapróbálkozása.

    Ha a diszpécser rutin új IRP-ket foglalt le, az IoCompletion rutin beállítása szükséges, mert a rutinnak minden IRP-t el kell engednie, miután az alacsonyabb szintű illesztőprogramok befejezték.

    Az IoCompletion rutinokkal kapcsolatos további információkért lásd a IRP-k befejezését ismertető témakört.

  3. Hívja meg az IoCallDriver-t az egyes IRP-ekkel, amelyeket alacsonyabb illesztőprogramok dolgoznak fel.

  4. Egy megfelelő NTSTATUS-értéket ad vissza, például:

    • ÁLLAPOT_FOLYAMATBAN

      A meghajtó az IRP aszinkron kérés, például IRP_MJ_READ vagy IRP_MJ_WRITE esetén általában a STATUS_PENDING-et ad vissza.

    • Az IoCallDriver hívásának eredménye

      Az illesztőprogram gyakran visszaadja az IoCallDriver hívásának eredményét, ha a bemeneti IRP szinkron kérés, például IRP_MJ_CREATE.

A legalacsonyabb szintű eszközillesztők minden olyan IRP-t átadnak, amelyet a küldési rutinban nem tud elvégezni más illesztőprogram-rutinokra az alábbiak szerint:

  1. Hívja meg az IoMarkIrpPendinget a bemeneti IRP-vel.

  2. Hívja meg az IoStartPacketet , hogy az IRP-t továbbítsa vagy várólistára továbbítja az illesztőprogram StartIo-rutinjának , kivéve, ha az illesztőprogram a saját belső IRP-sorba állítását kezeli, az Driver-Managed IRP-üzenetsorokban leírtak szerint.

    Ha az illesztőprogram nem rendelkezik StartIo-rutinnal, de visszavonható IRP-ket kezel, akkor regisztrálnia kell egy Cancel rutint, vagy implementálnia kell egy visszavonásbiztos IRP várólistát. A Cancel rutinokkal kapcsolatos további információkért lásd a IRP-k megszakítása című témakört.

  3. Adja vissza STATUS_PENDING.