Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программное создание виртуального диска.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Насколько сложно реализовать такую фичу: программно создать в системе новый логический диск, при обращении к которому управление получал бы мой модуль и выдавал запрограммированные мной результаты (список файлов, действия при копировании/перемещении/создании/удалении файлов/каталогов и т.д.). Диск должен появляться и работать сразу же, по первому требованию, без перезагрузки системы (например, так действуют subst и подключение USB Flash-диска). Насколько я понимаю, тут не обойтись без создания драйвера. Я прав? И если прав, то насколько муторное это дело? А также где можно почитать какие-нить самоучители по созданию драйверов? (MSDN не предлагать - это справочник, а не самоучитель...) Лучше на русском, но можно и на буржуйском...

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 02:20 28-12-2003
kishik



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть отличная книжка: Windows NT File System Internals : A Developer's Guide, Rajeev Nagar. Вышла давно, так что достать ее сейчас нелегко, но лучше ее для твоей задачи я ничего не видел (если тебя интересуют WinNT/2k/XP, конечно). Есть еще ресурс по файловым системам: http://www.acc.umu.se/~bosse/, там много интересных примеров, в том числе драйвер, эмулирующий физический диск.
Плюс MSDN (и никакие самоучители его не заменят!), DDK, SoftIce - вот и весь набор джентельмена.

Всего записей: 27 | Зарегистр. 07-09-2003 | Отправлено: 15:43 28-12-2003
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kishik
За ссылочку спасибо, много полезного есть, посмотрю. А MSDN хорош, когда знаешь, чего надо делать, тогда в MSDN можно смотреть конкретные темы и методы. А для абсолютного новичка в какой-то области MSDN не поможет, надо сначала какие-то базовые знания найти. Может, они там и есть, вот только найти их нелегко...
 
И ещё: вопрос по DDK. Какую версию надо ставить, для какой ОС? А то у нас в сети есть и для 2000, и для XP, и для 2003 винды, кажется, мелькало... Есть ли хоть какая-то совместимость? (Например, дрова, скомпилённые на DDK для WinXP будут работать на 2000, или наоборот, или ещё как...) Или надо для каждой ОС ставить свой DDK и пересобирать?

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 19:34 28-12-2003
kishik



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CaptainFlint
Ставь последнюю версию DDK, там есть поддержка для всех ОС. Но компилировать может быть придется для каждой ОС свою версию драйвера, хотя не исключено, что версия драйвера для Win2k будет работать везде.
По хорошему тебе нужен еще NT IFS Kit, но на первых порах будет точно достаточно тех ресурсов, что я тебе дал (обрати внимание на ntifs.h по ссылке). Книжку, кстати, можно скачать осликом, и в ней достаточно сведений о написании драйверов.  
Велик соблазн порекомендовать тебе библиотеки из SoftIce Driver Suite, но, боюсь, на первых порах тебя он только запутает, так поддержки драйверов файловых систем в нем нет (по-моему, но могу ошибаться, т.к. сам по историческим причинам его библиотеками не пользуюсь). Хотя средства отладки там самые удобные. ИМХО Поизучай голый API, а когда созреешь - берешь Suite с его поддержкой C++ в ядре и приступаешь к большим задачам.

Всего записей: 27 | Зарегистр. 07-09-2003 | Отправлено: 12:00 29-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если надо есть исходники по созданию сикрет диска с шифрованием разными алгоритами. Сам не разбирался. Там есть пример VxD которая как я понял, подключает его. Если надо могу пульнуть и сорцы и прогу. Но под твою ответсвенность

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 30-12-2003
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Пульни, посмотрю Хотя это скорее перестраховка. По ссылочке kishik есть очень хороший пример... Я пока с сорсами не разбирался, но он делает в точности то, что мне надо: динамическое монтирование образа диска, причём можно как RW, можно RO, а можно как эмуляцию CD.
Собственно, мне и нужно было монтирование образа, только я забыл об этотм сразу написать Думал вручную считывать, разбирать формат образа, строить в памяти структуру диска и при обращении выдавать её, а в этом примере ISO- и IMG-образы автотматически монтируются.

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 02:28 30-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CaptainFlint
Давай так, если понадобится, то я пульну. Мне не жалко, просто если хподходящий пример, лучше в нем разобраться, чем посмотреть как совсем другое реализуется (у меня сорцы по созданию шифрованного диска, причем под 9х и НТ) так что если надо ты только скажи Я не жадный


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:33 30-12-2003
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt О-)) а мне не жадный ?? ..  

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 13:03 30-12-2003
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Ладно, уговорил C тем примером поковырялся, очень даже похоже на то, что мне надо. Сначала устанавливается драйвер, который мне скорее всего даже менять не потребуется (но если что, есть сорсы), перезагрузка, а потом работает прога, динамически монтируя и размонтируя образы дисков как rw, ro или cd. Выдрать вызовы функций для этих действий труда не составляет...
Единственное - всё это хозяйство будет только под ядром NT работать, по крайней мере так написано. Может, кто знает, как можно портировать NT-шный драйвер под Win9x? Если исходники есть. У меня проблема только в том, что я никогда разработкой дров не занимался, не знаю даже основных понятий и принципов работы. Понятно, чтот документация и т.д., но может кто вкратце охарактеризует?

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 19:01 30-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
как можно портировать NT-шный драйвер под Win9x

