MiniMax (12.09.2007 14:02, просмотров: 100) ответил Argon на Может, тогда уж посоветуете, как искать BPB сектор? :)
Когда-то давно я использовал примитивный метод. Читал первый сектор
и проверял на наличие FAT признака. Если нет FAT12/FAT16, то значит
это MBR и необходимо считать данные (со смещением 454) и оттуда узнать где находится BOOT. <c>
MBR_SectorFrom =0;
BOOT_OFFSET =0;
// Try to find BOOT sector
#ifdef _FAT_DEBUG
printf ("\nFAT: Trying to find BOOT...");
#endif
// 36h FAT Name (FAT16) 8 Bytes
offset = BOOT_OFFSET+0x36;
ec=ReadDataBlock(0,offset,8,dataArray);
if(ec)goto func_end;
dataArray[8]=0;
Br_FATName = (dataArray[3]-'0')*10 + (dataArray[4]-'0');
if (!((Br_FATName == FAT12 )||(Br_FATName == FAT16)))
{
ec = _FAT_UNKNOWN_FAT;
}
// MBR
if ( ec == _FAT_UNKNOWN_FAT )
{
#ifdef _FAT_DEBUG
printf ("\nFAT: Reading MBR...");
#endif
offset = 454;
ec = ReadDataBlock(0,offset,WORD_LEN,dataArray);
if(ec)goto func_end;
MBR_SectorFrom = GetWordFromBuffer(dataArray);
BOOT_OFFSET = MBR_SectorFrom * 512;
}
</c>
Позже я переключился на открытые исходники FreeDOS и портировал их на ARM7 ( MMC, DataFlash). Там все работает без проблем и я даже не вникал больше в эту проблему.