Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterownik minifiltrowania systemu plików używa co najmniej jednej procedury wywołania zwrotnego pooperacji do filtrowania operacji we/wy.
Rutyna wywołania zwrotnego po operacji może podjąć jedną z następujących działań:
- Wykonaj pracę ukończenia bezpośrednio w procedurze pooperacyjnej. Wszystkie prace końcowe można wykonać przy IRQL <= DISPATCH_LEVEL.
- Wykonaj zadanie zakończenia na bezpiecznym poziomie IRQL. Zwracanie FLT_STATUS_MORE_PROCESSING_REQUIRED i zakolejkowanie wątku roboczego w celu przetwarzania przy bezpiecznym poziomie IRQL. Po zakończeniu przetwarzania wątek roboczy wywołuje funkcję FltCompletePendedPostOperation w celu kontynuowania dalszego przetwarzania.
- Anuluj pomyślną operację CREATE.
Rutyny wywołań zwrotnych po operacji są podobne do rutyn kończenia, które są używane w starszych sterownikach filtrów systemu plików.
Sterownik minifiltru rejestruje procedurę wywołania zwrotnego pooperacji dla określonego typu operacji we/wy w taki sam sposób, jak rejestruje procedurę wywołania zwrotnego przedoperacji — czyli przez przechowywanie punktu wejścia procedury wywołania zwrotnego w elemencie OperationRegistration elementu członkowskiego FLT_REGISTRATION struktury, którą sterownik minifiltru przekazuje jako parametr do FltRegisterFilter w procedurze DriverEntry .
Sterowniki minifiltru otrzymują tylko te typy operacji we/wy, dla których zarejestrowano procedurę wywołania zwrotnego przed operacją lub po operacji. Sterownik minifiltru może zarejestrować procedurę wywołania zwrotnego dla operacji przed wykonaniem dla danego typu operacji we/wy bez rejestrowania wywołania zwrotnego dla operacji po wykonaniu i na odwrót.
Każda rutyna wywołania zwrotnego pooperacji jest zdefiniowana w następujący sposób:
typedef FLT_POSTOP_CALLBACK_STATUS
(*PFLT_POST_OPERATION_CALLBACK) (
IN OUT PFLT_CALLBACK_DATA Data,
IN PCFLT_RELATED_OBJECTS FltObjects,
IN PVOID CompletionContext,
IN FLT_POST_OPERATION_FLAGS Flags
);
Podobnie jak w przypadku procedury uzupełniającej, procedura wywołania zwrotnego po operacji jest wywoływana na poziomie IRQL <= DISPATCH_LEVEL w dowolnym kontekście wątku.
Ponieważ można ją wywołać na poziomie IRQL = DISPATCH_LEVEL, rutyna wywołania zwrotnego pooperacyjna nie może wywoływać procedur trybu jądra, które muszą być uruchamiane na niższym poziomie IRQL, takich jak FltLockUserBuffer lub RtlCompareUnicodeString. Z tego samego powodu wszystkie struktury danych używane w funkcji zwrotnej po operacji muszą być przydzielane z niestronicowanej puli.
Poniżej przedstawiono kilka wyjątków od powyższej reguły:
Jeśli procedura wywołania zwrotnego preoperacji sterownika minifiltru zwraca FLT_PREOP_SYNCHRONIZE dla operacji we/wy opartej na protokole IRP, odpowiednia procedura wywołania zwrotnego pooperacji jest wywoływana w IRQL <= APC_LEVEL, w tym samym kontekście wątku co procedura wywołania zwrotnego przedoperacji.
Procedura wywołania zwrotnego pooperacyjnej dla szybkiej operacji we/wy jest wywoływana przy IRQL równym PASSIVE_LEVEL w tym samym kontekście wątku co procedura wywołania zwrotnego przedoperacyjnej.
Procedury wywołania zwrotnego po utworzeniu są wywoływane przy poziomie IRQL = PASSIVE_LEVEL, w kontekście wątku, który zainicjował operację IRP_MJ_CREATE.
Gdy menedżer filtrów wywołuje procedurę zwrotną po zakończeniu operacji sterownika minifiltru dla określonej operacji wejścia/wyjścia, sterownik minifiltru tymczasowo kontroluje tę operację. Sterownik minifiltru zachowuje tę kontrolkę, dopóki nie wykona jednej z następujących czynności:
Zwraca FLT_POSTOP_FINISHED_PROCESSING z funkcji zwrotnej po operacji.
Wywołuje metodę FltCompletePendedPostOperation z procedury pracy, która przetworzyła operację wejścia/wyjścia opartą na IRP, która została zawieszona w procedurze wywołania zwrotnego pooperacyjnym.
Ta sekcja zawiera następujące elementy:
Przeprowadzanie przetwarzania finalizacji dla operacji we/wy
Oczekiwanie na operację we/wy w procedurze wywołania zwrotnego dotyczącej zakończenia operacji
Niepowodzenie operacji we/wy w procedurze wywołania zwrotnego po zakończeniu operacji