Udostępnij przez


Rutyny DispatchCleanup

Procedura DispatchCleanup sterownika obsługuje IRPs dla kodu funkcji we/wy IRP_MJ_CLEANUP.

Sterowniki mogą używać procedury DispatchCleanup do wykonywania wszelkich operacji oczyszczania, które są potrzebne po zamknięciu wszystkich dojść do obiektu pliku. Należy pamiętać, że DispatchCleanup jest wywoływane w kontekście procesu, który zamknął końcowy uchwyt; ten proces może różnić się od procesu, który początkowo otworzył uchwyt. (Różnica ta zazwyczaj występuje, ponieważ inny proces używa funkcji w trybie użytkownika DuplicateHandle w celu zduplikowania uchwytów procesów). Sterowniki, które muszą wykonać oczyszczanie w oryginalnym kontekście procesu, mogą używać procedury PsSetCreateProcessNotifyRoutine, aby zarejestrować procedurę wywołania zwrotnego w tym celu, ale należy pamiętać, że takie wywołania zwrotne są ograniczonym zasobem systemowym.

Ogólnie rzecz biorąc, procedura DispatchCleanup musi przetworzyć żądanie IRP_MJ_CLEANUP, wykonując następujące czynności dla każdego IRP, który znajduje się obecnie w kolejce urządzenia (lub wewnętrznej kolejce sterownika IRP), dla obiektu urządzenia docelowego i jest skojarzony z obiektem pliku:

  • Wywołaj metodę IoSetCancelRoutine , aby ustawić wskaźnik procedury Anuluj na wartość NULL.

  • Anuluj każdy IRP znajdujący się obecnie w kolejce dla obiektu urządzenia docelowego, jeśli obiekt pliku określony w lokalizacji stosu wejścia/wyjścia sterownika dla zakolejkowanego IRP jest zgodny z obiektem pliku, który został odebrany w lokalizacji stosu wejścia/wyjścia dla żądania IRP_MJ_CLEANUP.

  • Wywołaj metodę IoCompleteRequest, aby ukończyć IRP i zwrócić STATUS_SUCCESS.

Podczas przetwarzania żądania IRP_MJ_CLEANUP sterownik może odbierać dodatkowe żądania, takie jak IRP_MJ_READ lub IRP_MJ_WRITE. W związku z tym sterownik, który musi cofnąć przydział zasobów, musi również zsynchronizować wykonywanie procedury DispatchCleanup z innymi procedurami wysyłania, takimi jak DispatchRead i DispatchWrite.