Аноним
Гость
|
|
« : 04-10-2004 19:31 » |
|
В диспетчерской процедуре есть счетчик:
Count++
Некоторые команды
Count –
Как в Unload, если ее вызвали во время работы диспетчерской процедуры, заставить ждать, пока в диспетчерской процедуре не обнулиться счетчик и только потом Unload продолжит выполнение ?
То есть:
Процедура Unload:
Если count <> 0 то ожидание пока все таки count не станет равным нулю, то есть продолжается выполнение диспетчерской процедуры.
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #1 : 05-10-2004 13:01 » |
|
Если я не ошибаюсь, то диспетчерская процедура не может ждать - это приводит к синему экрану. Нужно выйти из DISPATCH_LEVEL подождать, а уж потом выгружаться.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Аноним
Гость
|
|
« Ответ #2 : 05-10-2004 20:09 » |
|
Scorp__), здесь речь о том, чтобы ждала не диспетчерская процедура, а процедура выгрузки.
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #3 : 06-10-2004 17:42 » |
|
Тогда ты можешь использовать стандартные средства для синхронизации, например семафор. И пользуйся KeWaitForSingleObject(). По-моему так
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Аноним
Гость
|
|
« Ответ #4 : 07-10-2004 20:59 » |
|
У меня не PnP фильтр. Пробовал так:
переменная KEVENT event в DRIVER_EXTENSION
в driverentry
KeInializeEvent
в диспетчерской процедуре
KeClearEvent
потом например
IoSkipCurrentIrpStackLocation
IoCallDriver
и
kesetevent
в Unload
KeWaitForSingleObject
и нифига не работает
Как тогда, чтобы KeWaitForSingleObject работал ?
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #5 : 08-10-2004 09:30 » |
|
А поподробней параметры и возвращаемые значения напиши пожалуйста. Просто основных знатоков почему-то нет сейчас , а я с такими данными не могу ответить, все-таки недавно совсем драйвера начал писать :oops:.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Серж
Гость
|
|
« Ответ #6 : 08-10-2004 10:19 » |
|
Аноним, что возвращает KeWaitForSingleObject?
|
|
|
Записан
|
|
|
|
Аноним
Гость
|
|
« Ответ #7 : 09-10-2004 16:52 » |
|
Переменная KEVENT Event в Device Extension
DrtiverEntry
KeInitializeEvent (pDeviceExtension->Event, SynchronizationEvent, FALSE) Возвращает указатель на «событие»
Dispatch
KeClearEvent (pDeviceExtension->Event) Возвращает указатель на «событие» Count++ IoSkipCurrentIrpStackLocation IoCallDriver
Count -- KeSetEvent (pDeviceExtension->Event, 0, FALSE) Возвращает ноль
DriverUnload
Detach
If count != 0 KeWaitForSingleObject (pDeviceExtension->Event, Executive, KernelMode, FALSE, NULL) Возвращает ноль и количество объектов (count) = 0 Endif Если диспетчерская процедура не выполнялась или выполнилась (все IRPs уже прошли) , то KeWaitForSingleObject конечно же (из кода выше) не выполняется.
IoDeleteDevice
Если выполнялась диспетчерская процедура, то после вызова IoDeleteDevice синий экран с ошибкой 0x00000CE.
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #8 : 11-10-2004 08:18 » |
|
Аноним, раз KeWaitForSingleObject возвращает 0, то она дожидается события, а посмотри, сам device к моменту выполнения IoDeleteDevice существует? Такое впечатление, что его уже нет.
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #9 : 11-10-2004 10:00 » |
|
Аноним, либо вновь возникает прерывание. Если есть обработка прерывания, проверь, делаешь ли IoDisconnectInterrupt.
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #10 : 11-10-2004 10:40 » |
|
"... а посмотри, сам device к моменту выполнения IoDeleteDevice существует?"
Куда он может деться ? Может просто на него есть ссылки, и при удалении устройства, ссылки на него не удаляются. Код ошибки 0x00000CE, то есть Driver_unloading_without_cancelling_pending_operations.
Серж, нет обработки прерывания.
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #11 : 11-10-2004 11:06 » |
|
Может быть, действительно остаются IRP в очереди, им тоже нужен Cancel. Попробуй остановиться в SoftIce на удалении устройства, и посмотри, что еще осталось живое.
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #12 : 12-10-2004 10:34 » |
|
Серж, у меня не испоьзуется внутренняя очередь устройства и если вызывается Unload при выполнении диспетчерской процедуры, действительно count != 0, но функцию KeWaitForSingleObject ставлю для чего, для того, чтобы выполнение диспетчерской процедуры продолжилось, пока count не станет равным нулю (код приведен выше) .
Ошибка появляется после вызова IoDeleteDevice (когда вызывается ExRelese вроде Resource или WorkItem, которая вызывает KeRemoveQueue и уже после нее ... дец, то есть, наверное при высвобождении ресурсов системной нитки) .
Только что не освобождается ...
И еще заметил, когда идет "загрузка" фильтра, pFile сначала равен нулю, потом он не равен нулю, но после выгрузки, он не становится равным нулю, хотя вызывается OdDereferenceObject pFile.
Количество ссылок на филтруемый объект не уменьшается.
Где pFile "держится" ...
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #13 : 12-10-2004 12:13 » |
|
Pe, без текста можно долго гадать, что происходит в твоей программе. По тем обрывкам кода, которые приведены, могу еще высказать гипотезу, что IoCallDriver может вернуть STATUS_PENDING вместо нормального завершения, а ты не проверив его, уничтожаешь свой девайс, оставляя висящим запрос к нижележащему драйверу.
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #14 : 14-10-2004 09:57 » |
|
Серж, с pFile' ом уже все понятно. Сделал.
Так у меня в диспетчерской процедуре кроме того, что написал выше, ничего нет. И у меня - то ассинхронная обработка IRP, отправили и не ждем что там "внизу".
|
|
|
Записан
|
|
|
|
|