📄 s_fat32.c
字号:
#include "part.h"
struct boot_fat32
{
/* Sector 1 */
unsigned char jmp[3]; /* Must be 0xEB, 0x58, 0x90 = jmp 5A */
unsigned char sys_id[8]; /* Probably: "MSWIN4.1" */
unsigned short sect_size; /* Sector size in bytes (512) */
unsigned char clust_size; /* Sectors per cluster (1,2,4,...,128) */
unsigned short res_sects; /* Reserved sectors at the beginning (33)*/
unsigned char fat_copies; /* Number of FAT copies (2) */
unsigned char resrvd1[4]; /* Reserved */
unsigned char media_desc; /* Media descriptor byte (F8h) */
unsigned short sfat_size; /* Sectors per FAT */
unsigned short track_size; /* Sectors per track */
unsigned short num_sides; /* Sides */
unsigned long hid_sects; /* Special hidden sectors */
unsigned long num_sects; /* Big total number of sectors */
unsigned long fat_size; /* Sectors per FAT (big) */
unsigned char fat_attr; /* FAT attributes (I guess) */
unsigned char fs_ver_maj; /* File System Version (major) */
unsigned short fs_ver_min; /* File System Version (minor) */
unsigned long root_clust; /* First cluster in root */
unsigned short fs_sect_num; /* FS Sector number (1) ??? */
unsigned short bs_bak_sect; /* Boot sector backup (6) */
unsigned char resrvd2[12]; /* Reserved */
unsigned char drive_num; /* Physical drive number (80h) */
unsigned char resrvd3[1]; /* Reserved */
unsigned char ext_signat; /* Extended Boot Record signature (29h) */
unsigned long serial_num; /* Volume serial number */
unsigned char label[11]; /* Volume label */
unsigned char fs_id[8]; /* File system id ("FAT32 ") */
unsigned char xcode[418]; /* Boot loader code (first part) */
unsigned long magic_num; /* Magic number (Must be 0xAA550000) */
/* Sector 2 */
unsigned long ext_sign2; /* Ext Boot Record Sign (0x41615252) */
unsigned char resrvd4[480];/* Reserved */
unsigned long ext_sign3; /* FS Info Signature (0x61417272) */
unsigned long free_clust; /* Number of free clusters */
unsigned long next_free; /* Next free cluster */
unsigned char resrvd5[12]; /* Reserved */
unsigned long magic_num2; /* Ext Boot Record Sign (0xAA550000) */
/* Sector 3 */
unsigned char resrvd6[508];/* Reserved */
unsigned long magic_num3; /* Ext Boot Record Sign (0xAA550000) */
};
#define BBT_SIZE 12000
#define F_NORM 0
#define F_QUICK 1
#define F_DESTR 2
#define MBR_MAGIC_NUM32 0xAA550000L
int format_fat32(struct part_long *p, char **argv)
{
char *data_pool;
struct boot_fat32 *b;
unsigned long *fat;
int i, j, k, wr_sect, ret_code, fat_size, next_bad;
unsigned long l, num_clust, num_sect, base_sect, base_clust, *bbt;
unsigned int num_bad=0;
unsigned int clust_size=8;
unsigned int form_type=F_NORM;
if( (data_pool=malloc(SECT_SIZE*3+BBT_SIZE*sizeof(long)))==0 )
{
show_error(ERROR_MALLOC);
return FAILED;
}
b = (struct boot_fat32*)(data_pool);
fat = (unsigned long int*)(data_pool);
bbt = (unsigned long int*)(data_pool+SECT_SIZE*3);
memset(b,0,SECT_SIZE*3);
memmove(b->jmp,"\xEB\x58\x90",3);
memmove(b->sys_id,"MSWIN4.1",8);
b->sect_size=SECT_SIZE;
b->res_sects=33;
b->fat_copies=2;
b->fs_sect_num=1;
b->bs_bak_sect=6;
b->media_desc=0xF8;
b->ext_signat=0x29;
memmove(b->label,"NO NAME ",11);
memmove(b->fs_id,"FAT32 ",8);
memmove(b->xcode, EMP_IPL, EMP_SIZE );
strncpy(b->xcode + EMP_SIZE, MESG_NON_SYSTEM, sizeof(b->xcode)-EMP_SIZE);
b->ext_sign2 = 0x41615252L;
b->ext_sign3 = 0x61417272L;
b->magic_num = 0xAA550000L;
b->magic_num2= 0xAA550000L;
b->magic_num3= 0xAA550000L;
num_sect=p->num_sect;
while(*argv!=0)
{
if( strcmpi(*argv,"/destructive")==0 ) form_type=F_DESTR;
else if( strcmpi(*argv,"/quick")==0 ) form_type=F_QUICK;
else if( strncmpi(*argv,"/c:", 3)==0 )
{
k=atoi((*argv)+3);
for( i=k/2, j=0 ; i!=0 && j<7 ; j++, i/=2 );
clust_size=1<<j;
if( clust_size!=k )
{
progress("^Invalid cluster size.");
goto failed;
}
}
else if( strncmpi(*argv,"/x:", 3)==0 )
{
if( strcmpi(*argv,"/x:disk")==0 )
l=dinfo.total_sects;
else
l=atol((*argv)+3);
if( l>num_sect ) num_sect=l;
}
else if( strncmpi(*argv,"/l:", 3)==0 )
{
strncpy(tmp,(*argv)+3,11);
tmp[11]=0;
for( i=0 ; tmp[i]!=0 && i<11 ; i++ ) b->label[i]=tmp[i];
for( ; i<11 ; i++ ) b->label[i]=' ';
}
else
{
progress("^Unknown option:");
progress(*argv);
goto failed;
}
argv++;
}
while(1)
{
fat_size = (num_sect)/(clust_size*128) + 1;
num_clust = (num_sect-33-2*fat_size)/(clust_size);
if( num_clust >= 65536L ) break;
clust_size /= 2;
if( clust_size==0 )
{
progress("^Oops! Cluster size is 0...");
progress("You have to use FAT-16 file system for such a small partition.");
goto failed;
}
}
if( 33+2*fat_size+2*clust_size > p->num_sect )
{
progress("^Partition is too small.");
goto failed;
}
b->fat_size=fat_size;
b->clust_size=clust_size;
b->root_clust=2;
b->next_free=3;
b->free_clust=num_clust-1;
b->drive_num=dinfo.disk;
b->track_size=dinfo.num_sects;
b->num_sides=dinfo.num_heads;
b->hid_sects = p->rel_sect;
b->num_sects = p->num_sect;
b->serial_num=((p->rel_sect<<16)+(p->num_sect*((long)b%451)) )+
((dinfo.total_sects%12345L)^(dinfo.total_sects*67891L))+
((dinfo.disk*123L)^(dinfo.num_heads%7))+clock();
flush_caches();
if( form_type==F_QUICK ) ret_code=0;
else if( form_type==F_DESTR )
ret_code=generic_format(p,BBT_SIZE,bbt);
else
ret_code=generic_verify(p,BBT_SIZE,bbt);
if( ret_code<0 ) /* format failed or canceled */
{
free(data_pool);
return ret_code;
}
num_bad=ret_code;
disk_lock(dinfo.disk);
progress("^Initializing file system ...");
if( num_bad!=0 && bbt[0] < 33+2*fat_size+2*clust_size )
{
progress("Beginning of the partition is unusable. Try to move it forward.");
goto failed;
}
progress("~Writing boot sector ...");
if( disk_write_rel(p,0,b,3)==-1 ) /* Writing boot sector */
{
progress("Error writing boot sector.");
goto failed;
}
if( disk_write_rel(p,6,b,3)==-1 ) /* Writing boot sector (backup) */
{
progress("Error writing boot sector.");
goto failed;
}
progress("~Writing FAT tables ...");
wr_sect = 33;
for( k=0 ; k<2 ; k++ ) /* Writing two copies of FAT16 */
{
next_bad = 0;
base_sect = 33 + 2*fat_size + clust_size /*root*/;
for( i=0 ; i<fat_size ; i++ )
{
memset(fat,0,512);
if( i==0 )
{
fat[0]=0x0FFFFFF8;
fat[1]=0x0FFFFFFF;
fat[2]=0x0FFFFFFF; /* root */
while(next_bad!=num_bad && bbt[next_bad]<base_sect+clust_size*125)
fat[ (bbt[next_bad++]-base_sect)/clust_size+3 ]=0x0FFFFFF7;
base_sect+=clust_size*125;
}
else
{
while(next_bad!=num_bad && bbt[next_bad]<base_sect+clust_size*128)
fat[ (bbt[next_bad++]-base_sect)/clust_size ]=0x0FFFFFF7;
base_sect+=clust_size*128;
}
if( disk_write_rel(p,wr_sect++,fat,1)==-1 )
{
progress("Error writing FAT.");
goto failed;
}
}
}
memset(fat,0,512);
progress("~Writing root directory ...");
for( i=0 ; i<clust_size ; i++ )
if( disk_write_rel(p,wr_sect++,fat,1)==-1 )
{
progress("Error writing root directory.");
goto failed;
}
disk_unlock(dinfo.disk);
free(data_pool);
return OK;
failed:
disk_unlock(dinfo.disk);
free(data_pool);
return FAILED;
}/* format_fat32 */
int print_fat32(struct part_long *p )
{
int i;
char tmp1[20], tmp2[20];
struct boot_fat32 *b=(struct boot_fat32*)tmp;
if( disk_read_rel(p,0,b,3)==-1 )
{
fprintf(stderr,"Error reading boot sector.\n");
return FAILED;
}
printf("\n Boot Sector Data Expected Value\n\n");
printf(" System id: %-.8s\n", b->sys_id );
printf(" Sector size: %-3d 512\n", b->sect_size );
printf(" Sectors per cluster: %d\n", b->clust_size );
printf("Reserved sectors at the beginning: %d\n", b->res_sects );
printf(" Number of FAT copies: %d\n", b->fat_copies );
printf(" Media descriptor byte: %02Xh F8h\n", b->media_desc );
printf(" Drive number: %-3d %d\n", b->drive_num, dinfo.disk );
printf(" Number of sides: %-3d %d\n", b->num_sides, dinfo.num_heads );
printf(" Sectors per side: %-2d %d\n", b->track_size, dinfo.num_sects );
printf("Hidden sectors prior to partition: %-10s %-10s\n", sprintf_long(tmp1,b->hid_sects), sprintf_long(tmp2,p->rel_sect) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -