как можно определить что находится в нулевом секторе. mbr или br. сначала я думал по полю bpb но я так понял что оно не у всех файловых систем есть. вот и думаю как? про то что по номеру диска, я знаю. но бывают ситуации когда например флешка отформатирована на одном компе(который ее видит как fdd) как fdd. а при использовании на другом определяется как hdd. вот и надо разобрать что там.
Ну, файловая система распознается по константным значениям, которые должны присутствовать в структуре тома на строго определенном месте, по значениям, которые должны находиться в определенном диапазоне, определенном наборе значений или просто подчиняться каким-то правилам, по непротиворечивости таких значений друг другу, размеру пространства тома и т.п. Например, в FAT первый байт должен быть опкодом short jump или near jump (всякие cli/short jump считаются невалидными). поле размер сектора должно быть равно 512, поле сигнатуры должно содержать значение 29h и т.п. Для других ФС свои опознавательные признаки. Разбиение на разделы распознается только на цельном устройстве, когда "таблица разделов" описывает непересекающиеся разделы, не выходящие за пределы пространства устройства. Расширенные разделы распознаются по специфичным идентификаторам типов и структуре.
про fat я знаю. вопрос больше в том. не какая файловая система. их много. надо скорее алгоритм определения mbr. просто по jmp и по 0aa55h(они и у BR). надо как-то по другому. если в PT несколько разделов то можно их сравнить и придти к выводам... а если раздел один? его несчем сравнить, а если совпадет с размером диска? с фат все просто. читаем в PT раздел и внем смотрим тип диска(в bpb тип 0f8h). но вопрос в том что у других (например ext2,3) нет поля bpb. у них вообще 0сектор может содержать что угодно.
-можно сравнить сигнатуру 0aa55h -проверить первый байт не jmp и 0(хотя в mbr тоже может быть 0. и jmp могут впихнуть) или просто возложить ответственность на пользователя. чтоб он в биосе указал тип устройства.
слушай а это идея) если сравнить во всех разделах признак активности с 0 и 80h. то вероятность совпадения почти нулевая) надо проверить)
а если код mbr отсутствует а PT присутствует. сигнатура 0aa55h тоже должна быть? или она только как признак загрузочной записи, а не PT?
Номер диска вам ровным счетом ничего не скажет, вы правильно заметили. Если в 0м секторе устройства сидит MBR или BOOT сектор, то сигнатура 0x55 0xAA должна присутствовать. Универсального способа, выяснить, что сидит в 0м секторе не существует. Единственно, можно проверить наличие таблицы разделов, и то не наличие самой ТР, а правильность ее заполнения.
Я допускаю присутствие нескольких разделов, помеченных, как активные. Можно проверять отсутствие в соответствующем поле каждого из четырех дескрипторов значения в диапазоне 1-7Fh.
Причем тут это? Ты хочешь определять из бутсектора/другого софта реального режима? С бутсектором все достаточно просто - ты сам определяешь его формат, а в случае двойственного формата сам определяешь, какой вариант использовать (признаки, на основе которых делаешь выбор, тоже определяешь сам). Что касается софта реального режима (работающего с диском через сервис BIOS), то действуешь по аналогии с софтом защищенного режима (просто здесь BIOS может тебя обмануть, например когда используется опция "принудительный флоппик").
Ну тут вопрос взглядов. Для соблюдения совместимости, должно быть не более 1 раздела с отрицательной (>=0x80h) меткой. А если очень сильно озаботится вопросом совместимости, то должно быть не более одного 0x80 значения, остальные только нули. В частности MS вообще считал долгое время, что первичный раздел может быть только один, он должен быть помечен 0x80, и только на устройстве 0x80. На вторичном винте он вообще не позволял создать первичный раздел. Все остальные разделы по его мнению должны были быть прописаны в расширенной зоне.
Согласен, что вопрос взглядов. В моем софте активным считается раздел, дескриптор которого содержит признак активного раздела и находится в таблице перед другими аналогичными дескрипторами.
А вообще, как говорится правильно поставленный вопрос, содержит 90% правильного ответа. А вот правильно поставленного вопроса тут нет. С какой целью топик стартер анализирует содержимое нулевого сектора? Какую цель пытается достичь?
а почему только 1-7fh, а где 81h-0ffh. должно же быть только 80h или 0? я не где не встречал активного например 82h. и причем тут признак активного и диск. я же пишу флаг а не 80h-типа диск 80h?
А по разному интерпретируют байт флага. 1я трактовка, это значимый весь байт, и 0х80 указывает на активный раздел. 2я трактовка, это значимый старший бит указывающий на признак активного раздела, а остальные биты зарезервированы. 3я трактовка, это значимый старший бит указывающий на признак активного раздела, а младшие биты указывают на номер устройства. А BIOSом номера устройства несколько по другому, там старшие биты, это тип устройства, а младшие номер устройства. Вот и получается совпадение, что 0х80 и номер первого винта, и флаг раздела. Я видел коды от МС где для адресации устройства в BIOS используется значение флага.
да но там они только с 80h и работают. потому-что я не встречал отличных от 80 значений. даже когда манял диски местами. или вы хотите сказать что если диск имеет номер 84h(например), то и флаг тоже 84h. это же не правильно диск можно переместить в биосе. и его номер изменится. а насчет бита 80h я видел что MS так проверяет. но я думаю это только для сокращения кода. так получается на одно условие меньше) в моем mbr куча проверок и текста. и он только-только влез в 430 байт( потом 4 байта 0 и 4 сигнатура и PT)