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.
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:
Operacje kontroli systemu plików Oplock (FSCTL) (MajorFunction jest IRP_MJ_FILE_SYSTEM_CONTROL; FsControlCode jest FSCTL_REQUEST_FILTER_OPLOCK, FSCTL_REQUEST_BATCH_OPLOCK, FSCTL_REQUEST_OPLOCK_LEVEL_1lub FSCTL_REQUEST_OPLOCK_LEVEL_2).
Powiadom o operacjach zmiany katalogu (MajorFunction jest IRP_MJ_DIRECTORY_CONTROL; MinorFunction jest IRP_MN_NOTIFY_CHANGE_DIRECTORY.)
Żądania blokady zakresu bajtów (Główna funkcja to IRP_MJ_LOCK_CONTROL; Funkcja podrzędna to IRP_MN_LOCK.)
FLT_PREOP_SYNCHRONIZE nie można zwrócić dla żadnej z tych operacji.