Udostępnij przez


Wskazówki dotyczące przenoszenia starszych sterowników filtrów

Deweloperzy są zachęcani do przenoszenia starszych sterowników filtrów do modelu menedżera filtrów, aby uzyskać lepsze funkcje sterowników filtrów i zwiększyć niezawodność systemu. Doświadczeni deweloperzy powinni uznać to za stosunkowo łatwe, aby przeportować stary sterownik filtru do sterownika minifiltru. Deweloperzy sterowników filtrów w firmie Microsoft zalecają następujące podejście:

  • Zacznij od niezawodnego zestawu testów regresji, aby zweryfikować zachowanie starszego sterownika filtru i sterownika minifiltru portowego.

  • Utwórz powłokę sterownika minifiltru i systematyczne przenoszenie funkcji ze starszego sterownika filtru do sterownika minifiltru. Na przykład, uruchom działanie załącznika, a następnie przenoś jedną operację na raz, testując po każdej operacji.

  • Zmień komunikację w trybie użytkownika/trybie jądra na końcu, aby móc użyć istniejących narzędzi do przetestowania sterownika minifiltru.

  • Skompiluj z użyciem PREfast i przetestuj, włączając opcję weryfikacji I/O w Weryfikatorze filtra w Weryfikatorze sterownika.

Podczas procesu przenoszenia należy przejrzeć cały starszy kod sterownika filtru, aby w pełni wykorzystać możliwości menedżera filtrów. W szczególności należy pamiętać o następujących kwestiach:

  • Operacje we/wy oparte na IRP i szybkie operacje we/wy mogą być realizowane w ramach tej samej operacji, gdy to odpowiednie, co pomaga zmniejszyć duplikację kodu.

  • Podczas rejestrowania operacji sterownik minifiltru może jawnie zignorować wszystkie operacje wejścia/wyjścia związane ze stronicowaniem i buforowaniem, co eliminuje potrzebę sprawdzania kodu.

  • Powiadomienia o wystąpieniach znacznie upraszczają logikę dołączania/odłączania.

  • Zarejestruj się tylko w przypadku operacji, które musi obsługiwać sterownik minifiltru; możesz zignorować wszystkie inne elementy.

  • Skorzystaj z obsługi zarządzania kontekstami i nazwami menedżera filtrów.

  • Skorzystaj z obsługi menedżera filtrów do realizowania nierekurencyjnych operacji we/wy.

  • W przeciwieństwie do starszych sterowników filtrów sterowniki minifiltrów nie mogą polegać na zmiennych lokalnych w celu zachowania kontekstu od przetwarzania wstępnego do przetwarzania pooperacyjnego. Rozważ przydzielenie listy lookaside do przechowywania stanu operacji.

  • Pamiętaj, aby zwolnić odwołania po zakończeniu korzystania z nazwy lub kontekstu.

  • Porty kompletacji w trybie użytkownika dodają zaawansowaną technikę tworzenia kolejek. Prawdopodobnie będzie potrzebne tylko jedno połączenie z jednym nazwanym portem.

W poniższej tabeli wymieniono typowe operacje w starszym sterowniku filtru i sposób mapowania ich na model menedżera filtrów.

Starszy model sterownika filtru Model menedżera filtrów

Operacja przekazywania bez procedury uzupełniania

Jeśli sterownik minifiltru nigdy nie obsługuje tego typu operacji we/wy, nie rejestruj procedury przedoperacyjnej ani procedury wywołania zwrotnego po operacji dla tej operacji.

W przeciwnym razie zwróć FLT_PREOP_SUCCESS_NO_CALLBACK z zarejestrowanej procedury wywołania przedoperacyjnego dla tej operacji.

Zobacz Zwracanie FLT_PREOP_SUCCESS_NO_CALLBACK.

Operacja przekazywania z procedurą uzupełniania

Zwróć FLT_PREOP_SUCCESS_WITH_CALLBACK z procedury wywołania zwrotnego przedoperacji.

Zobacz Zwracanie FLT_PREOP_SUCCESS_WITH_CALLBACK.

Operacja oczekująca w funkcji wywołania zwrotnego przed operacją

Wywołaj FltLockUserBuffer zgodnie z potrzebami, aby upewnić się, że bufory użytkownika są prawidłowo zablokowane, aby można było uzyskać do nich dostęp w wątku roboczym.

Dodaj pracę do wątku roboczego, wywołując funkcje pomocnicze, takie jak FltAllocateDeferredIoWorkItem i FltQueueDeferredIoWorkItem.

Zwróć FLT_PREOP_PENDING z procedury przedoperacyjnego wywołania zwrotnego.

Gdy wszystko będzie gotowe do zwrócenia operacji we/wy do menedżera filtrów, wywołaj metodę FltCompletePendedPreOperation.

Zobacz Oczekiwanie na operację I/O w procedurze wywołania zwrotnego przed operacją.

