Может, BIOS определяет CHS-геометрию для флешки из ее MBR. Такое практикуется при эмуляции харда при загрузке с CD/DVD. Существует BIOS Boot Spec. Возможно, там есть ответ на этот вопрос.
Как это не 0 и не 0x80? В первом случае - 0, во втором - 0x80, здесь всё в порядке. Этот совет, как уже выяснилось, иногда не работает. (Кстати, кажется, всё-таки обычно флешки определяются именно как жёсткие диски, с идентификаторами 0x80+, хотя массового тестирования я не проводил.) Всё проще: спецификации советуют запоминать где-нибудь DL, переданный бутсектору BIOS'ом, и не прописывать в коде фиксированное значение, а использовать сохранённое.
Я же говорю, что CHS-геометрия определяется из MBR. Флешки, которые я использую, имеют предустановленную (присутствующую в MBR при покупке) геометрию H=16 (0-15), S=32 (1-32). Интересно, что будет, если поменять геометрию вручную и переформатировать флешку. Если все будет работать и с новой геометрией, то мое предположение верно. Если нет, значит флешка сама сообщает свою CHS-геометрию и тогда по идее MBR-сектор можно использовать как угодно.
Таблица разделов есть, но в ней нет CHS-параметров. Там может быть только указано, с какого цилиндра и какой головки начинается раздел, а также его LBA.
Так я про это "неофициальное" соглашение и говорю. Разделы должны заканчиваться на границах цилиндров, откуда можно получить S и H. При эмуляции харда при загрузке с CD/DVD для определения CHS-геометрии BIOS пользуется именно этим соглашением. Может, и здесь подобная ситуация.
Код (Text): #pragma pack(push,1) typedef struct TPartitionInfo { BYTE Active; BYTE StartHead; WORD StartCylinder; BYTE Code; BYTE EndHead; WORD EndCylinder; DWORD BeginLBA; DWORD Size; } TPartitionInfo; typedef struct TBootSector { BYTE BootCode[0x01be]; TPartitionInfo Partitions[4]; WORD Signature; } TBootSector; #pragma pack(pop) Здесь только CH-геометрия, про секторы ничего не сказано. Разве что Size в секторах.
Ну так если учесть, что последний сектор раздела является последним в цилиндре, то по S и H этого сектора можно сделать вывод о значениях соотвествующих параметров в CHS-геометрии диска!
Параметр С пофиг (он обычно корректен только тогда, когда это возможно). Важны S и H. Забиты нулями кем? Тобой или были такими изначально? Покажи таблицу разделов (желательно оригинал, если ты ее менял). Не встречал флешек, у которых эти параметры были бы забиты нулями.
Таблица разделов очень простая: volume1: active = 0x80 start_head = 0, start_cyl = 0 filesystem = 0x0f end head = 0, end cyl = 0 start lba = 1 size = 8*1024*1024 volume2..volume4 = 0
Не встречал такого. Может, это уже твоих рук дело?.. Или флешка раcсчитана исключительно на доступ с помощью линейной адресации (точнее вообще не расcчитана на CHS). А не пробовал вызывать для этой флешки функции BIOS 08h/48h? Интересно узнать, какую геометрию будет сообщать BIOS.
Вызывать не пробовал, такие "кривые партиции" - именно моих рук дело . Так что у меня серьёзные сомнения, что BIOS берёт геометрию из Volume Descriptors. А вот то, что BIOS берёт геометрию из BPB-параметров FAT-заголовка (если они заданы), это для меня уже почти факт, не требующий подтверждения. Так что "память о Microsoft" присутствует в любом современном BIOS .
Сомневаюсь, что это так. Чтобы добраться до BPB раздела BIOS как минимум нужно знать, где этот радел начинается. Т.е. она дожна использовать еще хотябы линейный номер первого сектора раздела из таблицы разделов. Кстати, если ты BPB не раскурочил также, как PT, то по идее можно восстановить CHS-параметры PT из BPB. Что у тебя там в BPB? Я упоминал еще один возможный вариант определения CHS-параметров в BIOS. Возможно флешка сама сообщает свою "физичекую" CHS-геометрию аналогично тому, как это делают жесткие диски. Вообще это не очень сложно проверить. Нужно "зачистить" флешку (PT, на всякий случай - из твоего предположения - BPB) и вызвать для нее функцию 08h/48h "со стороны" или прямо из кода в MBR при загрузке.
А какие проблемы, если BPB находится в MBR? Я же говорю - проблема возникает, когда информация о файловой системе FAT присутствует в MBR. По ходу, BIOS детектит это и пытается сменить геометрию.
BPB в MBR? Тогда конечно будут проблемы при условии, что BIOS все-таки использует данные из PT. Точнее BPB естественно с PT не пересекается, но я боюсь, что раз ты запихнул BPB в MBR, то на необходимость присутствия PT в этом секторе ты махнул рукой! Зачем вообще себе организовывать лишние проблемы. Или ты так пытаешься сэкономить несколько десятков секторов? Делай, как положено: MBR, резерв в пределах "нулевой поверхности нулевого цилиндра" и собственно сам раздел. ...И будет тебе счастье