Sdílet prostřednictvím


Provádění vstupně-výstupní operace v rutině zpětného volání před zahájením operace

Minifilterový ovladač může v předoperační rutině pozastavit vstupně-výstupní operaci jejím odesláním do systémové pracovní fronty a vrácením FLT_PREOP_PENDING. Vrácení této hodnoty stavu označuje, že ovladač minifiltru udržuje kontrolu nad vstupně-výstupní operací, dokud neprovede hovor na FltCompletePendedPreOperation, aby obnovil zpracování pro vstupně-výstupní operaci.

Rutina zpětného volání minifiltru ovladače odkládá operaci V/V provedením následujících kroků:

  1. Odeslání I/O operace do systémové pracovní fronty voláním rutiny, jako je například FltQueueDeferredIoWorkItem.

  2. Vrací se FLT_PREOP_PENDING.

Ovladač minifiltru, který musí pozastavit všechny (nebo většinu) příchozích vstupně-výstupních operací, by neměl používat rutiny, jako je FltQueueDeferredIoWorkItem k pozastavení operací, protože volání této rutiny může způsobit zahlcení systémových pracovních front. Místo toho by takový ovladač minifiltru měl používat frontu bezpečnou při rušení. Další informace o používání front bezpečných pro zrušení naleznete v tématu FltCbdqInitialize.

Všimněte si, že volání FltQueueDeferredIoWorkItem selže, pokud jsou splněny některé z následujících podmínek:

  • Operace není vstupně-výstupní operace založená na protokolu IRP.

  • Operace je stránkovací vstupně-výstupní operace.

  • Pole TopLevelIrp aktuálního vlákna není NULL. (Další informace o tom, jak najít hodnotu tohoto pole, najdete v tématu IoGetTopLevelIrp.)

  • Cílová instance pro vstupně-výstupní operaci je rušena.

Pokud rutina zpětného volání předoperačního ovladače minifiltru vrací FLT_PREOP_PENDING, musí vrátit NULL ve výstupním parametru CompletionContext.

Ovladač minifiltru může vracet FLT_PREOP_PENDING pouze pro vstupně-výstupní operace založené na protokolu IRP. Pokud chcete zjistit, jestli je operace vstupně-výstupní operace založená na protokolu IRP, použijte makro FLT_IS_IRP_OPERATION.

Pracovní rutina, která odebírá z fronty a zpracovává vstupně-výstupní operaci, musí zavolat FltCompletePendedPreOperation pro obnovu zpracování operace.