http://www.wasm.ru/docs/11/fatgen103-rus.zip На странице 21 написано: Код (Text): RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / BPB_BytsPerSec; TmpVal1 = DskSize – (BPB_ResvdSecCnt + RootDirSectors); TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs; If(FATType == FAT32) TmpVal2 = TmpVal2 / 2; FATSz = (TMPVal1 + (TmpVal2 – 1)) / TmpVal2; Почему они решили что у них получается на 2 или на 8 секторов больше? Если BPB_NumFATs нечётное, в каждой копии FAT оказывается некоторое число лишних секторов примерно равное TMPVal1/(TmpVal2*TmpVal2). Если TMPVal1 будет кратно TmpVal2, то число записей в FAT как раз совпадёт с числом кластеров на диске, но поскольку первые две записи в FAT имеют специальное значение, а нумерация кластеров начинается с 2, то для двух последних кластеров не будет записей в FAT. По моему более правильная версия этого кода должна выглядеть так: Код (Text): If(FATType == FAT32){ TmpVal2 = ((128 * BPB_SecPerClus) + BPB_NumFATs); FATSz = (TMPVal1*64+TmpVal2*64-1+TmpVal2) / (TmpVal2*64); }else{ TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs; FATSz = (TMPVal1*128+TmpVal2*128-1+TmpVal2) / (TmpVal2*128); } Последнее слагаемое в вычислении FATSz это часть сектора, которую занимают первые две записи FAT.