Поделиться через


Выгрузка среды подпрограммы

Операционная система выгружает драйвер при замене драйвера или при удалении всех устройств, которые он обслуживает. Диспетчер PnP вызывает подпрограмму выгрузки драйвера PnP, если у драйвера больше нет объектов устройств после обработки запроса IRP_MN_REMOVE_DEVICE .

В начале последовательности выгрузки диспетчер операций ввода-вывода или диспетчер PnP помечает объект драйвера и его объекты устройства как "Ожидание выгрузки". После того как драйвер был помечен как "Ожидание выгрузки", никакие дополнительные драйверы не могут подключаться к этому драйверу, а также не могут создаваться дополнительные ссылки на объекты устройства драйвера. Драйвер может завершить невыполненные IRP, но система не будет отправлять новые irP драйверу.

Диспетчер операций ввода-вывода вызывает подпрограмму выгрузки драйвера, если выполняются все перечисленные ниже действия.

  • Ссылки на объекты устройства, созданные драйвером, не остаются. Иными словами, никакие файлы, связанные с базовым устройством, не могут быть открыты, а также не могут быть невыполненными для любых объектов устройства драйвера.

  • Другие драйверы не остаются подключенными к этому драйверу.

  • Драйвер вызвал IoUnregisterPlugPlayNotification , чтобы отменить регистрацию всех уведомлений PnP, для которых он ранее зарегистрирован.

Обратите внимание, что подпрограмма Unload не вызывается, если подпрограмма DriverEntry драйвера возвращает состояние сбоя. В этом случае диспетчер ввода-вывода просто освобождает место в памяти, занимаемое драйвером.

Ни диспетчер PnP, ни диспетчер операций ввода-вывода не вызывают подпрограммы выгрузки во время завершения работы системы. Драйвер, который должен выполнять обработку завершения работы, должен зарегистрировать подпрограмму DispatchShutdown .