А зачем? 9х скоро перестанет поддерживаться. Хотя если по теме, то может попробуй насчет WDM драйверов. Они вроде как универсальные (в смысле, что в них не используются VxD, поэтому их проще портировать между системами) Сам разраболткой дров никогда не занимался, так что пусть знающие люди не пинают я просто старался помочь. Хотя может стоит посмотреть в инете сорцы именно для 9х неужели их нет?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:59 31-12-2003
kishik



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CaptainFlint

Цитата:
как можно портировать NT-шный драйвер под Win9x?  

Даже не стоит пытаться! Соврешенно разные архитектуры (особенно если дело касается дисковых подсистем). Скорее придется писать с нуля, если придется, конечно Единственно, что можно со скрипом и натяжкой портировать - это WDM драйвера, но это все же драйвера устройств, что не является твоим случаем. Впрочем, как верно подметил  
ShIvADeSt, 9x/Me почти сошли с арены, стоит ли напрягаться?.. Я бы скорее понял желание портировать под какой-нибудь *nix.

Всего записей: 27 | Зарегистр. 07-09-2003 | Отправлено: 12:39 31-12-2003
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
kishik
Ясно, спасибо Пока тогда не буду рыпаться.
Вот только насчёт схода с арены 9x-ов не совсем согласен. Ещё довольно много народу их использует, поэтому и хотелось сделать для обеих линеек... Но это тема отдельного разговора (подозреваю, что даже флеймовая), так что умолкаю и помечаю последний абзац значком

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 13:55 31-12-2003
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Итак, снова требуется помощь многоуважаемых посетителей форума, ибо заметился непонятный мне баг: подмонтированный диск недоступен для работы, пока программа, его подключившая, не завершится.
Опишу поподробнее.
Во-первых, я скачал вот этот файлик. Там находится пример программы для динамического подключения дисковых образов как новых дисков в системе (программа плюс драйвер). Драйвер я не трогал, ковырялся только с программной частью. Там есть два метода: FileDiskMount и FileDiskUmount. main() парсит параметры командной строки и вызывает соответствующую функцию с нужным набором параметров. Я сделал свою программу - тестовый пример: выводится диалог, на нажатие OK вызывается метод FileDiskMount с набором параметров для подключения конкретного файла как диска Z:

Код:
void CNewDiskDlg::OnOK()  
{
OPEN_FILE_INFORMATION* ofi = (OPEN_FILE_INFORMATION*)malloc(sizeof(OPEN_FILE_INFORMATION) + 50);
memset(ofi, 0, sizeof(OPEN_FILE_INFORMATION) + 50);
strcpy((char*)(ofi->FileName), "\\??\\C:\\temp\\Retrib.iso");
ofi->FileNameLength = strlen((char*)(ofi->FileName));
FileDiskMount(0, ofi, 'z', TRUE);
// CDialog::OnOK();
}

Все параметры получены в результате прохода main() оригинальной прогрраммы, т.е. в параметрах ошибок точно нет! Последняя строка закомменчена, т.е. при нажатии OK диалог не закрывается. В этом случае диск Z: в системе появляется, но доступа к нему нет. Как только я закрываю диалог по нажатию Cancel - диск сразу становится доступен, с него читаются все файлы и т.д. Если же в вышеприведённом коде последнюю строчку раскомментировать, тоо диалог закрывается сразу после нажатия OK, и соответственно диск Z: доступен для работы сразу после этого.
 
Подскажите, плиз, в каком направлении копать, а то я вообще не понимаю, как такое может быть... Мне обязательно надо, чтобы программа не завершалась. Можно, конечно, написать доп. прогу, которую запускать дополнительным процессом, но это же изврат! Кстати, я пытался сделать подключение в отдельном потоке - не срабатывает, всё равно ждёт завершения всей программы...

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 01:45 11-01-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
malloc(sizeof(OPEN_FILE_INFORMATION) + 50);

А может надо после этого ресурсы освободить?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:08 12-01-2004
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
А может надо после этого ресурсы освободить?

Вставил free(ofi), не помогло.
 
Добавлено
Да и в любом случае - я ж не мегабайты выделяю, утечкой памяти пока можно и пренебречь на данном этапе.

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 02:57 12-01-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 я ж не мегабайты выделяю

Мне это просто напомнило ситуацию при работе с фалами, если не закрыть указатель или приложение все записанное в файл не отображалось при просмотре сторонними средсмтвами. Вот я и думаю может здесь что то подобное? Просто уж как то не красиво получается, пока прогу не зкарыл, девайс не работает  

Цитата:
FileDiskMount(0, ofi, 'z', TRUE);

Кстати вот здесь, что за TRUE. может это какое то указание, лочить устройство, до завершения?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:51 12-01-2004
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Кстати вот здесь, что за TRUE. может это какое то указание, лочить устройство, до завершения?

Нет, это всего лишь указание того, что надо эмулировать CD. Такое явное задание я бы увидел...
А вообще насчёт залочивания идея хорошая, спасибо. Надо будет покопатьтся. Правда, там сам чёрт ногу сломит во всех этих DefineDosDevice и DeviceIoControl

----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 11:03 12-01-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программное создание виртуального диска.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru