Udostępnij przez


Pisanie procedur wywołania zwrotnego po zakończeniu operacji

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