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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странно как-то выгружается драйвер...  (Прочитано 4678 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
diper
Гость
« : 25-01-2006 20:53 » 

Имеется:
1) USB устройство
2) драйвер , сгенеренный DriverStudio 2.7
3) Тестовая прога (работает даже Улыбаюсь)

Проделываем следующее
1) Запускаеv DriverMonitor
2) Втыкаем устройство
3) Вытыкаем устройство
Монитор рисует примерно это:
constructor
....
destructor

Теперь проделываем следующее
1) Запускаем DriverMonitor
2) Втыкаем устройство
3) запускаем тостувую прогу которая делает CreateFile(...)
4) вытыкаем устройство
Теперь монитор рисует
constructor
...
create
...
и все, т.е. деструктор не вызывается
Теперь закрываем программу и монитор пишет что вот только теперь вызвался
деструктор. Эта задержка в взове деструктора имеет ряд побочных эффектов
которые ну ни как не нужны.

Хелп.
« Последнее редактирование: 26-01-2006 05:44 от diper » Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #1 : 26-01-2006 09:15 » 

Ничего странного - вполне оправданное поведение системы!
Когда ты сделал CreateFile то счетчик ссылок на устройство увеличился! А если бы ты еще не поленился заглянуть в исходники которые идут с DriverStudio то обнаружил бы там строчку где то в районе kpnpdev.cpp на обработчике IRP_MN_REMOVE_DEVICE вызовы двух функций WaitStop и WaitRemove которые собсвенно ожидают одноименных событий, которые будут установленны в том случае если счетчик ссылок на объкт этого устройства равер 1 и 0 соответсвенно. Так что как только ты закрываешь описатель CloseHandle то вызывается функция DecrementOutstandingRequestCount которая уменьшает счетчик ссылок на объект и происходит установка собития - после чего отрабытывает дистркутор. Имена функций могут немного отличаться так как взято из DS  3.2 но логика работы я думаю в DS 2.7 такая же.
Записан
diper
Гость
« Ответ #2 : 29-01-2006 20:16 » 

А можно ли настроить драйвер так, чтобы при изымании устройства он выгружался вне зависимости от того открыт на него хендлер или нет. Поиграл с полАйсами не помогло.
Объясню зачем: например если программа при изымании устройства получает из FileRead ошибку "доступ закрыт", то она пытается по новой открыть хендлер надеясь что устройство вернули на место (около ПК человека в этот момент может не оказаться например просто сбой котроллера). В этом слычае если устройсво вернули назад, но до того как программа сделала Close, то устройство появиться с другим сиволическим именем (например Device1 вместо Device0) и соответственно открыть не сможет т.к. в проге указан Device0. Пока переделал прогу чтобы та по очереди пыталась открыть Device0 и Device1.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines