Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДП.docx
Скачиваний:
11
Добавлен:
23.09.2019
Размер:
4.64 Mб
Скачать

2.3.6 Процедура деинициализации драйвера

Как правило, однажды загруженный драйвер остается в системе до перезагруз­ки. Для того чтобы сделать драйвер выгружаемым, необходимо написать и зареги­стрировать процедуру выгрузки. Диспетчер ввода/вывода затем произво­дит вызов этой процедуры в момент ручной либо автоматической выгрузки драй­вера — как раз перед удалением драйвера из памяти [2.3].

Таблица 2.13 - Описание процедуры деинициализации драйвера

VOID DriverUnload

IRQL == PASSIVE_LEVEL

Параметры

Описание

IN PDRIVER_OBJECT DriverObject

Адрес (указатель) объекта драйвера

Возвращаемое значение

Ничего не возвращает (void)

Хотя действия процедуры DriverUnload могут меняться от драйвера к драйверу, общи­ми являются следующие шаги, характерные более для драйверов «встиле-NT» [2.3].

  • Для некоторых типов аппаратуры необходимо сохранить ее состояние в Сис­темном Реестре. При последующей загрузке драйвера эти данные могут быть использованы в процедуре DriverEntry. Скажем, драйвер принтера может со­хранить последнее значение разрешения печати.

  • Если прерывания разрешены для обслуживаемого устройства, то процедура выгрузки должна запретить их и произвести отключение от объекта преры­ваний. Ситуация, когда устройство будет порождать запросы на прерывание в то время, как объект прерываний не существует, неминуемо приведет к кра­ху системы.

  • Символьная ссылка должна быть удалена из пространства имен, видимого пользовательскими приложениями. Это выполняется при помощи вызова IoDeleteSymbolicLink.

  • Объект устройства должен быть удален вызовом IoDeleteDevice.

  • В случае, если драйвер управляет многокомпонентным (multiunit) контрол­лером, необходимо повторить шаги 3 и 4 для каждого устройства, подклю­ченного к контроллеру, а затем необходимо удалить сам объект контроллера при помощи вызова IoDeleteController.

  • Следует выполнить освобождение памяти, выделенной драйверу, во всех ти­пах оперативной памяти.

Драйверы WDM выполняют практически всё из описанных выше дейст­вий в обработчике IRP_MJ_PNP с дополнительным кодом IRP_MN_REMOVE (то есть посвященном удалению устройства из системы).

Поскольку процедура DriverUnload выполняется на уровне PASSIVE_LEVEL IRQL, то это означает возможность безопасного доступа к ресурсам страничной памяти.

Процедура выгрузки драйвера DriverUnload не вызывается в момент отката систе­мы, и если существует необходимость выполнить какую-либо работу при откате системы, то это следует сделать в соответствующей процедуре драйвера, зарегистрированной для обработки IRP пакетов с кодом IRP_MJ_SHUTDOWN.

С помощью вызова IoRegisterShutdownNotification объект устройства должен быть занесен в очередь объектов, получающих уведомление о перезагрузке, — только при этом условии будет вызвана процеду­ра, зарегистрированная для обработки пакетов с кодом IRP_MJ_SHUTDOWN.