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.
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.