Вопрос № 33399: Прочитал правила портала и, в частности, форума.
Не понял, как создавать свои темы.
Или еще надо "дорасти" до соответствующего ранга.
А информация, имхо, очень полезная.
////////////////////////////////////////////...Вопрос № 33402: Уважаемые эксперты!
Очень прошу помочь начинающему системному программисту. Проблема такая: нужно получить доступ к произвольному сектору на диске. Решение использовать int 13h является неудачным, так как нужно знать геометрию диска (головки, цил...
Вопрос № 33.399
Прочитал правила портала и, в частности, форума.
Не понял, как создавать свои темы.
Или еще надо "дорасти" до соответствующего ранга.
Архив статей по Ассемблеру.
В архиве всего 1828 статей -- куча учебников, справочников, статей по реверсингу.
Совместим с DelphiWorld и World C++.
Имеется возможность псевдоморфологического поиска.
1. Скачаем с сайта программку http://www.infobez.net.ru/files/asm_c.exe и разархивируем, скажем, в C:arch.
2. В директории C:arch появится файл asm.exe и каталог base/
3. Скачаем первый пакет здесь http://rapidshare.de/files/9493088/520_crack_articles.7z.html или здесь http://www.megaupload.com/?d=RARQRO4V
3 а. Разархивируем его в C:arch так, что он перезапишет каталог base/ -- в последнем появятся статьи и автоматически добавится дерево статей.
4. Скачаем все остальное,
http://infobez.net.ru/asm/base.7z.001
http://infobez.net.ru/asm/base.7z.002
http://infobez.net.ru/asm/base.7z.003
http://infobez.net.ru/asm/base.7z.004
http://infobez.net.ru/asm/base.7z.005
http://infobez.net.ru/asm/base.7z.006
http://infobez.net.ru/asm/base.7z.007
http://apro.ladia.ru/files/base_img_1.7z
http://apro.ladia.ru/files/base_img_2.7z
http://apro.ladia.ru/files/base_img_3.7z
http://apro.ladia.ru/files/base_img_4.7z
http://apro.ladia.ru/files/base_img_5.7z
http://apro.ladia.ru/files/base_img_6.7z
http://apro.ladia.ru/files/base_img_7.7z
http://apro.ladia.ru/files/base_img_8.7z
http://apro.ladia.ru/files/base_img_9.7z
4 а. Разархивируем его в C:arch так, что он перезапишет дерево в каталоге base/ и оно автоматически добавится.
5. Кто заинтересован в поддержке, шлите статьи мне на мэйл.
Отвечает: Seamanmur
Здравствуйте, Алексеев Виктор Сергеевич!
Задумка у Вас была неплохая, но к сожалению реализация хромает. Довольно много статей отсутствуют. Первый же пункт AsmOS выдает warning файл не существует. Нет разделов FAQ, MSDOS...
Ответ отправил: Seamanmur (статус: 1-ый класс)
Отправлен: 17.01.2006, 10:20
Вопрос № 33.402
Уважаемые эксперты!
Очень прошу помочь начинающему системному программисту. Проблема такая: нужно получить доступ к произвольному сектору на диске. Решение использовать int 13h является неудачным, так как нужно знать геометрию диска (головки, цилиндры сектора), и, притом, существует проблема границы в 8,4 Гб. Я нашел, что существует прерывание int 25h, которое рассматривает диск как линейный массив секторов. С его помощью можно прочитать любой сектор на любом диске, просто указав его номер. Для доступа к дискам более 32 Мб нужно
заполнить структуру из трех полей (номер первого сектора, количество считываемых сектроров и адрес буфера, куда будет помещена считанная информация). Адрес этой структуры нужно поместить в ds:bx и выполнить прерывание. Оказалось, что все это прекрасно работает с дискетой (<32 Мб), а вот с винчестером ни из под одной винды (95/98/Me), ни из-под загрузочной дискеты DOS этот фокус не проходит (в буфер просто ничего не заносится, устанавливается cf=1 и ax=0001h). Как это
понимать (код ошибки ah=00 я нигде ни нашел)? И что делать? Как, например, получить доступ к FAT или проследить цепочку кластеров? Текст моей программы в приложении.
Kostik
Приложение:
Отправлен: 16.01.2006, 23:13
Вопрос задал: M_kostik (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Евгений Иванов
Здравствуйте, M_kostik!
Как я помню, :), номер диска для жёстких - нужно 7 бит устанавливать.
удачи!
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 16.01.2006, 23:32 Оценка за ответ: 1 Комментарий оценки: К сожалению, ответ неверный. В буфер по-прежднему ничего не записываетя, нет даже обращения к винчестеру. После выполнения прерывания устанавливается cf=1, ax=0207h. Видимо, Евгений Иванов не потрудился проверить собственную рекомендацию на практике.
Отвечает: newinfo2005
Здравствуйте, M_kostik!
Я, как тоже начинающий системный программист тебе помогу.
Если бы ты изучил это прерывание получше то ты заметил бы , что максимально эта функиция может общаться только с не более 32 МБ устройствами.
"Почему?"- ты можешь спросить.
Да просто.
Возьмем в руки калькулятор от винды.:)
То оказывается, что максимально можно брать только 65535 в регистр DX.(кстати так и в доки тоже написано).
Так что единственный выход это прерывание int 13.
Вообще было бы неплохо через порты.
Я всегда пользуюсь прерыванием 13 с ним можно обратиться к любому месту в диске.
Структуру FAT я представляю себе размыто.(кое-что уже знаю про неё,но не практиковался использововать её).
Удачи.
--------- "Спасибо" - нет такой валюты.
Ответ отправил: newinfo2005 (статус: 6-ой класс)
Отправлен: 18.01.2006, 10:10 Оценка за ответ: 3 Комментарий оценки: Сразу хочу принести извинение за две неточности в тексте программы: 1) вместо "buf db 256 dup(?)" надо, конечно, "buf db 512 dup(?)" (размер сектора); 2) строчка mov dx,0 лишняя (можно ее совсем выбросить). Именно вторая неточность и сбила тебя с толку уважаемого newinfo2005. Дело в том, что начальный номер сектора задается не здесь, а в 4-байтном поле
SectNum пременной sector. То есть можно обратиться максимально к сектору с номером 4294967295 (2^32-1). Вообще же, согласно документации, у прерывания int25h есть две формы: 1) для обращения к разделам <32 М (в cx - начальный номер сектора, в ds:bx - адрес буфера-приемника, в dx - количество считываемых секторов); 2) для обращения к разделам >32 М (в cx - FFFFh, в ds:bx - адрес структуры НомерНачальногоСектора-КоличествоСекторов-АдресБуфера, в нашем случае это перемен
ная sector). В своем примере я использовал как раз вторую форму. Почему она не срабатывает для меня по-прежнему загадка.
Отвечает: Seamanmur
Здравствуйте, M_kostik!
Позволю себе не согласиться с уважаемым экспертом newinfo2005.
Читаем Брауна.
Изначально функция 25h работала действительно до размера диска 32 Мб, но начиная с ДОС 3.31 она получила расширение до 2 Гб. При этом изменились входные параметры:
CX = FFFFh
AL = drive number (0=A, 1=B, etc)
DS:BX -> disk read packet
Format of disk read packet:
Offset Size Description
00h DWORD sector number
04h WORD number of sectors to read
06h DWORD transfer address
Ошибка заключается именно в том, что уже указывалось: номера твердых дисков 80h, 81h...
Насчет возвращаемой ошибки. Тот-же Ральф Браун пишет, что в al возвращается код ошибки:
Values for critical error code:
00h write-protection violation attempted
01h unknown unit for driver
02h drive not ready
03h unknown command given to driver
04h data error (bad CRC)
05h bad device driver request structure length
06h seek error
07h unknown media type
08h sector not found
09h printer out of paper
0Ah write fault
0Bh read fault
0Ch general failure
0Dh (DOS 3.0+) sharing violation
0Eh (DOS 3.0+) lock violation
0Fh invalid disk change
10h (DOS 3.0+) FCB unavailable
11h (DOS 3.0+) sharing buffer overflow
12h (DOS 4.0+) code page mismatch
13h (DOS 4.0+) out of input
14h (DOS 4.0+) insufficient disk space
В данном случае 01h неивестный привод, что вполне логично ведь дисковода с номером 2 (второго флоппи) нет!
Ответ отправил: Seamanmur (статус: 1-ый класс)
Отправлен: 19.01.2006, 15:11 Оценка за ответ: 4 Комментарий оценки: Я специально перепробовал все номера устройств, которые можно поместить в al - от 0 до 255 (FFh). Результаты таковы: устройство 0 (флопповод) читается без вопросов, устройство 1 долго и нудно ищется (несуществующий второй флопповод), устройства до 5 включительно выдают cf=1 ax=0001h, устройства c 6 до 255 включительно выдают cf=1 ax=0207h. Ни в одном случае обращения
к винчестеру нет. Кстати, если под номер сектора отводится 4 байта (DWORD в disk read packet), то почему размер раздела ограничен 2 Гб? По идее 2^32-1=4294967295=2 Тб.