Operacja pend w procedurze wywołania zwrotnego pooperacji

W procedurze wywołania zwrotnego przedoperacyjnym wywołaj metodę FltLockUserBuffer, aby upewnić się, że bufory użytkownika są prawidłowo zablokowane, aby można było uzyskać do nich dostęp w wątku pracownika.

Kolejkowanie zadania do wątku roboczego przez wywołanie rutyn wsparcia, takich jak FltAllocateGenericWorkItem i FltQueueGenericWorkItem.

Zwróć FLT_POSTOP_MORE_PROCESSING_REQUIRED z rutyny wywołania zwrotnego po operacji.

Gdy będziesz gotowy, aby zwrócić operację we/wy do menedżera filtrów, wywołaj metodę FltCompletePendedPostOperation.

Zobacz Oczekiwanie na operację we/wy w procedurze wywołania zwrotnego po operacji.

Synchronizowanie operacji

Zwróć FLT_PREOP_SYNCHRONIZE z procedury wywołania zwrotnego przed operacją.

Zobacz Zwracanie FLT_PREOP_SYNCHRONIZE.

Ukończ operację w rutynie wywołania zwrotnego wstępnej operacji

Ustaw ostateczny stan operacji i informacje w elemencie członka IoStatus struktury FLT_CALLBACK_DATA dla operacji.

Zwróć FLT_PREOP_COMPLETE z rutyny wywołania zwrotnego przedoperacyjnego.

Zobacz Kończenie operacji we/wy w funkcji wywołania zwrotnego przed operacją.

Dokończ operację po jej zawieszeniu w procedurze wywołania zwrotnego przedoperacyjnej.

Ustaw końcowy stan operacji i informacje w członku IoStatus struktury FLT_CALLBACK_DATA dla operacji.

Wywołaj funkcję FltCompletePendedPreOperation z wątku roboczego przetwarzającego operację we/wy, przekazując FLT_PREOP_COMPLETE jako parametr CallbackStatus.

Zobacz Realizacja operacji we/wy w procedurze wywołania zwrotnego przed operacją.

Wykonaj wszystkie zadania ukończenia w rutynie ukończenia

Zwróć FLT_POSTOP_FINISHED_PROCESSING z wywołania zwrotnego procedury pooperacyjnej.

Zobacz Tworzenie procedur wywołań zwrotnych pooperacyjnych.

Wykonuj pracę zakończeniową na bezpiecznym poziomie IRQL

Wywołaj FltDoCompletionProcessingWhenSafe z procedury wywołania zwrotnego po zakończeniu operacji.

Zobacz Zapewnianie, że przetwarzanie uzupełniania jest wykonywane w bezpiecznym IRQL.

Zasygnalizować zdarzenie z procedury zakończenia

Zwróć FLT_PREOP_SYNCHRONIZE z procedury wywołania zwrotnego w preoperacji dla tej operacji.

Menedżer filtrów wywołuje procedurę wywołania zwrotnego pooperacji w tym samym kontekście wątku, co procedura wywołania zwrotnego przedoperacji, na poziomie IRQL <= APC_LEVEL.

Zobacz Zwracanie FLT_PREOP_SYNCHRONIZE.

Niepowodzenie pomyślnej operacji tworzenia

Wywołaj FltCancelFileOpen z procedury zwrotnej po operacji tworzenia.

Ustaw odpowiednią wartość błędu NTSTATUS w elemencie IoStatus członkowskim struktury FLT_CALLBACK_DATA dla operacji.

Zwróć FLT_POSTOP_FINISHED_PROCESSING.

Zobacz Nieudane operacje we/wy w procedurze wywołania zwrotnego po operacji.

Nie zezwalaj na operacje wejścia/wyjścia przez szybką ścieżkę dla operacji wejścia/wyjścia.

Zwróć FLT_STATUS_DISALLOW_FAST_IO z funkcji wywołania zwrotnego przed operacją dla operacji.

Zobacz Disallowing a Fast I/O Operation in a Preoperation Callback Routine (Usuwanie możliwości szybkiej operacji we/wy w procedurze wstępnego wywołania zwrotnego).

Modyfikowanie parametrów operacji we/wy

Ustaw zmodyfikowane wartości parametrów w elemencie Iopb struktury FLT_CALLBACK_DATA dla operacji.

Oznacz strukturę FLT_CALLBACK_DATA jako zanieczyszczoną, wywołując metodę FltSetCallbackDataDirty, z wyjątkiem sytuacji, gdy zawartość elementu członkowskiego IoStatus struktury FLT_CALLBACK_DATA została zmodyfikowana.

Zobacz Modyfikowanie parametrów dla operacji I/O.

Zablokuj bufor użytkownika na czas operacji

Skorzystaj z technik i wskazówek opisanych w Dostęp do buforów użytkownika dla operacji wejścia/wyjścia.