Нібито патч
ff.c, рядок #3064
Код:
br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0;
замінити на
Код:
switch (pt[PTE_System])
{
case 0: // empty record
br[i] = 0;
break;
case 0x05: // extended/CHS
// here must be converter CHS->LBA, but it was fucked off. Because CHS sux!
case 0xF0: // extended/LBA
bsect = ld_dword(pt + PTE_StLba);
if (check_fs(fs, bsect) == 2) // I have no partition, but I have something better. Image of partition!
br[i] = bsect + ld_dword(fs->win + MBR_Table + PTE_StLba);
else
br[i] = 0;
break;
case 0x0B: // clearly, FAT
default: // Some other mysterious CHUPACABRA. Let`s leave it alone.
br[i] = ld_dword(pt + PTE_StLba);
break;
}
Це не остаточна версія, а швидке лагодження. Більшість проблем залишилися на місці, але тепер працюють розширені розділи.
По-перше треба уточнити щодо специфікації використання типів 05/F0 та їх адресацій, а також додати конвертор адреси з циліндрів у логічні блоки (але, на скільки я міг помітити, інформація дублюється, то ж у моєму випадку працює і так). По-друге - тут контролюється тільки перший логічний розділ з розширеної таблиці; якщо раптом буде задіяно другий (хто знає цю вінду) - його не побачить, то ж було б непогано додати гілку або цикл (щоправда це викличе складнощі з місцевою реалізацію мульті-партишену). По-третє - насправді існує набагато більше ідентифікаторів типу ФС (в тому числі і сумісних), і варто було б їх теж уміти вірно інтерпретувати. Але це вже інша історія.
ПС
Ні, серйозно, підхід "якщо тип ФС не нуль - значить це ФАТ" - це нормально?!