摘要:本文介绍了有关DOS磁盘系统严重错误的知识,并就如何屏蔽DOS磁盘系统严重错误的问题进行了较深入的探讨
关键词:DOS磁盘系统严重错误、中断向量、中断修改、磁盘检测(Disk Verifying)
在C语言程序设计时,程序员可能会碰到这样的尴尬场面:自己精心设计的用户界面被“Not ready reading drive A”之类的DOS磁盘错误提示所破坏,这是灾难性的。当程序员用fopen函数去操作A盘上的文件时,这种问题就可能会出现。为了讨论的方便,我们姑且将磁盘系统严重错误分为三种:磁盘检测错误(如扇区未找到、磁盘未准备、写保护错误等)、一般性硬件错误(如提示“General fail in drive A”等)和磁盘软件错误(如文件不存在等)。只要解决了这三个问题,那么本文的主要问题就解决了。
1、 磁盘检测错误
BIOS系统提供的13H号中断调用中04H子功能是扇区检测功能(Verify disk sector),调用这个磁盘检测功能可以取得一些磁盘的状态,如磁盘是否准备就绪等。本功能的返回参数如下:①如果成功,进位标志清零,AH=0,AL=检测的扇区数;②如果失败,进位标志置位,AH=错误代码。在磁盘系统中,换盘也被认为是一个错误,但对于用户来说,换盘操作是允许的,所以,这个功能应至少被调用三次,再判断返回参数,以确保正确性。
磁盘扇区检测功能虽然能够检测磁盘的一些硬件错误诸如“扇区未找到”、“磁盘未准备”等,但还有些错误却被忽视,比如磁盘的写保护错误。为此,我们只能够通过磁盘的物理扇区写操作来判断磁盘或驱动器的状态,方法是:先读出一个扇区(读三次)再用13H的03H功能将扇区写回(写三次),最后判断03H功能的返回参数(返回参数格式与04H相同)。如下的程序实现了这个功能,如果成果,返回0,如果失败,返回错误代码。
void IoSector (unsigned drive,unsigned action,
int head,int sector,int cylinder,
unsigned char *buffer)
{
regs.h.ah=action; regs.h.al=1;
regs.h.ch=cylinder; regs.h.cl=sector;
regs.h.dh=head; regs.h.dl=drive;
regs.x.bx=FP_OFF(buffer); sregs.es=FP_SEG(buffer);
int86x(0x13,®s,®s,&sregs);
}
int CheckSector (unsigned drive, unsigned head, unsigned sector, unsigned