Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Счетчик в процедуре.  (Прочитано 11756 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Аноним
Гость
« : 04-10-2004 19:31 » 

В диспетчерской процедуре есть счетчик:

Count++

Некоторые команды

Count –

Как в Unload, если ее вызвали во время работы диспетчерской процедуры, заставить ждать, пока в диспетчерской процедуре не обнулиться счетчик и только потом Unload продолжит выполнение ?

То есть:

Процедура Unload:

Если count <> 0 то ожидание пока все таки count не станет равным нулю, то есть продолжается выполнение диспетчерской процедуры.
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 05-10-2004 13:01 » 

Если я не ошибаюсь, то диспетчерская процедура не может ждать - это приводит к синему экрану. Нужно выйти из DISPATCH_LEVEL подождать, а уж потом выгружаться.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Аноним
Гость
« Ответ #2 : 05-10-2004 20:09 » 

Scorp__), здесь речь о том, чтобы ждала не диспетчерская процедура, а процедура выгрузки.
Записан
Scorp__)
Молодой специалист

ru
Offline 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__)
Молодой специалист

ru
Offline 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, отправили и не ждем что там "внизу".
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines