среда, 26 мая 2010 г.

Выгрузка драйвера, условия работы DriverUnload

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

Инициализация драйвера подобна процессу создания объекта класса в С++. Когда вы создаете объект класса, то в случае, если тело конструктора корректно не отработало и некорректно завершен, тогда не следует ждать работы деструктора объекта. Он отработает только, когда корректно создан объект, читай корректно отработал конструктор. Другими словами, если вам, к примеру, нужно сделать 5 действий, а из них корректно выполнены только 4, то вы должны внутри конструктора "откатить" изменения сделанные этими 4 действиями и только тогда вы можете завершать работу конструктора бросанием исключения. Не стоит надеяться на то что в деструкторе все почистится и завершится!

В модели драйверов WDM точно также, есле не отработана функция DriverEntry, т.е. не завершена кодом возврата STATUS_SUCCESS, то зарегистрированная функция DriverUnload не отработает!

Еще раз подчеркну важность освобождения ресурсов на случай, если что-то пошло не так в конструкторе объекта, если это С++ или в функции инициализации драйвера!

Кстати вот слова взятые тут:
"Note that a driver's Unload routine is not called if a driver's DriverEntry routine returns a failure status."

Комментариев нет: