Здравствуйте, onyx2,
O>Я хочу чтобы мой драйвер был выгружаемым. Поэтому регистирирую UnloadRoutine.
O>Но в некоторые моменты работы я не могу выгружать драйвер. И, например, именно в этот момент пришел запрос на выгрузку драйвера, т.е. вызывается UnloadRoutine.
O>Как отменить выгрузку драйвера в UnloadRoutine? Или это делается не в UnloadRoutine?
--
Лучше не "играться" с UnloadRoutine, а сообщать системе, что драйвер не может быть остановлен и/или выгружен.
Unload не может быть вызвана без посылки драйверу сообщений IRP_MN_QUERY_STOP_DEVICE и IRP_MN_QUERY_REMOVE_DEVICE. Обрабатывайте их корректно — и Ваш драйвер не будет остановлен или выгружен.
Если это не приемлимо и Вы знаете, что именно сейчас останавливать/выгружать драйвер нельзя, сообщите системе, что состояние Вашего драйвера изменилось, вызвав функцию IoInvalidateDeviceState, и далее, обрабатывая PNP_DEVICE_STATE, установите флаг PNP_DEVICE_NOT_DISABLEABLE.
Еще один способ добиться этого (если условие не выгрузки драйвера доступно в user's mode) — обрабатывать в driver co-installer сообщения DIF_PROPERTYCHANGE (для остановки драйвера) или DIF_REMOVE (для uninstall драйвера). Преимущество этого варианта — можно сообщить пользователю об этой ситуации.