Předávání IRP v zásobníku ovladačů

Když rutina odesílání ovladače obdrží IRP, musí volat IoGetCurrentIrpStackLocation, aby mohla zkontrolovat vlastní umístění zásobníku I/O a určit, že kterékoliv parametry jsou platné. Pokud ovladač nemůže splnit a dokončit samotný požadavek, může provést jednu z následujících věcí:

  • Předejte IRP pro další zpracování ovladači nižší úrovně.

  • Vytvořte jeden nebo více nových balíčků požadavků na vstup/výstup (IRP) a předejte je ovladačům nižší úrovně.

Ovladač vyšší úrovně by měl předat vstupně-výstupní požadavek na další nižší ovladač následujícím způsobem:

  1. Pokud ovladač předá vstupní IRP na další ovladač nižší úrovně, měla by rutina odesílání volat IoSkipCurrentIrpStackLocation nebo IoCopyCurrentIrpStackLocationToNext, aby nastavila umístění zásobníku vstupně-výstupních operací dalšího ovladače.

    Pokud ovladač volá IoAllocateIrp pro přidělení jedné nebo více dalších IRP pro nižší ovladače, dispečerská rutina musí inicializovat umístění vstupně-výstupního zásobníku dalšího nižšího ovladače podle kroků popsaných v Zpracování IRP v Intermediate-Level Ovladač.

    Rutina odesílání může u určitých požadavků upravit některé parametry na úrovni zásobníku I/O dalšího ovladače. Například ovladač vyšší úrovně může upravit parametry pro velký požadavek na přenos, pokud má podkladové zařízení známý limit v přenosové kapacitě, a znovu použít IRP k odesílání žádostí o částečný přenos na základní ovladač zařízení.

  2. Volání IoSetCompletionRoutine.

    Pokud rutina odesílání předává přijatému ovladači SRP další nižší, je nastavení rutiny IoCompletion volitelné, ale užitečné, protože rutina může provádět takové úlohy, jako je určení, jak nižší ovladače dokončily požadavek, opětovné použití protokolu IRP pro částečné přenosy, aktualizace libovolného stavu, který ovladač udržuje, pokud sleduje irPs, a zkuste požadavek, který se vrátil s chybou.

    Pokud rutina odesílání přidělila nové IRP, je vyžadováno nastavení rutiny IoCompletion, protože rutina musí po dokončení úloh nižších ovladačů každé IRP uvolnit.

    Další informace o rutinách IoCompletion najdete v tématu Dokončování IRP.

  3. Volání IoCallDriver s každou IRP ke zpracování nižšími ovladači.

  4. Vrátí odpovídající hodnotu NTSTATUS, například:

    • STAV ČEKÁ NA VYŘÍZENÍ

      Ovladač obvykle vrací STATUS_PENDING, pokud vstupní IRP je asynchronní požadavek, například IRP_MJ_READ nebo IRP_MJ_WRITE.

    • Výsledek volání ioCallDriver

      Ovladač často vrací výsledek volání IoCallDriver, jestliže je vstupní IRP synchronním požadavkem, například IRP_MJ_CREATE.

Ovladač zařízení na nejnižší úrovni předává jakýkoli IRP, který nemůže dokončit ve své dispečerské rutině, do jiných rutin ovladačů následujícím způsobem:

  1. Zavolejte IoMarkIrpPending s vstupním IRP.

  2. Volejte IoStartPacket předat vstupně-výstupní operace do fronty StartIo ovladače, pokud ovladač nespravuje vlastní interní řízení front protokolu IRP, jak je popsáno v Driver-Managed frontách protokolu IRP.

    Pokud ovladač nemá rutinu StartIo, ale zpracovává zrušitelné IRP, musí buď zaregistrovat rutinu Zrušit, nebo implementovat frontu IRP bezpečnou pro zrušení. Další informace o rutinách zrušení najdete v tématu Zrušení IRP.

  3. Vrátit STATUS_PENDING.