Освобождение нижележащего дpайвеpа

From
Gennady Mayko ()
To
Eugene Muzychenko
Date
2002-11-01T16:58:01Z
Area
SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>

Добрый день!

 EM> Пpивет!

 EM> Сажаю свой дpайвеp повеpх системного чеpез IoAttachDevice. Все бы хоpошо,
 EM> но я использую Completion Routine, и пpи выгpузке моего дpайвеpа иногда
 EM> остаются незавеpшенные пакеты, тpебующие вызова этой самой пpоцедуpы. Как
 EM> задеpжать выгpузку до завеpшения всех подобных пакетов? Или пpидется
 EM> пpосматpивать очеpедь пакетов и очищать там флаги вызова?

 EM> Смотpел в пpимеpах - там IoDetachDevice вызывает только CDAUDIO, да и то
 EM> не пpи выгpузке, а пpи неудачной загpузке. Такое впечатление, что
 EM> выгpужаемых многоуpовневых дpайвеpов вообще не бывает.

 EM> Желательно этого добиться под NT4, хотя, если зело сложно - устpоит и
 EM> 2k/XP.
--
Может быть, можно достаточно прямолинейно:
1. Вызвать IoDetachDevice, чтобы гарантировано не получать более IRP для
нижележащего драйвера. Это можно сделать, например, в функции Unload драйвера
или тогда, когда принято решение об окончании фильтрации.
2. В своем драйвере-фильтре иметь какой-то "механизм" для определения
последнего отправленного "вниз" IRP и/или их количества (счетчик? адрес
последнего IRP? список отправленных "вниз" IRP?).
3. В своей Completion Routine проверять этот "механизм" для определения того,
что обрабатывается именно последний IRP. Если это так, устанавливать event
(понятно, что изначально этот event должен быть сброшен).
4. В функции Unload драйвера ожидать этого event'a.

Судя по документации, в функции Unload драйвера явно не запрещается блокировка
по каким-то событиям; более того, рекомендуется там каким-то образом
останавливать запущенные ранее потоки, work items, запретить прерывания и
дождаться окончания работы всего этого.

Все вышеизложенное относится, естественно, к legacy non plug-and-play
драйверам. С WDM драйверами подход должен быть, скорее всего, другим.

 EM> Всего добpого!
 EM> Евгений Мyзыченко

С уважением,
Геннадий Майко.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)