⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_fat32.c

📁 独立 WIN98下磁盘分区程序(C语言+汇编) 界面功能类似FDISK 但独立编译
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -