Udostępnij przez


Zwracanie FLT_PREOP_SYNCHRONIZE

Uwaga

Sterownik minifiltru nie powinien używać FLT_PREOP_SYNCHRONIZE do przechowywania zasobu między wywołaniami wstępnymi i po operacji (tak samo jak nie powinien przechowywać zasobu w wywołaniu we/wy). Postępowanie w ten sposób jest niebezpieczne, ponieważ może spowodować zakleszczenia.

Jeśli procedura wywołania zwrotnego przed operacją sterownika minifiltru synchronizuje operację we/wy, zwracając FLT_PREOP_SYNCHRONIZE, to Menedżer filtrów wywołuje procedurę wywołania zwrotnego po operacji podczas kończenia operacji we/wy.

  • Jeśli filtr nie odprowadza wody, Menedżer filtrów wywołuje procedurę wywołania zwrotnego po operacji tego filtru w tym samym kontekście wątku, co procedura wywołania zwrotnego przed operacją, na poziomie IRQL <= APC_LEVEL. (Należy pamiętać, że ten kontekst wątku nie musi być kontekstem wątku źródłowego).
  • Jeśli filtr jest opróżniony, Menedżer filtrów nie synchronizuje się z powrotem z oryginalnym wątkiem.

Uwaga

Jeśli procedura wywołania zwrotnego przed operacją filtru zwraca FLT_PREOP_SYNCHRONIZE, musi zaimplementować procedurę wywołania zwrotnego po operacji dla tej operacji.

Jeśli przedoperacyjna procedura wywołania zwrotnego filtra zwraca FLT_PREOP_SYNCHRONIZE, wtedy może zwrócić wartość inną niż NULL w parametrze wyjściowym CompletionContext. Ten parametr to opcjonalny wskaźnik kontekstu przekazywany do odpowiedniej procedury wywołania zwrotnego po zakończeniu operacji. Procedura wywołania zwrotnego po operacji odbiera ten wskaźnik w parametrze wejściowym CompletionContext.

Procedura wywołania zwrotnego przed operacją sterownika minifiltru powinna zwracać FLT_PREOP_SYNCHRONIZE tylko w przypadku operacji we/wy opartych na IRP. Tę wartość stanu można jednak zwrócić dla innych typów operacji. Jeśli jest zwracana dla operacji we/wy, która nie jest operacją we/wy opartą na protokole IRP, Menedżer filtrów traktuje tę wartość zwracaną tak, jakby była FLT_PREOP_SUCCESS_WITH_CALLBACK. Aby określić, czy operacja jest operacją we/wy opartą na protokole IRP, użyj makra FLT_IS_IRP_OPERATION.

Filtry nie powinny zwracać FLT_PREOP_SYNCHRONIZE dla operacji tworzenia, ponieważ te operacje są już synchronizowane przez Menedżera filtrów. Jeśli sterownik minifiltru zarejestrował procedury wywołania zwrotnego przed i po operacji dla operacji IRP_MJ_CREATE, procedura wywołania zwrotnego po utworzeniu jest wywoływana na poziomie IRQL = PASSIVE_LEVEL, w tym samym kontekście wątku co procedura wywołania zwrotnego przed utworzeniem.

Sterowniki minifiltru nigdy nie powinny zwracać FLT_PREOP_SYNCHRONIZE dla operacji odczytu lub zapisu asynchronicznego. Może to poważnie obniżyć wydajność zarówno sterownika minifiltru, jak i systemu, a nawet spowodować zakleszczenia, jeśli na przykład zmodyfikowany wątek zapisywania strony jest zablokowany. Przed zwróceniem FLT_PREOP_SYNCHRONIZE dla operacji odczytu lub zapisu opartej na protokole IRP sterownik minifiltru powinien sprawdzić, czy operacja jest synchroniczna, wywołując FltIsOperationSynchronous.

Nie można zsynchronizować następujących typów operacji we/wy:

FLT_PREOP_SYNCHRONIZE nie można zwrócić dla żadnej z tych operacji.