absread和abswrite以及磁盘的格式化

来源:互联网 发布:prohub软件下载 编辑:程序博客网 时间:2024/06/05 02:47

absread和abswrite以及磁盘的格式化

int absread(int drive,int num,int sectnum,void *buf)

  功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑

扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇

区的内容,储存于buf所指的缓冲区中。

  参数:drive=0对应A盘,drive=1对应B盘。

  返回值:0:成功;-1:失败。

  头文件:dos.h

  abswrite()写磁盘绝对扇区函数

  原形:int abswrite(int drive,int nsects,int lsect,void

*buffer)

  drive=0(A驱动器)、1(B驱动器)、

  nsects=要写的扇区数(最多64K个);

  lsect=起始逻辑扇区号;

  buffer=要写入数据的内存起始地址。

  功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定

扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目

录结构所在的扇区,也照常进行。

  返回值:0:成功;-1:失败。

  头文件:dos.h

****************************************************************************************************************

磁盘的格式化可以分为低级格式化和高级格式化。低级格式化

是针对硬盘而言的,它能将硬盘中的数据全部清除,包括硬盘

的主引导记录、DOS引导记录和分区表信息,当然也能扫除将

磁盘作为藏身之处的一切病毒。较老版本的CMOS设置中包括

了硬盘低级格式化的程序,可以在CMOS中对硬盘低格,也可

以使用一些低格软件如DM等完成低格操作。磁盘的高级格式

化有几种形式,快速格式化就是其中的一种,与DOS一起发表

的基本FORMAT程序允许用户对磁盘快速格式化(可选参

数/Q)。在介绍快速格式化之前,先对磁盘的结构作一个简单

的介绍,再将快速格式化和一般的高级格式化作一个比较。


     一个被成功高级格式化的硬盘可以分成以下几个部分:主

引导记录和分区表信息、DOS引导记录、文件分配表(FAT)

信息、根目录(ROOT)信息和数据区。主引导记录和分区表

信息存放在硬盘的第一个扇区中,主引导记录可以根据操作系

统的不同而任意编写,基于这一特点,实现多操作系统并存就

不是一件困难的事情。分区表是硬盘第一个扇区中最后64个字

节,对应地分别以“80H”和“55AAH”为起始和结束标志。

它记录着硬盘逻辑区的个数、起始和结束的扇区号等信息,其

中的“80H”和“55AAH”被称为是硬盘的两个关键代码,丢

失后硬盘将不会自举。DOS引导记录保存了对于引导系统的三

个文件的描述,它也包括一个分区表信息。文件分配表和根目

录信息记录着文件的名字、属性等以及存放的地址,在文件定

位时,结合分配表信息和根目录信息,就可以很方便地找到文

件。数据区是硬盘中占用扇区最多的一个部分,用于保存文件

数据。


     再来看看文件删除的过程:修改文件分配表对应信息、将

文件名的第一个字符改掉以及释放磁盘空间。必须注意,存放

在数据区的文件内容并没有被删除,因此删除的文件可以被恢

复。对比地看,磁盘的高级格式化主要做了以下工作:对磁盘划

分磁道和扇区、向主引导区和DOS引导区写入引导信息、清空

文件分配表和根目录区并扫描磁道。然而快速格式化却不同,

它没有进行磁道扫描,因此,快速格式化和完全删除磁盘文件

在效果上是相同的。


     与硬盘的结构相比,软盘中没有主引导区。高级格式化对

软盘同样要做四件事情,不过就FORMAT 命令而言,在执行操

作之前,会将文件分配表、根目录区的内容以映象形式保存到

磁盘最后几个扇区中,这样一来,软盘数据又能被“反格式

化”操作恢复回来(只要数据区内容没有被覆盖掉)。


     鉴于1.44MB 3.5英寸软盘FAT区和根目录区所占扇区数是不

变的(FAT1: Sector 1-9; FAT2: Sector 10-18; ROOT: Sector

19-32),我们可以上机实践一下,编写一个快速格式化程

序,实现对1.44MB 3.5英寸软盘的快速格式化。由于程序较简

单,没有保存UNFORMAT信息,所以格式化完成后数据无法

恢复,因此实验时应特别小心。我们可以利用C语言库函数

abswrite来实现快速格式化,因为它是被定义在dos.h头文件中

的,因此程序开始时应写上:


                          #i nclude <dos.h>


以下是此函数的原形,在此写出便于参考学习:


          int abswrite (int drive, int nsects, int lsect, void *buffer);


与之对应的absread函数原形:


          int absread (int drive, int nsects, int lsect, void *buffer);


     程序设计思路:因为快速格式化是将FAT区和ROOT区清

空,那么我们可以利用abswrite函数向这两个区域写零,达到

数据清空的目的。程序代码如下:


#i nclude <dos.h>


#i nclude <stdio.h>

unsigned char buff[512];

main()


{


int i;char c;


printf (“\nQuick Format 1.44MB\n”);


printf (“Program by ChenQingyang.\n”);


printf (“ALL DATA IN THE FLOPPY DISK WILL BE LOST!!

\n”);


printf (“\nInsert a diskette for drive A:\n”);


printf (“and press ENTER when ready. . .”);c=getchar();


printf (“\n\nCleaning FAT area. . .”);


buff[0]=0xf0;buff[1]=buff[2]=0xff;


for (i=3;i<512;i++) buff[i]=0;


abswrite(0,1,1,buff);


abswrite(0,1,10,buff);


for (i=0;i<512;i++) buff[i]=0;


for (i=2;i<10;i++) abswrite (0,1,i,buff);


for (i=11;i<19;i++) abswrite (0,1,i,buff);


printf (“\nCleaning ROOT area. . .”);


for (i=19;i<33;i++) abswrite (0,1,i,buff);


printf (“\n\nQuickFormat Completed!\n”);


}

原创粉丝点击