这个问题比较老了,而且试验起来有一定的危险性,你学习的重点也不应该是这方面了,国内这方面有两本经典图书,一本是Dos大全,介绍了所有的中断,一本是将磁盘加密技术的书。
我原来为研究磁盘加密写过类似的程序,但很简单,全部是C的,是直接调中断进行操作。原代码很长,是一个类似PC Tools的工具。我找出一部分给你。
void Format(void)
{
union REGS reg1,reg2,reg3;
struct SREGS sr1;
char ccc;
char trktbl[76];
int i,j,k,F_Error=0,W0_sec,n;
int Disk,Trk=80,Sect,F_Disk,key;
char Er_account=0;
char *string[4]={"360Kb Floppy Disk",
"1.2M Floppy Disk",
"720Kb Floppy Disk",
"1.44M Floppy Disk",
};
Message("Format A or B driver(A/B)?");
Sign_on();
ccc=getche();
delay(300);
Sign_off();
..... ........
textcolor(LIGHTGREEN);
for(i=0;i<4;i++)
{
gotoxy(25,8+i);
cprintf("%s",string[i]);
}
textcolor(WHITE);
textbackground(RED);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
key=1;
if(Disk==2 || Disk==4)
{while(key!=7181 && key!=283)
{key=specialkey();
if(key==18432 || key==20480)
{textcolor(LIGHTGREEN);
textbackground(11);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
if(Disk==2||Disk==4) Disk--;
else if(Disk==1||Disk==3) Disk++;
textcolor(WHITE);
textbackground(RED);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
}
}
}
//根据用户选择的磁盘,确定在磁盘的0道0扇写的数据
if(key==7181)
{
switch(Disk)
{case 1:Trk=40;
Sect=9;
Boot_Sec[0xd]=2;
Boot_Sec[0x18]=9;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0xd0;
Boot_Sec[0x14]=0x02;
Boot_Sec[0x16]=0x2;
W0_sec=11;
break;
case 2:Trk=80;
Sect=15;
Boot_Sec[0xd]=1;
Boot_Sec[0x18]=15;
Boot_Sec[0x11]=224;
Boot_Sec[0x13]=0x60;
Boot_Sec[0x14]=0x09;
Boot_Sec[0x16]=0x7;
W0_sec=28;
break;
case 3:Trk=80;
Sect=9;
Boot_Sec[0xd]=2;
Boot_Sec[0x18]=9;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0x90;
Boot_Sec[0x14]=0x05;
Boot_Sec[0x16]=0x7;
W0_sec=17;
break;
case 4:Trk=80;
Sect=18;
Boot_Sec[0xd]=1;
Boot_Sec[0x18]=18;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0x40;
Boot_Sec[0x14]=0x0b;
Boot_Sec[0x16]=0x9;
W0_sec=32;
}
textcolor(RED);
textbackground(11);
gotoxy(15,12);
cprintf("This floppy disk have %3d Track and %3d Sector",Trk,Sect);
pokeb(0,0x525,2);
pokeb(0,0x526,Sect);
pokeb(0,0x529,0x54);
pokeb(0,0x528,2);
pokeb(0,0x52A,0xf6);
if(Trk==40) pokeb(0,0x529,0x50);
reg1.x.bx=FP_OFF(trktbl);
sr1.es=FP_SEG(trktbl);
reg1.h.ah=0x05;
reg1.h.dl=F_Disk;
for(i=0;i<Trk;i++)
{for(j=0;j<2;j++)
{
for(k=0;k<Sect;k++)
{
trktbl[k*4]=i;
trktbl[k*4+1]=j;
trktbl[k*4+2]=k+1;
trktbl[k*4+3]=2;
}
gotoxy(30,13);
cprintf("Trk=%-5d Head=%-5d/n",i,j);
for(Er_account=0;Er_account<3;Er_account++)
{
reg1.h.ch=i;
reg1.h.dh=j;
//格式化各个磁道
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
Er_account++;
cprintf("Error11111=%d/n",reg2.h.ah);
F_Error=reg2.h.ah;
}
else break;
}
if(F_Error!=0) break;
}
if(F_Error!=0) break;
}
if(F_Error==0)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=1;
reg1.h.dh=F_Disk;
reg1.h.dl=0;
reg1.x.bx=FP_OFF(Boot_Sec);
sr1.es=FP_SEG(Boot_Sec);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
F_Error=reg2.h.ah;
else
for(i=0;i<512;i++) Disk_trk[i]=0;
//写入0道0扇
if(F_Error==0)
for(n=2;n<=Sect;n++)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=n;
reg1.h.dh=0;
reg1.h.dl=F_Disk;
reg1.x.bx=FP_OFF(Disk_trk);
sr1.es=FP_SEG(Disk_trk);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
printf("Error=%d/n",reg2.h.ah);
F_Error=88;
break;
}
}
W0_sec=W0_sec-Sect+1;
//写如FAT表
if(F_Error==0)
for(n=1;n<W0_sec;n++)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=n;
reg1.h.dh=1;
reg1.h.dl=F_Disk;
reg1.x.bx=FP_OFF(Disk_trk);
sr1.es=FP_SEG(Disk_trk);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
F_Error=88;
break;
}
}
}
if(F_Error!=0) Disk_er(F_Error);
}
}
else if(ccc!=65&&ccc!=97&&ccc!=66&&ccc!=98)
Alarm();
List_dir(B_List[1],B_List[0]);
}
Top