Udostępnij przez


Zwalnianie obiektów urządzeń i kontrolerów

Zanim sterownik usunie obiekt urządzenia lub kontrolera, musi zwolnić odwołania do zasobów zewnętrznych, takich jak wskaźniki do obiektów innych sterowników lub przerwać obiekty, które są przechowywane w odpowiednim rozszerzeniu urządzenia lub kontrolera. Następnie może wywołać metodę IoDeleteDevice dla każdego obiektu urządzenia utworzonego przez sterownik. Sterownik nie-WDM, który wcześniej wywołał IoCreateController, musi również wywołać IoDeleteController.

Dowolny obiekt zdefiniowany przez jądro, dla którego sterownik zapewnia magazyn w rozszerzeniu urządzenia, jest automatycznie zwalniany, gdy procedura Unload wywołuje funkcję IoDeleteDevice z odpowiednim obiektem urządzenia. Ogólnie rzecz biorąc, każdy obiekt, który rutyny DriverEntry lub Reinitialize skonfigurowały przez wywołanie KeInitializeXxx, może zostać zwolniony przez wywołanie IoDeleteDevice, jeśli sterownik dostarczył magazyn dla tego obiektu w swoim rozszerzeniu urządzenia. Jeśli na przykład sterownik ma procedurę CustomTimerDpc i zapewnił pamięć na niezbędne obiekty DPC i czasomierza w rozszerzeniu sterownika, wywołanie funkcji IoDeleteDevice zwalnia te zasoby systemowe.

Podobnie każdy obiekt zdefiniowany przez jądro, dla którego sterownik udostępnia magazyn w rozszerzeniu kontrolera, jest automatycznie zwalniany, gdy procedura Unload wywołuje IoDeleteController z odpowiednim obiektem kontrolera.

Jeśli procedura DriverEntry lub Reinitialize wywołała IoGetConfigurationInformation, aby zwiększyć licznik dla określonego typu urządzenia, procedura Unload również musi wywołać IoGetConfigurationInformation i zmniejszyć licznik swoich urządzeń w globalnej strukturze informacji o konfiguracji menedżera we/wy, gdy usuwa odpowiednie obiekty urządzeń.

Przed zwróceniem kontroli, procedura zwalniania jest również odpowiedzialna za zwalnianie innych zasobów przydzielonych przez sterownika, które nie zostały jeszcze zwolnione przez inne procedury sterownika.