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

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

eu
Offline Offline

« : 13-04-2010 10:06 » 

Привет, подскажите пожалуйста как лучше сделать, или что я не так делаю.
фильтр-драйвер пишется на WDF. обращение идет к ControlDevice созданному от FilterDriverDevice.



после того как устройство появляется в системе, служба открывает хэндл через symbolik link name и посылает DeviceIoControl (не Overlapped)
этот Request не обрабатывается и висит, до лучших времен, чтобы когда появится необходимость - как можно быстрее закомплитить DeviceIoControl и дать управление службе....

Постановка проблемы:
Не всегда вызывается ф-я DriverEntry...
В случае, если после посылки DeviceIoControl, не дожидаясь его комплита - извлечь устройство, в драйвере дёрниться функция клин апа, в которой вызовется функция комплита реквеста, удалиться контрольный девайс. в службе на этот комплит будет произведено закрытие хэндла, судя по логам: реквест комплититься с неправильным количеством байт, мы попадаем в ветку else хэндл закрывается - результат 1, но девайс удаляется раньше чем происходит CloseHandle...

примерный вид
result = DeviceIoControl(   hDevice,
                                        IOCTL_SOME_CODE,
                                        NULL, 0,
                                        &ptr, sizeof(SomeType),
                                        &bytes, NULL);
if(bytes == sizeof(SomeType))
{
    ....
}
else
{
    result = CloseHandle(hDevice);
}

если вставлять и вытаскивать устройство из порта без запущенной службы - все хорошо. загадка в том - что все хэндлы закрываются..
но как мне кажется не происходит полная выгрузка драйвера, почему- понять не могу..
подскажите пожалуйста Улыбаюсь
Записан
Ochkarik
Модератор

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

« Ответ #1 : 13-04-2010 10:52 » 

"клин-апа" - это что?))))))))))
по моему выдергивание устройства надо по IRP_MJ_PNP - IRP_MN_SURPRISE_REMOVAL обрабатывать... я по крайней мере так раньше думал)

скорее всего у вас завершение IRP откладывается... точнее управление службе не передается сразу. то есть ожидающий процесс получает управление(свой квант времени) только уже после завершения вашей процедуры зачистки в драйвере. попробуйте при завершении ожидающего IRP - повышать приоритет:
IoCompleteRequest(Irp, IO_SOUND_INCREMENT/*например*/); (хотя не уверен что поможет)
а кроме того - отложите выгрузку драйвера(функцией ожидания), пока не будет закрыт хендл драйвера (IRP_MJ_CLOSE). для этого можно вести в драйвере счетчик открытых хендлов.

"реквест комплититься с неправильным количеством байт" - это вы сами так сделали, или это бага...?

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

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

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

« Ответ #2 : 13-04-2010 14:57 » 

Не всегда вызывается ф-я DriverEntry...

Вот так магия. Похлеще Коперфильда будет
Записан
Ochkarik
Модератор

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

« Ответ #3 : 13-04-2010 15:45 » 

такое бывает если перед этим тот же драйвер не выгрузился целиком)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline Offline

« Ответ #4 : 14-04-2010 11:41 » 

большое спасибо за предоставленные пути решений - сделал счетчик открытых хэндлов и откладывание выгрузки до закрытия хэндлов - помогло Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines