Переделала пример RamDisk — перенесла создание в DriverEntry. Загружаю его с помощью SCManager... диск появляется, форматируется (в FAT) корректно, с ним можно работать. Но когда я пытаюсь отгрузить диск – ничего не происходит. То есть не вызывается DriverUnload. Если, например, убрать форматирование, то DriverUnload вызывается нормально. И я потом снова могу подключить диск. Подскажите, почему я не могу корректно подключать и отключать диск? Реализованы: IRP_MJ_CLEANUP, IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_DEVICE_CONTROL, DriverUnload.
И еще, если я пытаюсь в своем тестовом приложении послать сообщение своему драйверу, то функция CreateFile("\\\\.\\Z:", GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0, NULL) возвращает не нулевой хендл только в том случае, когда я не работаю с диском (например, закрываю проводник, открываю его на других дисках…), а так вообще не хочет давать мне возможность обратиться к драйверу…
Re: Не выполняется CreateFile для моего драйвера...
Здравствуйте, Aerina, Вы писали:
A>Переделала пример RamDisk — перенесла создание в DriverEntry. Загружаю его с помощью SCManager... диск появляется, форматируется (в FAT) корректно, с ним можно работать. Но когда я пытаюсь отгрузить диск – ничего не происходит. То есть не вызывается DriverUnload. Если, например, убрать форматирование, то DriverUnload вызывается нормально. И я потом снова могу подключить диск. Подскажите, почему я не могу корректно подключать и отключать диск? Реализованы: IRP_MJ_CLEANUP, IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_DEVICE_CONTROL, DriverUnload.
A>И еще, если я пытаюсь в своем тестовом приложении послать сообщение своему драйверу, то функция CreateFile("\\\\.\\Z:", GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0, NULL) возвращает не нулевой хендл только в том случае, когда я не работаю с диском (например, закрываю проводник, открываю его на других дисках…), а так вообще не хочет давать мне возможность обратиться к драйверу…
Начну с того, что фильтрами файловых систем пока плотно не занимался. Но, возможно здесь решение аналогичное используемому в моем драйвере контроля доступа к некоторому устройству.
Ситуация следующая: в драйвере-фильтре с возможностью управления должно быть 2 устройства (как минимум).
Одно — в стеке устройств, другое — устройство управления.
Z-устройство у Вас находится в стеке устройства (виртуального диска), а управляющие коды необходимо посылать устройству управления, для которого должны быть созданы свое устройство (IoCreateDevice) и символическая ссылка (IoCreateSymbolicLink). Все запросы к обоим устройствам идут в одну диспетчерскую функцию, которая, если DeviceObject указывает на устройство управления, вызывает функцию обработки кодов управления (IOCTL)(по-моему, у Вас они не определены).
Если же объект не является устройством управления, то обрабатываем как дисковые запросы.
Вроде бы так.
Для лучшего понимания темы желательно скачать KmdKit и KmdTut by Four-F.
Есть тут:http://four-f.narod.ru/ и тут:http://www.wasm.ru. Там есть фильтр клавиатуры (и мыши) с управлением.
Если что — пишите.
Re[2]: Не выполняется CreateFile для моего драйвера...
И еще дополнение: исходники драйвера виртуального диска crypted Filedisk — он с клиентской частью. Там есть и управление и еще много чего. http://www.scherrer.cc/crypt/
Re[3]: Не выполняется CreateFile для моего драйвера...
Здравствуйте, ns2005, Вы писали:
N>И еще дополнение: исходники драйвера виртуального диска crypted Filedisk — он с клиентской частью. Там есть и управление и еще много чего. N>http://www.scherrer.cc/crypt/
Большое спасибо за ответы!
Я посмотрела пример — но я никак не могу понять, зачем делать такую тяжелую схему? зачем создавать дополнительный поток?
Ведь все так легко получилось у меня сделать.. единственное, что не выходит это отключить драйвер? неужели для того, чтобы это сделать надо создавать еще одно устройство?
Re[4]: Не выполняется CreateFile для моего драйвера...
Кстати я не совсем права насчет названия "темы" вопроса — CreateFile выполняется, когда я не пытаюсь его открыть с флагами GENERIC_READ или GENERIC_WRITE, а передаю как параметр 0...
Re[4]: Не выполняется CreateFile для моего драйвера...
A>Большое спасибо за ответы! A>Я посмотрела пример — но я никак не могу понять, зачем делать такую тяжелую схему? зачем создавать дополнительный поток?
A>Ведь все так легко получилось у меня сделать.. единственное, что не выходит это отключить драйвер? неужели для того, чтобы это сделать надо создавать еще одно устройство?
Добрый день!
Извините за мое молчание, — у меня были выходные.
Не совсем понял что Вы имели ввиду под понятием "поток". Ну да ладно.
Если это означает дополнительное устройство, то ситуация следующая.
Еще раз повторюсь, фильтрами дисков не занимался. Но, в контексте той задачи, которую решал я, происходило вот что.
Сначала я попробовал совместить и устройство, находящееся в стеке и устройство управления. Это привело к тому, что когда я соединялся с одним, не важно — физическим или устройством управления, я не мог получить доступ к другому.
После этого мне сказали, что с физическим устройством так делать нельзя. Я сделал раздельно — все заработало.
Насчет сложности реализации — она относительна.
1. В DriverEntry создаем устройство управления и символическую ссылку на него, запоминаем глобальный указатель на это устройство (PDEVICE_OBJECT).
2. В AddDevice создаем устройства (IoCreateDevice) для каждого физического устройства.
3. При анализе IOCTL в DriverDispatch сравниваем указатели на устройство с указателем устройства управления. Исходя из этого, выполняем требуемые действия.
4. Все!
P.S.: Судя по Вашей проблеме — невозможности закрытия устройства, может быть у Вас что-то не освобождается при попытке выгрузки драйвера/остановки устройства. Для проверки — попробуйте остановить драйвер после работы с виртуальным диском. Остановить можно попытаться с помощью программы KmdManager (KmdKit, Four-F). Если невозможно остановить, или, хуже того — BSOD, — нужно смотреть выделение/освобождение памяти, списков и т.д.
Удачи.