Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с флоппиком на уровне секторов в ХРюше [D5, WinXP]


dimaxx ©   (2007-06-07 11:47:00) 

Сабж. Никогда не сталкивался, а тут приспичило.

Есть у меня дискета на 800 кб и есть образ (FAT12), который нужно записать на нее из программы. Открываю флоп как сказано в хелпе:

CreateFile('\\.\A',GENERIC_WRITE,0,nil,OPEN_ALWAYS or OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Далее читаю из образа и пишу через WriteFile поблочно. Все ОК, записывается нормально. Но! Я не пойму в чем трабл: если у образа стандартный заголовок - все нормально, дискета видится верно, все файлы на ней доступны. Но в данном случае стандартный заголовок не подходит. Меняю первые 4 байта (там команда перехода на загрузчик) на нужные для работоспособности своего загрузчика образа (он оказывается винде пофигу) - все, наступает ступор. При открытии дискеты в проводнике она долго читается (как будто сбой на нулевой дорожке), потом иногда возникает надпись типа "Диск не отформатирован" или чаще все-таки открывается, но файлы прочитать нельзя - вся структура нарушена, но каталог не поврежден. Соответственно дискета не работоспособна. Пробовал после этого создать образ дискеты и сравнить с оригиналом: оба образа идентичны! То есть при записи никаких траблов не было.

Я так подозреваю, что винда контролирует boot-секторы устройств и не дает менять в них ничего. Проверил это еще 1 способом. Изменил загрузчик, чтобы дискета стала работоспособной и в конце записи образа переписал boot-блок (512 байт) на нулевой сектор с измененными первыми 4 байтами. А он не записался! То есть первые 4 байта так и не были изменены. Единственное что - забыл проконтролировать ошибку.

Вопрос: как же все-таки открыть дискету для нормальной работы с ней без пригляда винды? Я подозреваю, что тут нужно задействовать Security Attribute (вместо nil), но я никогда с ним не работал. Подскажите как быть? Записывать образ внешними программами не предлагать - нужно именно из свой проги (она делает небольшие модификации образа перед записью под конкретные задачи). Антивирь отключал (думал в нем запрет).


Dimaxx   (2007-06-08 23:32:00) [1]

Ыы, ща еще 1 прикол попробовал. Стандартную дискету (полностью рабочую) открыл в heх-редакторе и изменил первые 4 байта на лабуду. Дискета читаться перестала. :) Долго хрюкала по нулевой дорожке, потом сказала "не, не айс - давай форматировать".


dimaxx   (2007-06-08 23:28:00) [2]

2 kernel: За линк спс, но у меня таких примеров куча - они мне не помогли. Все примеры читают или пишут кусочки, причем стандартных форматов (у меня ведь нестандартный).


Dimaxx   (2007-06-08 23:21:00) [3]

Дело все в том, что 80х10 (800кб) формат нестадартный. Записав дискету я открыл ее в heх-редакторе. Все траблы начинаются на каждой дорожке после 9 сектора. Т.е. если формат нестандартный (читай формат образа) винда не знает сколько там секторов на дорожку. Обошел несколько извращенным способом: взял чистую дискету, отформатировал на 800кб и взял первые 2 сектора (до FAT). При записи записал сначала эти 2 сектора, потом весь образ за исключением этих 2-х секторов, а в конце записал 2 сектора из образа. И о чудо! - дискета стала полность рабочей. Значит винда все-таки бдит за заголовком носителя. Запись на предварительно отформатированную на 800кб чистую дискету (чтобы избежать изврата с записью заголовка) тоже не работает. А с подменой влет.

Кстати, запись из-под ДОС с помощью rawrite.exe тоже не работает - дискета стала нерабочей. Почему там не работает - ума не приложу (ведь винды нет).

PS: А для чего нужен Security attribute в createfile? Честно говоря не совсем понял из хелпа...


kernel   (2007-06-08 12:10:00) [4]

dimaxx, держите полезный линк:
http://www.buildercpp.net.ru/articles/raznoe/raz032.htm


tesseract   (2007-06-07 17:42:00) [5]


> Меня больше интересует почему образ становится нерабочим
> и как обойти это. Вечером проверю и отпишу что за ошибку
> выдаст.


А ты посекторно пишешь-то ?


Dimaxx   (2007-06-07 16:51:00) [6]

Меня больше интересует почему образ становится нерабочим и как обойти это. Вечером проверю и отпишу что за ошибку выдаст.


tesseract   (2007-06-07 15:19:00) [7]


>  То есть первые 4 байта так и не были изменены. Единственное
> что - забыл проконтролировать ошибку.


проконтролируй, она тебе скажет в чём прикол.


Сергей М.   (2007-06-07 13:36:00) [8]


> винда контролирует boot-секторы устройств и не дает менять
> в них ничего


Винде, насколько мне известно, по-барабану содержимое "boot-секторов".


Наверх

Титульная страница Поиск, карта сайта Написать письмо