3.4.5 Выгрузка драйвера
Выгрузка драйвера состоит из двух частей: удаление объекта устройства и выгрузка самого драйвера.
При удалении объекта устройства, менеджер ввода вывода посылает IRP пакет IRP_MN_REMOVE_DEVICE, тогда вызывается процедура RamDskRemove Device. IRP пакет передаем дальше драйверу нижнего уровня с помощью функции IoCallDriver. Статус драйвера устанавливается в состояние устройство удалено, чтобы новые запросы не могли быть выполнены. С помощью функции IoReleaseRemoveLockAndWait ждем пока текущие запросы не обработаются.
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocation( Irp );
status = IoCallDriver( devExt->LowerDeviceObject, Irp );
devExt->DevState = REMOVED;
IoReleaseRemoveLockAndWait(&devExt->RemoveLock, Irp);
driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject,
RAMDSK_DRIVER_EXTENSION_KEY);
ASSERT ( driverExtension != NULL );
driverExtension->DeviceInitialized = FALSE;
RamDskCleanUp( DeviceObject );
Перед удалением расширения объекта устройства в процедуре RamDskCleanUp освобождается память под образ диска, удаляется символическая ссылка и сам функциональный объект устройства. Также далее сбрасывается признак DeviceInitialized инициализации устройства.
При выгрузке самого драйвера вызывается процедура RamDskUnload, которая должна обязательно присутствовать, чтобы драйвер мог выгружаться.
VOID RamDskUnload(IN PDRIVER_OBJECT DriverObject)
{
PRAMDSK_DRIVER_EXTENSION driverExtension;
DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("Driver Unload ") );
ASSERT(DriverObject->DeviceObject == NULL);
driverExtension = IoGetDriverObjectExtension(DriverObject,RAMDSK_DRIVER_EXTENSION_KEY);
ASSERT ( driverExtension != NULL );
if ( driverExtension->RegistryPath.Buffer )
{
ExFreePool( driverExtension->RegistryPath.Buffer );
}
return;
} // Конец RamDskUnload()
В данной процедуре удаляется уже расширение драйвера.
- 1. АНАЛИТИЧЕСКИЙ РАЗДЕЛ
- 1.1 Постановка задачи
- 1.2 Архитектура Windows 2000
- 1.3 Многослойная архитектура драйверов
- 1.4 Архитектура драйверов устройств хранения
- 1.5 Выбор файловой системы
- 2. КОНСТРУКТОРСКИЙ РАЗДЕЛ
- 2.1 Структура классового драйвера
- 2.2 Организация внутреннего хранения данных диска
- 2.3 Доступ к передаваемым данным
- 2.4 Обработка запросов Plug and Play
- 2.5 Обработка расширенных запросов
- 3. ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ
- 3.1 Выбор и обоснование языка и среды программирования
- 3.2 Структуры данных классового драйвера
- 3.3 Блокировка выгрузки устройства
- 3.4 Процедуры драйвера виртуального диска
- 3.4.1 Инициализация драйвера
- 3.4.2 Обработка запросов записи/чтения
- 3.4.3 Обработка расширенных запросов
- 3.4.4 Обработка запросов Plug and Play
- 3.4.5 Выгрузка драйвера
- 3.5 Программа настройки параметров виртуального диска
- 3.6 Установка драйвера