Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Прямое чтение с диска


Автор: Fixin 29.7.2006, 13:01
В свое время сделал программульку, которая читает полудохлые дискеты. Основана она была на таких шагах:
  • достаем имя файла из FAT
  • получаем список кластеров, принадлежащих файлу
  • читаем по-кластерно файл в буфер чтения, иначе, если кластер дохлый, забиваем буфер чтения нулями
  • записываем буфер в выходной файл.
У этого метода есть существенный недостаток: дискета может быть сколь угодно дохлой, но главное, чтобы таблица размещения файлов была целой.

Теперь поясняю, что мне надо, хотя, это уже и так ясно: хочу читать с дискеты (дискета - основная цель)так, чтобы читалась и таблица, в каком бы состоянии она не была, и любые места диска.

Что я предполагаю: читать с диска все, включая кластер и информацию в нем о следующем кластере данного файла.
 

Автор: Doc_d0s 29.7.2006, 14:07
и что мешает, адрес таблицы на диске постоянен, в зависимости от объема можно определить ее размер и вуаля) 

Автор: Romikgy 29.7.2006, 20:18
когда то и я хотел этим занять , да руки не дошли smile
вообщем имхо , есть возможность чтения с дискет плохих, на уровне Raw там игнорируются все ошибки при чтении, имхо если пару разпрочитать битое место, то можно маломальски востановить информацию
ЗЫ конешно если я тя правильно понял 

Автор: Fixin 30.7.2006, 13:44
Цитата(Doc_d0s @  29.7.2006,  14:07 Найти цитируемый пост)
можно определить ее размер и вуаля) 
В том и дело, что предполагается отсутствие возможности прочтения таблицы. В этом случае, нужно читать кластеры вместе с информацией о следующем кластере, что не дается стандартными средствами винды. (но я еще не прочитал первую ссылку из "Здесь смотрели?")

Цитата(Romikgy @  29.7.2006,  20:18 Найти цитируемый пост)
если я тя правильно понял 
Вроде того, только мне это нужно, в основном, для восстановления простых текстовых файлов на дискетах, т. о. пропущенное место можно домыслить.
 

Автор: Romikgy 30.7.2006, 15:21
Цитата(Fixin @  30.7.2006,  12:44 Найти цитируемый пост)
но я еще не прочитал первую ссылку из "Здесь смотрели?")

прочитал? 

Автор: Fixin 30.7.2006, 18:05
Цитата(Romikgy @  30.7.2006,  15:21 Найти цитируемый пост)
прочитал? 
Там все тоже, что я использовал, кроме того, о чем говорил Ibragim и DeviceIOControl от chaos.
 

Автор: Romikgy 30.7.2006, 18:41
ну и че не подходит? 

Автор: Fixin 30.7.2006, 19:42
Цитата(Fixin @  29.7.2006,  13:01 Найти цитируемый пост)
У этого метода есть существенный недостаток: дискета может быть сколь угодно дохлой, но главное, чтобы таблица размещения файлов была целой

 

Автор: En_t_end 1.8.2006, 19:44
Кстати... ведь каждый ide-№ имеет свой системный порт ? если так, то почему бы не воспользоваться in и out в ассемблерных вставках ? Насколько я понимаю... нужно почитать доки к флоппам и тогда дело останется за запросами к флоппу за новым байтом или словом с нужной позиции.
То есть, программа или драйвер не будет зависеть от конкретной файловой системы, насколько я понимаю, это возможно ? Или мы не сможем определить битый байт так ?
PS правда для NT-шек придется создавать драйвер режима ядра...

Автор: Fixin 2.8.2006, 00:05
Цитата(En_t_end @  1.8.2006,  19:44 Найти цитируемый пост)
драйвер режима ядра...
 smile 
Цитата(En_t_end @  1.8.2006,  19:44 Найти цитируемый пост)
 в ассемблерных вставках
 smile  smile
En_t_end, дружище, нового ты ничего не сказал, но, возможно, помог выразить мои мысли smile Я искал что-то среднее, между драйвером и юзер-модным режимом доступа, думаю, что-то должно быть...

Автор: Mad 2.8.2006, 01:06
Цитата(Fixin @  29.7.2006,  12:01 Найти цитируемый пост)
читать с диска все, включая кластер и информацию в нем о следующем кластере данного файла.

Насколько я помню, фат не содержит информации о следующем блоке (кластере), это уже древовидные файловые сситеммы (ex?, ntfs) ?

Автор: En_t_end 2.8.2006, 06:14
Fixin, 
Цитата(Fixin @  2.8.2006,  04:05 Найти цитируемый пост)
Я искал что-то среднее, между драйвером и юзер-модным режимом доступа

А что тебе стоит создать драйвер и написать приложение с юзер-модным доступом на си, которое будет работать через интерфейс драйвера ?
ЗЫ не думаю, что WinApi позволяет напрямую использовать i/o-ports, скорее даже уверен в обратном. Порты - критические ресурсы, не зря их прикрыли для юзер-модных прилаг в NT-шках.

Добавлено @ 06:19 
Fixin, 
Цитата(Fixin @  2.8.2006,  04:05 Найти цитируемый пост)
драйвер режима ядра...    
Цитата(En_t_end @  1.8.2006,  19:44 )    
 в ассемблерных вставках

Хм... тут я увидел твои эмоции по поводу драйвера режима ядра и ассеблерных вставок...я не связывал воедино эти две цитаты, это у тебя так страшно их процитировать получилось smile

Автор: Fixin 2.8.2006, 12:59
Цитата(Mad @  2.8.2006,  01:06 Найти цитируемый пост)
Насколько я помню, фат не содержит информации о следующем блоке
Еще вспомнил, проблемы старого способа: 1) при чтении с дискеты, чтобы попасть на тот файл, который хочу читать, нужно было использовать какой-то сдвиг (кажется 0х4000Н) при чтении кластера, откуда взялся этот сдвиг - хз, я его просто подобрал. 2) сделав "образ" дискеты, т.е. прочитав все 1,44 мб, при попытке записать это все на другую дискету - не хватает места, т.о. я сделал вывод, что при чтении теряется какая-то информация, которая существует на дискете помимо того, что я смог прочитать. Вечером притащу код тестовой проги.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)