Совпадают кластеры FAT для файлов
У меня есть два загрузочных img MS-DOS 2.0 - один оригинальный img, другой img сделал я при помощи программы imdisk.exe. Оба img 360K floppy. Оба img загружаются в VirtualBox и работают. Я сравнивал кластеры FAT для системных файлов в обеих img, вот результат:
original img IBMBIO.COM 2,3,4,5,6,255,EOF
my img IMBBIO.COM 2,3,4,5,6,255,EOF
original img IBMDOS.COM 7,8,9,10,11,12,13,14,15,EOF
my img IBMDOS.COM 7,8,9,10,11,12,13,14,15,EOF
origianl img COMMAND.COM 63,EOF
my img COMMAND.COM 24,25,10,11,12,13,14,15,EOF
Как видно в моем img для файлов IBMDOS.COM И COMMAND.COM кластеры 10,11,12,13,14,15 совпадают, значит вывод получается два файла занимают одни и те же кластеры FAT и на диске. Не смотря на это мой img прекрасно загружается и работает в VirtualBox. Так же для COMMAND.COM в оригинальном img только один кластер, в моем их 8 - почему не понятно. Я заметил что маркер конца файла который делает программа imdisk.exe для своих создаваемых img - просто 0x0 а не как должно быть 0x0FF8.
Как я сделал мой образ img - взял загрузочный сектор из оригинального img, взял системные файлы MS-DOS из оригинального img, при помощи imdisk.exe сделал свой img, то есть реконструировал оригинальный img.
Я выкладываю свою программу для просмотра кластеров FAT, может я где то ошибся. Почему кластеры FAT для IBMDOS.COM И COMMAND.COM в моем img совпадают, может это ошибка в моей программе?
#include <windows.h>
#include <stdio.h>
BYTE *buff = NULL;
short int file_1_sectors[100000];
void get_file_sectors_from_fat(short int first)
{
BYTE * fat = buff + 512;
bool end_of_file = false;
short int sect_offset = 0;
short int clast_num = first;
int index = 0;
do {
file_1_sectors[index++] = clast_num;
sect_offset = (clast_num * 3) / 2;
int short even_or_odd = (clast_num * 3) % 2;
clast_num = fat[sect_offset];
if(even_or_odd == 0) //if even 0
{
clast_num = clast_num & 0x0FFF;
}
else //if odd 1
{
clast_num = clast_num >> 4;
}
//if(clast_num > 0x0FF8 )
// break;
//for img files EOF = 0
if( clast_num == 0 )
break;
} while ( 1 );
}
bool compare_names(char * filename, BYTE * root)
{
for ( int i = 0; i < 11; i++ )
{
if(filename[i] != root[i])
return false;
}
return true;
}
int get_first_sector_from_root_dir(char * filename)
{
//calculate start offset of root dir
BYTE * root = buff + 0xA00; //320K diskette 5 * 512
//BYTE * root = buff + 19 * 512; //1440K diskette
//112d = 70h = num dir entires 320K diskette
//each entry = 32 bytes
for ( int i = 0; i < 112; i++ )
{
if(compare_names(filename, root))
{
short int first_sector = *(root + 26);
//file found return first cluster in FAT
return first_sector;
}
//next root dir entry
root += 32;
}
//file not found
return -1;
}
int main (void)
{
FILE *fp;
fopen_s(&fp, "msdos2.img", "rb"); //360K img
//fopen_s(&fp, "Disk01.img", "rb"); //360K img
UINT n_seek_pos = 0;
fseek(fp, 0, SEEK_END);
DWORD dwFileSize = ftell(fp);
rewind(fp);
buff = new BYTE[dwFileSize];
fread((BYTE*)buff, dwFileSize, 1, fp);
fclose(fp);
//short int first = get_first_sector_from_root_dir("IBMBIO COM");
//short int first = get_first_sector_from_root_dir("IBMDOS COM");
short int first = get_first_sector_from_root_dir ("COMMAND COM");
if(first != -1 )
{
get_file_sectors_from_fat(first);
short int * debug = &file_1_sectors[0];
}
delete [] buff;
//MessageBox(NULL, "Done!", "INFO", MB_OK);
return 0;
}