Освобождение объектов устройства и контроллера
Прежде чем драйвер удаляет объект устройства или контроллера, он должен освободить свои ссылки на внешние ресурсы, такие как указатели на объекты других драйверов, или прервать объекты, сохраненные в соответствующем расширении устройства или контроллера. Затем он может вызывать IoDeleteDevice для каждого объекта устройства, созданного драйвером. Драйвер, отличный от WDM, который ранее назывался IoCreateController , также должен вызывать IoDeleteController.
Любой объект, определенный ядром, для которого драйвер предоставляет хранилище в расширении устройства, автоматически освобождается, когда подпрограмма Unload вызывает IoDeleteDevice с соответствующим объектом устройства. Как правило, любой объект, настроенный подпрограммой DriverEntry или Reinitialize путем вызова KeInitializeXxx , можно освободить путем вызова IoDeleteDevice , если драйвер предоставил хранилище для этого объекта в расширении устройства. Например, если драйвер имеет подпрограмму CustomTimerDpc и предоставил хранилище для необходимых объектов DPC и таймера в расширении устройства, вызов IoDeleteDevice освобождает эти системные ресурсы.
Аналогичным образом, любой объект, определяемый ядром, для которого драйвер предоставляет хранилище в расширении контроллера, автоматически освобождается, когда подпрограмма Unload вызывает IoDeleteController с соответствующим объектом контроллера.
Если подпрограмма DriverEntry или Повторная инициализацияс именем IoGetConfigurationInformation увеличивает количество для определенного типа устройств, подпрограмма Unload также должна вызывать IoGetConfigurationInformation и уменьшать количество устройств в глобальной структуре сведений о конфигурации диспетчера операций ввода-вывода, так как удаляет соответствующие объекты устройства.
Перед возвратом управления подпрограмма выгрузки также отвечает за освобождение всех других ресурсов, выделенных драйвером, которые еще не были освобождены другими подпрограммами драйвера.