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

📄 sys622.c

📁 数据盘“变”启动盘
💻 C
字号:
/***两系统文件目录表的前十一个字符***/
#define FDT0 "IO      SYS"
#define FDT1 "MSDOS   SYS"
/***在库文件中三个系统文件的长度,
即制作库文件时所采用文件的大小,下面boot
数组的大小即引用它们中间的最大值。***/
#define FLIO 40774L
#define FLMS 38138L
#define FLCO 54645L
#define OK  "===>[OK]"
/***1.44M软盘文件目录表开始扇区及所占扇区***/
#define ST_M144 0x13
#define DL_M144 0x0e
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <bios.h>
#include <string.h>
char DiskFree();
void ErrMsg();/*错误信息*/
void main(int argc,char *argv[])
{FILE *fi,*fo;union REGS r;
unsigned int result,i,c,j,next,m=0;
unsigned char boot[FLCO],*bootp=&boot[0];
char *sys[]={"A:\\IO.SYS","A:\\MSDOS.SYS",
"A:\\COMMAND.COM"},sysa[]={7,7,1},disk;
unsigned long sysl[]={FLIO,FLMS,FLCO};
unsigned long fsys[]={FLIO+FLMS+FLCO,
FLMS+FLCO,FLCO};
char lib[80],*dat="LIB";
puts("");puts("Convert disk A or B to a MS-DOS 6.22 startup disk.");
puts("Written by Tu Yaohua,in Nanchang.");puts("");
disk=argv[1][0]|32;
if(argc!=2||argv[1][1]!=':'||argv[1][2]!='\0'
||disk!='a'&&disk!='b')
{puts("Usage:");
 printf("  %s A:|B:\r\n",argv[0]);
 puts("E.g:");
 printf("  %s A:",argv[0]);
 exit(1);
}
if(disk!='a')
 for(i=0;i<3;i++)sys[i][0]=disk;
/***为防止系统盘或者用于备份的系统文件
被破坏,需要检查文件存在否***/
for(i=0;i<3;i++)
 if(fopen(sys[i],"rb"))
  ErrMsg(2);
/***检查磁盘空间***/
switch(DiskFree(disk-'a'))
{case 1:ErrMsg(0);
 case 2:ErrMsg(3);
}
/***系统库文件是否存在***/
strcpy(lib,argv[0]);
lib[strlen(argv[0])-3]='\0';
strcat(lib,dat);
if((fi=fopen(lib,"rb"))==NULL)
 ErrMsg(4);
/***读出引导扇区的信息并写入软盘***/
fseek(fi,-512L,2);
fread(&boot,1,512L,fi);
if(abswrite(disk-'a', 1, 0, &boot))
  ErrMsg(1);
/***从库文件中读出三个必须文件并传送***/
for(i=0;i<3;i++)
{ fseek(fi,-(fsys[i]+512L),2);
  fread(&boot,1,sysl[i]+0L,fi);
  printf("Create %s file ",sys[i]);
  if((fo=fopen(sys[i],"wb"))==NULL)
    ErrMsg(5);
  if(fwrite(&boot,1,sysl[i]+0L,fo)!=sysl[i])
    ErrMsg(5);
  else puts(OK);
  fclose(fo);
  /***中断调用设置文件的属性***/
  r.h.ah=0x43;r.x.dx=(int)&sys[i][0];
  r.h.al=1;r.x.cx=sysa[i];
  intdos(&r,&r);
}
/***修改目录扇区中的系统文件的目录项位置***/
if(absread(disk-'a', DL_M144,ST_M144,&boot))
  ErrMsg(0);
for(i=1;i<DL_M144*512/32;i++)
{if(!strncmp(bootp+i*32,FDT0,11))next=0;
 else if(!strncmp(bootp+i*32,FDT1,11))
 {if(i==1)m++;else next=1;}
 else next=2;
 if(next==0||next==1)
 { m++;
   for(j=0;j<32;j++)
   { c=boot[j+next*32];
     boot[j+next*32]=*(bootp+i*32+j);
     *(bootp+i*32+j)=c;
   }}
 if(m==2)break;
}
/***修改后的结果回写***/
if(abswrite(disk-'a', DL_M144, ST_M144, &boot))
  ErrMsg(1);
puts("Startup disk already finish!");
exit(1);
}
char DiskFree(int d)
{struct dfree disk;
 unsigned cio,cms,cco,unc,needc,yio,yms,yco;
 getdfree(d+1, &disk);
 if (disk.df_sclus == 0xFFFF)return(1);
 unc=disk.df_avail*disk.df_sclus;
 cio=FLIO/512;  yio=FLIO%512;
 if(yio)cio+=1;
 cms=FLMS/512; yms=FLMS%512;
 if(yms)cms+=1;
 cco=FLCO/512; yco=FLCO%512;
 if(yco)cco+=1;
 needc=cio+cms+cco;
 if(needc<unc)return(0);
   else return(2);
}
void ErrMsg(int c)
{ switch(c)
 {case 0:puts("Read disk A error!");break;
  case 1:puts("Write disk A error!");break;
  case 2:puts("System file already exist!");break;
  case 3:puts("Not enough disk space to load system file!");break;
  case 4:puts("Read system file library failure!");break;
  case 5:puts("failure...");
  }
 exit(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -