3.3 Блокировка выгрузки устройства
Когда система производит удаление нижестоящего устройства, она посылает ему PnP-запрос с функцией IRP_MN_REMOVE_DEVICE. Если же в этот момент драйвер чем-то занят, то он должен защитить своё устройство от преждевременной выгрузки из памяти. Для этого в системе предусмотрен объект «блокировка выгрузки» (remove lock). Он может быть «захвачен» и «освобождён». Внутри этого объекта имеется счётчик. Этот счётчик устанавливается в ноль при инициализации объекта (функция IoInitializeRemoveLock). Счётчик увеличивается на единицу при захвате объекта (IoAcquireRemoveLock) перед обработкой запроса и уменьшается при освобождении (IoReleaseRemoveLock).
Обработчик PnP-запроса с функцией IRP_MN_REMOVE_DEVICE гарантированно исполняется в контексте системного процесса. В этом обработчике перед удалением объекта-устройства над блокировкой выполняется действие «освободить и ждать» (IoReleaseRemoveLockAndWait). Оно уменьшает счётчик на единицу и блокирует системный процесс, пока счётчик не станет равным нулю. Следовательно, пока драйвер обрабатывает хотя бы один запрос к устройству, это устройство не будет удалено.
- 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 Установка драйвера