Подпрограмма выгрузки драйвера PnP
Драйвер PnP должен иметь подпрограмму выгрузки , которая удаляет все ресурсы, относящиеся к драйверу, такие как память, потоки и события, созданные подпрограммой DriverEntry . Если нет ресурсов, относящихся к конкретному драйверу для удаления, драйвер должен по-прежнему иметь подпрограмму выгрузки , но он может просто вернуться.
Подпрограмму выгрузки драйвера можно вызвать в любое время после удаления всех устройств драйвера. Диспетчер PnP вызывает подпрограмму выгрузки драйвера в контексте системного потока в IRQL = PASSIVE_LEVEL.
Драйверы PnP освобождают ресурсы и объекты устройств, относящиеся к конкретному устройству, в ответ на PnP-удаление устройств IRP. Диспетчер PnP отправляет эти irP от имени каждого устройства PnP, которое он перечисляет, а также любых устаревших устройств с корнем, которые драйвер сообщает с помощью IoReportDetectedDevice.
Следовательно, подпрограммы выгрузки драйверов PnP обычно просты и часто состоят только из оператора return . Однако если драйвер выделил какие-либо ресурсы для всего драйвера в своей процедуре DriverEntry , он должен освободить эти ресурсы в своей подпрограмме выгрузки , если он уже не сделал этого. Как правило, процесс выгрузки драйвера PnP является синхронной операцией.
Диспетчер ввода-вывода освобождает объект драйвера и все расширения объектов драйвера, выделенные драйвером с помощью IoAllocateDriverObjectExtension.