Sdílet prostřednictvím


Jak dokončit protokol IRP v rámci dispečerské rutiny

Pokud lze vstupní IRP dokončit okamžitě, rutina odeslání provede následující:

  1. Nastaví členy stavu a informací bloku stavu vstupně-výstupních operací protokolu IRP s příslušnými hodnotami obecně:

    • Rutina odesílání nastaví stav buď na STATUS_SUCCESS, nebo na příslušnou chybu (STATUS_XXX), což může být hodnota vrácená voláním rutiny podpory nebo u určitých synchronních požadavků nižším ovladačem.

      Pokud ovladač nižší úrovně vrátí STATUS_PENDING, ovladač vyšší úrovně by neměl volat IoCompleteRequest pro IRP, s jednou výjimkou: Ovladač vyšší úrovně může použít událost k synchronizaci mezi jeho rutinou IoCompletion a rutinou odeslání, v takovém případě rutina IoCompletion signalizuje událost a vrací STATUS_MORE_PROCESSING_REQUIRED. Rutina odeslání čeká na událost a potom zavolá IoCompleteRequest k dokončení IRP.

    • Nastaví informace na počet bajtů, které byly úspěšně přeneseny, pokud byla splněna žádost o přenos dat, například požadavek na čtení nebo zápis.

    • Nastaví informace na hodnotu, která se liší podle konkrétního požadavku na jiné IRP, které dokončí se STATUS_SUCCESS.

    • Nastaví Informace na hodnotu, která se liší podle konkrétního požadavku na IRP, jež se dokončí s upozorněním STATUS_XXX. Například by nastavil informace na počet bajtů přenesených pro takové upozornění jako STATUS_BUFFER_OVERFLOW.

    • Obvykle nastaví informace na nulu pro požadavky, které se dokončí s chybou STATUS_XXX.

  2. Volá IoCompleteRequest s IRP a PriorityBoost = IO_NO_INCREMENT.

  3. Vrátí odpovídající STATUS_XXX , který už je nastavený v bloku stavu vstupně-výstupních operací. Všimněte si, že volání IoCompleteRequest činí daný IRP nepřístupným pro volajícího, takže návratovou hodnotu z dispečerské rutiny nelze nastavit z bloku stavu vstupně-výstupních operací již dokončeného IRP.

Postupujte podle těchto pokynů k implementaci volání IoCompleteRequest s použitím protokolu IRP:

Před voláním IoCompleteRequest vždy uvolněte všechny spinlocky, které ovladač drží.

Dokončení protokolu IRP trvá neurčitou dobu, zejména v řetězci vrstvených ovladačů. Navíc může dojít k vzájemnému zablokování, pokud rutina IoCompletion ovladače vyšší úrovně odešle vstupně-výstupní operace zpět dolů na nižší ovladač, který drží zámek otáčení.