Udostępnij przez


Oddzielne procedury DispatchCreate i DispatchClose

Procedury wysyłania sterownika dla IRP_MJ_CREATE i żądań IRP_MJ_CLOSE mogą nie robić nic więcej niż ukończenie wejściowego protokołu IRP przy użyciu STATUS_SUCCESS. Aby uzyskać więcej informacji, zobacz Realizowanie IRP.

Inne procedury wysyłania sterownika dla IRP_MJ_CREATE i IRP_MJ_CLOSE żądań mogą wykonywać więcej pracy, w zależności od podstawowego sterownika urządzenia lub na urządzeniu bazowym. Rozważ następujące scenariusze:

  • Po otrzymaniu żądania utworzenia sterownik klasy może zainicjować kolejkę wewnętrzną i wysłać żądanie IRP_MJ_INTERNAL_DEVICE_CONTROL do odpowiedniego sterownika portu żądającego informacji o konfiguracji urządzenia lub wyłącznego dostępu do portu kontrolera.

  • Potwierdzenie IRP_MJ_CLOSE wskazuje, że ostatnie odwołanie do obiektu pliku skojarzonego z obiektem urządzenia docelowego zostało usunięte. Oznacza to, że wszystkie dojścia do obiektu pliku zostały zamknięte i wszystkie zaległe żądania I/O zostały ukończone lub anulowane.

  • Po otrzymaniu żądania utworzenia sterownik rzadko używanego urządzenia może wywołać polecenie MmLockPagableCodeSection , aby zapewnić rezydentom niektóre procedury sterowników, które przetwarzają inne żądania IRP_MJ_XXX . Po otrzymaniu odwzajemnionego żądania zamknięcia sterownik może wywołać MmUnlockPagableImageSection, aby zaoszczędzić pamięć systemową poprzez umożliwienie stronicowania sekcji obrazu, gdy wszystkie uchwyty obiektów plików dla takich obiektów urządzenia sterownika są zamknięte.

Niektóre sterowniki obsługują IRP_MJ_CLOSE żądania tylko dla zachowania symetrii, ponieważ po otwarciu ich obiektów urządzeń przez podsystem chroniony lub sterownik wyższego poziomu, obiekty urządzeń sterowników niższego poziomu nie są zamykane, dopóki sam system nie zostanie wyłączony. Na przykład sterowniki klawiatury i myszy konfigurują obiekty urządzeń reprezentujących urządzenia fizyczne, które muszą być funkcjonalne podczas działania systemu, więc te sterowniki mogą mieć minimalne procedury DispatchClose dla symetrii lub mogą mieć połączone procedury DispatchCreateClose .

Jeśli urządzenie kontrolowane przez sterownik niższego poziomu musi być dostępne, aby system kontynuował działanie, procedura DispatchClose sterownika zwykle nie będzie wywoływana. Na przykład niektóre sterowniki dysków systemowych nie mają procedury DispatchClose , ale te sterowniki zwykle mają procedury DispatchFlushBuffers i DispatchShutdown , aby ukończyć wszystkie zaległe operacje we/wy plików przed zamknięciem systemu.

Chociaż można zaimplementować oddzielne procedury DRIVER_DISPATCH i DispatchClose , sterowniki czasami mają jedną procedurę DispatchCreateClose do obsługi zarówno tworzenia, jak i zamykania żądań.