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ů:
Odeslání I/O operace do systémové pracovní fronty voláním rutiny, jako je například FltQueueDeferredIoWorkItem.
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.