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

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

Всем желаю здравствовать!!!
Написал, значится, я драйвер виртуального жёсткого диска (типа файл-контейнер, монтируешь его и система не видит разницу между ним и диском С: ). Далее пытаюсь его отмонтировать, тобишь погасить поток обработки IRP, почистить DeviceExtension и наконец IoDeleteDevice. Тут возможно два варианита событий:
1. Если с момента последнего обращения к диску (форматирования, копирования файлов и т.д.) прошло достаточно много времени или обращений к диску не было вообще (примонтировал и сразу отмонтировал), то всё проходит нормально.
2. Если я сразу после форматирования и копирвания на диск некоторого количиства файлов попытаюсь диск отмонтировать, то система помирает (BSD с ошибкой BAD_POOL_HEADER (0x00000020,....) ).

Мои мысли по этому поводу: винда не до конца заканчивает запись данных в файл-контейнер (??кеширует их чтоль??), хотя никаких STATUS_PENDING не возвращает. Или другая мысль: система не сразу одупляется, что диска уже вроде как нет и продолжает слать ему запросы (как бы по инерции).

Люди добрые может кто встречался с данной проблемой, знает как её решить или как обойти (красиво и без хаков) погите, пжл. Буду очень признателен.
Спасибо!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 01-08-2005 07:35 » 

А такой вопрос- ты отваливаешься только когда счетчик открытых хендлов равен нулю? Или ты его вобще нет проверяешь?
Записан
vvoid
Гость
« Ответ #2 : 01-08-2005 07:53 » 

Если можно - чуток по подробней. Так как я могу и не на то подумать, то скажу следующее: все ресурсы, занятые мной я освобождаю, каждому ObReferenceObject соответсвует ObDereferenceObject, ZwCreateFile - ZwClose. Хотя похоже речь идёт не о захваченых ресурсах?
Что имеется ввиду под счётчиком открытых хендлов и как вести его счёт?
Благдарю!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 01-08-2005 08:13 » 

Ну тобой занятые, а что никому кроме тебя прямо нельзя открыть твой супер диск. Как минимум на каждый IRP_MJ_CREATE должен прийти IRP_MJ_CLEANUP и IRP_MJ_CLOSE
Записан
vvoid
Гость
« Ответ #4 : 01-08-2005 08:21 » 

Что значит никто кроме меня? А на фига он тогда такой вообще нужен. Я же говорил, что работа с ним не должна отличаться от работы с любым другим диском компа.

>     "Как минимум на каждый IRP_MJ_CREATE должен прийти IRP_MJ_CLEANUP и IRP_MJ_CLOSE"
Вот вот. Уже ближе к телу Улыбаюсь)

[RP_MJ_CLEANUP и IRP_MJ_CLOSE] или [RP_MJ_CLEANUP или IRP_MJ_CLOSE]?

Я так понимаю здесь и ведётся счёт открытых хендлов.
И если это как минимум, то что есть ещё, чтоб было "как по-нормальниум" а ещё лучше "как максимум"?? Улыбаюсь
« Последнее редактирование: 01-08-2005 08:29 от vvoid » Записан
vvoid
Гость
« Ответ #5 : 02-08-2005 15:59 » 

ОК!! Проблема решена! Бага - чтобы отмонтировать диск ему посылался IOCTL_STORAGE_EJECT_MEDIA в обработчике которого вызывалась ф-ция IoDeleteDevice, то есть она вызывалась до завершения IRP, а это бага. На такую мысль натолкнула статья http://www.osronline.com/article.cfm?article=385.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 08-08-2005 09:01 » 

IoDeleteDevice для PDO должен вызываться в при обработке IRP_MN_REMOVE_DEVICE  или при удалении FDO.
Записан
vvoid
Гость
« Ответ #7 : 08-08-2005 10:08 » 

Насколько я понимаю это для плуг-н-плюй. Я не обрабатываю IRP_MJ_PNP.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 08-08-2005 10:17 » 

Что то я тогда не понимаю по какому принципу вобще идет удаление. Ты расскажи поподробней. У тебя сам девайс исчезает или носитель, типа как в дисководе, сидюке, магнитооптике.
Записан
vvoid
Гость
« Ответ #9 : 08-08-2005 11:20 » 

Его можно примонтировать как Fixed (отображается как диск С, к примеру) или как Removable (отображается как флэшка). Есть утиль, для управления (монтировать, отмонтировать, инфо и т.д.). При отмонтировании "исчезает сам девайс", а не его медиа.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines