Как лучше отключить Completion Routine при выгрузке фильтра?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.02.13 14:20
Оценка:
Есть драйвер-фильтр в формате legacy, динамически загружающийся и выгружающийся. При выгрузке может оказаться, что в обработке у нижележащего драйвера находятся IRP, в которых зарегистрирована Completion Routine фильтра. Просто ждать, пока IRP завершатся естественным путем, не подходит — это может занять неопределенно долгое время. Обнулить CompletionRoutine в стековой ячейке тоже нельзя — IoCompleteRequest при вызове процедуры не пользуется средствами синхронизации.

Пока драйвер тупо сбрасывает флажки SL_INVOKE_ON_xxx и ждет пару десятков миллисекунд на тот случай, если в DPC или на соседнем процессоре в этот момент идет завершение IRP. Но это, понятно, хак, хотелось бы почище. Есть вариант отменить IRP, чтобы процедура драйвера вызвалась и отправила этот IRP обратно вниз, уже без ссылки на себя, но это уже как-то слишком масштабно. Может, есть более аккуратный способ? Думал в FileMon посмотреть, а у меня исходники только под Win9x, исходников под NT в открытом доступе что-то не могу найти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.