《用WIN32程序探秘NTFS扇区存储》一书中的第二部分,也就是《工具篇》部分,介绍了我们编写的,21个WIN32工具程序的功能和使用方法。
下面是这一部分在书中的原始目录,阅读者可以点击某一个目录,借助锚记链接功能跳转到您想阅读的位置。
注:此处是目录
工具篇
本篇提供了笔者编写的26个工具程序,分为两部分介绍这些程序的功能和使用方法,这些工具程序全部收录在随书附送的光盘中。第一部分介绍21个WIN32程序,用来对物理硬盘扇区进行读写、查找扇区特征以及处理扇区数据的备份文件。这也是本书探秘NTFS文件系统的扇区存储规律时,必须使用的工具程序。第二部分介绍5个DOS下运行的16位程序,作为对WIN32程序的补充。
对物理硬盘扇区进行读写的方法,基本上有两种。
第一种方法是在16位应用程序中,使用INT13H中断,调用BIOS磁盘服务程序,对硬盘扇区进行读写。使用这种方法的应用程序,一般只能在DOS实模式下运行,因为32位的WINDOWS操作系统屏蔽了INT13H中断功能。在笔者所写的另一本书中,曾经对这种方法进行过详细介绍,书名为《硬盘扇区读写技术━━修复硬盘与恢复文件》,已由机械工业出版社出版。在该书中提供了笔者编写的20多个类别,共计40多个工具程序。
第二种方法是在WIN32应用程序中,通过调用WINDOWS
API函数CreateFile(),对硬盘扇区进行读写。使用这种方法的应用程序,可以运行在NT内核的操作系统中,如WINDOWS 2000操作系统等。但是这一类的应用程序,不能在WINDOWS
9X内核的操作系统中运行,这是因为函数CreateFile()打开磁盘的功能,在WINDOWS 9X中不被支持的缘故。
本书介绍的是第二种方法,所有的WIN32程序都在WINDOWS
2000下编译连接,可以运行在WINDOWS 2000和WINDOWS XP操作系统中。
除了这两种基本的方法以外,还有另外的一种方法,可以在WINDOWS
9X内核的操作系统中,实现对物理硬盘扇区的读写。因为本书的主题是探秘NTFS文件系统的扇区存储规律,运行有关的工具程序时,其操作平台应该能够识别NTFS文件系统。而WINDOWS
9X内核的操作系统不能识别NTFS文件系统,所以笔者在编写工具程序时,没有使用这一种方法。
目前对硬盘进行各种操作的应用软件很多,是否还有必要使用这些功能比较单一的工具程序呢?笔者解释一下工具程序与应用软件的区别,应用软件的功能被限定在编程者的思维框架之内,有很大的局限性。硬盘出现的引导和逻辑故障五花八门,文件和数据丢失的具体情况各种各样,应用软件很难满足所有的需要。同时使用者并不了解编程者的思路,在使用中具有很大的盲目性。
因为软件是人编写的,软件本身没有智能、没有思维,它永远不可能超越人的大脑。在处理具体的硬盘故障时,除了借助于软件对硬盘进行操作外,还必须配合操作者的分析判断,才能快速准确地找到故障,达到修复硬盘或恢复数据的目的。
工具程序则不同,它只是授予操作者一种方法。操作者使用这种方法,就能透明地观察硬盘扇区数据,然后再运用自己大脑的思维活动,去准确地判断故障所在。这就给了操作者最大的发挥自己的灵感和想像力的空间,是应用软件无法比拟的。
第1部分 WIN32程序
这一部分介绍21个WIN32工具程序,这些工具程序概括起来讲,主要有三项功能。
第一项功能是读写物理硬盘的扇区数据,包括将扇区数据保存到文件中进行备份,或是将先前备份到文件中的数据写回到扇区中去。
第二项功能是根据操作者的设定,查找物理硬盘中具有某些特征的扇区地址,如系统引导扇区、存储某一文件名的扇区、具有某些字段值的扇区等。
第三项功能是处理文件中的数据,如对两个文件的内容进行比较、对文件中的字节数据进行修改、将一个大文件剪切到指定的字节数等。
这21个WIN32工具程序,虽然在本书中是为了探索NTFS的扇区存储规律而编写的,但是这些程序具有通用性,它们可以更广泛地应用于其他领域。因为计算机中的所有数据,不管是操作系统的、文件系统的、还是用户的,最后都是以磁介质的形式存储在物理磁盘上。所以只要掌握了对磁盘扇区基本的读写与分析方法,就能不受操作系统和文件系统的限制,开拓更多的应用空间。
为了使读者能正确地运行和使用这些工具程序,现将它们的主要特点和运行注意事项列举如下:
1.每个工具程序只具备一项,或至多几项功能。这样能使操作者有目的地使用工具程序,去解决某一个具体问题。对于一些扇区操作不太熟练的读者,功能比较单一的程序,使用时更容易上手。
2.笔者在编写工具程序时,尽量使程序界面具有“操作向导”式的显示风格,这样能引导操作者一步一步地循序操作。
3.工具程序不同于公开发表的成品软件,它只具备基本功能,而一些检测、异常处理、软件保护等功能没有设置。这样处理的目的,是使程序运行时简捷、高效。因为任何附加功能,都要增加程序的运行开销。
4.由于程序中省略了一些附加功能,所以操作者在运行程序时,必须按照要求进行正确地操作。如果操作失误,可能会造成一些不良后果,具体有以下几个方面:
●在将扇区数据保存到文件中进行备份时,输入的文件名要保证在当前目录中是唯一的。如果当前目录中还有其他的同名文件,则原来的文件将会被破坏。因为将数据保存到文件时,是以“写”方式打开文件,这种方式是按照新建立的文件写入数据,原来的数据就被覆盖掉了。
●输入文件名时,文件名连同其全路径所使用的字符数不要太多,一般限制在40个字符以下即可,最好是在根目录下运行工具程序并建立文件。因为笔者在编写程序的源代码时,定义的数组下标值不是太大。如果下标值越界,程序运行可能失败。
●在输入某些由操作者设定的参数时,一定事先了解该项参数的取值范围,如硬盘编号和扇区编号等。如果超过了取值范围,程序本身虽没有提示功能,但操作系统可能会发现错误并作出提示,不过这种提示一般不能确切地说明错误的实质。
工具程序中读写扇区数据时,是使用线性寻址方式对扇区进行定位的,线性寻址方式的有关规定如下:
1.物理硬盘是用其编号来识别的,起始号为“0”。一般情况下,都将硬盘的跳线设置在主盘的位置。这时接在第一IDE口上的是“0”号硬盘;接在第二IDE口上的是“1”号硬盘;如果还接有SCSI硬盘,则其编号为“2”。需要说明的是,硬盘的编号是由主板BIOS程序进行识别的。接在同一位置的硬盘,不同的主板BIOS,可能赋予它不同的编号。
2.物理扇区的地址是用其线性编号来识别的,起始号为“0”。这种寻址方式与硬盘分区和逻辑驱动器无关,从“0”开始一直编到最后一个扇区,是由BIOS磁盘服务程序管理硬盘时虚拟的。
3.每个扇区中,包含512个字节。字节在扇区中的地址,是用字节位移来标识的,其起始号为“00H”,写成十六进制的形式。这种寻址方式在编程时比较好用,但在观察和寻找扇区中的字段值时,感觉不太方便。
为此笔者在编写程序时,将对话框中显示的扇区字节从“1”开始编号,一直编到扇区中的最后一个字节。这样每行显示16个字节,一共显示32行。在查找扇区中某一个字节的位置时,就与编号统一起来了,并且在排列上感觉很有对称性。
为了使读者在分析扇区数据时有一个参考的对象,笔者将自己所用的计算机作为标本,进行各种扇区字段的分析和有关数据计算。
笔者使用的计算机上挂接了两块硬盘,都是西部数据公司生产的。一块容量是6.2GB,接在第一IDE口上,硬盘编号是“0”;另一块容量是40GB,接在第二IDE口上,硬盘编号是“1”。
第4章 读硬盘扇区数据程序
本章介绍的工具程序,能根据操作者指定的扇区号,将扇区数据读出,并以十六进制的形式,将字节值显示在对话框中。还能根据操作者指定的文件名,将扇区数据存入文件中进行备份。
用鼠标双击可执行文件名“读硬盘扇区数据.EXE”,程序运行后的主窗口初始界面如图4-1所示。

图4-1
在图4-1的程序界面中,编辑框里输入硬盘的编号,然后点击“硬盘确定”按钮,程序转入下一个界面,如图4-2所示。
在输入硬盘的编号时,一定要了解想操作的是哪一块硬盘。以笔者使用的计算机为例,如果想操作的是接在第二IDE口上的,也就是那块40GB的硬盘,则在编辑框中输入“1”。如果想操作的是接在第一IDE口上的,也就是那块6.2GB的硬盘,则在编辑框中输入“0”。如果读者使用的计算机中只有一块硬盘的话,则不管它接在哪个IDE口上,都在编辑框中输入“0”即可。

图4-2
在图4-2的程序界面中,编辑框里输入需要读取的扇区号。这里要注意的一个问题是,此处输入的扇区号是线性寻址所使用的扇区编号,起始号为“0”。初次进行扇区操作的读者,在这个问题上很容易发生错误。举例来说,如果想读取0磁道第1个扇区的主引导记录,则第1个扇区的扇区号应该是“0”,而不是“1”。
假设需要读取的就是“0”号扇区,在编辑框中输入“0”,然后点击“扇区确定”按钮,程序转入下一个界面,如图4-3所示。

图4-3
在图4-3的程序界面中,编辑框里输入存储扇区数据的备份文件名。输入文件名可以用两种方法,既可以敲击键盘直接输入,也可以点击编辑框右边的“浏览”按钮,打开存储对话框进行选择。
先介绍键盘输入的操作方法。使用键盘输入文件名时,如果不加路径,则文件建立在执行程序的当前目录中。如果在文件名前加入存储文件的路径,则必须保证逻辑驱动器的盘符和目录名必须存在。否则在后面存储数据的操作中,会出现一个错误提示对话框,程序运行失败。错误提示界面如图4-4所示。

图4-4
图4-4中的错误提示对话框,并不是在工具程序中设置的,而是在发现存储数据时发生路径错误以后,由操作系统作出的提示。
后面章节中介绍的所有程序,凡是输入文件名发生路径错误时,都会出现如图4-4的错误提示。
操作者在正确输入路径和文件名以后,点击“文件确定”按钮,程序转入下一个界面,如图4-5所示。

图4-5
在图4-5的程序界面中,点击“读取数据”按钮,程序将指定扇区的数据读出,并将数据存入指定的文件中。同时打开一个对话框,将扇区中512个字节值以十六进制的形式,显示在对话框中。程序的运行界面如图4-6所示。

图4-6
在图4-6的程序界面中,弹出的对话框里每行显示16个字节数据,总共显示32行。
在图4-6主窗口的编辑框中,还出现了一个5位数“10084”,编辑框上面的提示是“字节算术累加和”,现在重点解释一下程序的这项功能。
分析扇区数据的过程当中,经常需要观察扇区是否发生了写操作。如果将扇区中的512个字节逐一进行比较,则费时费力,对操作者来讲是一件很繁重的工作。
在程序中使用这种“字节算术累加和”的监测功能,就能很直观地看出扇区数据是否被改动。当发现两次计算的累加和不一致时,说明扇区数据被改动了。然后再仔细查看每一个字节的值,或是运行“文件字节比较.EXE”程序,将前后两次备份的扇区文件进行比较,就能发现哪些字节被写入了新的数据。这是一个快速实用的监测方法,读者在实际操作中很快就能体会到它的方便之处。
现在再介绍另一种输入文件名的方法。在图4-3的程序界面中,点击编辑框右边的“浏览”按钮,程序转入下一个界面,如图4-7所示。

图4-7
在图4-7的程序界面中,弹出一个保存文件对话框。在上面的“保存在”编辑框中选择逻辑驱动器的盘符;在中间的编辑框中选择存储目录;在下面的“文件名”编辑框中输入建立的文件名。然后点击“保存”按钮,程序转入下一个界面,如图4-8所示。

图4-8
在图4-8的程序界面中,编辑框里出现了带有路径的文件名,然后点击“文件确定”按钮,程序转入图4-5所示的界面。接下来的操作与前面所讲过的相同,不再赘述。
从图4-8中可以看出,文件起名为“SECTOR”,存储在E盘的根目录下。建立的这个文件中,存储的是硬盘主引导记录所在扇区的数据,其中也包含主分区表。在《基础篇》中曾经讲过,该扇区数据在系统引导过程中,具有非常重要的作用。如果日后硬盘出现引导故障时,就可以使用写扇区工具程序,把保存在文件中的数据再写回到原来的扇区中去,覆盖掉错误的数据,就能使硬盘恢复如初。
保存扇区数据的文件应该在其他的存储设备上有另外的备份,因为当硬盘不能引导时,硬盘上的文件也就读不出来了。如果计算机中有两块硬盘,可以采用交叉备份的方法。即在“0”号硬盘上备份“1”号硬盘的引导扇区数据,在“1”号硬盘上备份“0”号硬盘的引导扇区数据。
也可以用写扇区工具程序,将文件中的数据写入0磁道的2-63扇区中进行保存。在《基础篇》中曾经讲过,系统的引导数据只使用第1扇区,其他的62个扇区弃之不用。当硬盘出现引导故障时,将数据读出来再写入第1扇区,就能修复硬盘,这种方法比在文件中保存数据更加可靠。
当程序运行到图4-6的界面时,如果想结束程序运行,可以点击“退出”按钮;如果想继续读取其他扇区的数据,可以点击“刷新”按钮,程序将转到图4-1的初始界面。
第5章 写硬盘扇区数据程序
本章介绍的工具程序,能将备份在文件中的扇区数据,再写回到操作者指定的扇区中去。还可以根据操作者指定的扇区号,将扇区中的数据清零。在发出写操作指令以前,可以在对话框中观察文件的内容,以确定数据的正确性。
运行“写硬盘扇区数据.EXE”程序,其主窗口的初始界面如图5-1所示。

图5-1
在图5-1的程序界面中,编辑框里输入要写入数据的硬盘号,以笔者使用的计算机为例,输入“1”后点击“硬盘确定”按钮,程序转入下一个界面,如图5-2所示。

图5-2
在图5-2的程序界面中,操作者有两种选择。第一种选择是打开已有的扇区数据备份文件,然后将文件内容写入指定的扇区。第二种选择是使用程序内建的文件,将数据写入扇区,由于内建文件的512个字节全部为0,所以可将指定的扇区清零。
先介绍第一种选择。在图5-2的编辑框中输入磁盘上已有的文件名,可以直接由键盘输入,也可以点击“浏览”按钮,在弹出的打开文件对话框中进行选择。
如果由键盘直接输入,需要注意输入的路径与文件名必须存在,否则在点击“文件确定”按钮后,会弹出一个错误提示对话框,如图5-3所示。

图5-3
如果点击“浏览”按钮,则弹出一个打开文件对话框,如图5-4所示。

图5-4
在图5-4的程序界面中,打开文件对话框里可以选择盘符、目录和文件名。用这种选择方式比较安全,因为盘符、目录和文件名都在对话框中排列着,不会因为输入了不存在的目录和文件名而出现错误提示。
从图5-4中可以看出,在E盘的根目录下有一个名为SECTOR的文件。它就是在第4章中建立的“1”号硬盘“0”号扇区数据的备份文件,该扇区也可以称为0磁道第1扇区。假如选择了E盘根目录下的SECTOR文件,然后点击“打开”按钮,选择的文件名连同路径就出现在主窗口的编辑框中,如图5-5所示。

图5-5
在图5-5的程序界面中,点击“文件确定”按钮,程序转入下一个界面,如图5-6所示。在前面讲过的图5-2中,如果采用直接输入文件名的方式,而不发生输入错误的情况下,点击“文件确定”按钮,也会转入图5-6的界面。

图5-6
在图5-6的程序界面中,弹出的对话框里显示了SECTOR文件中512个字节的十六进制数据,以及全部字节的算术累加和。
操作者通过观察与判断,如果认为打开的文件不是自己所需要的,可以点击主窗口中的“退出”按钮结束程序运行。或者是点击“刷新”按钮,使程序回到图5-1的初始界面重新输入。
如果认为打开的文件正确无误,接下来在主窗口的编辑框里输入被写的扇区号。前文曾讲过,如果将硬盘的主引导记录系统数据,写入0磁道隐藏的2-63扇区中进行保存,是最安全可靠的一种备份方法,现在就可以实现这一目的。在主窗口的编辑框中输入“6”,这是线性寻址的6号扇区地址,在0磁道的63个扇区中是第7扇区。然后点击“写入扇区”按钮,程序转入下一个界面,如图5-7所示。

图5-7
在图5-7的程序界面中,主窗口基本上又回到了图5-2的界面,只是没有了“清零”按钮。现在可以继续输入另外的文件名,进行其他扇区的写操作。也可以点击“退出”按钮结束程序运行,或是点击“刷新”按钮回到初始界面。
数据写入扇区的效果,可以运行后面将要介绍的“监视0磁道变化.EXE”程序,将0磁道的63个扇区的算术累加和,显示在对话框中进行观察。现在先使用该程序的运行结果,程序运行后的界面如图5-8所示。

图5-8
在图5-8的对话框中可以看到,第7扇区(线性寻址的6号扇区)与第1扇区(线性寻址的0号扇区)数值相同,都是10084,这就是刚写入的备份文件的数据。
再回到图5-2的界面介绍第二种选择。点击“清零”按钮,程序转入下一个界面,如图5-9所示。

图5-9
在图5-9的程序界面中,编辑框里输入需要清零的扇区号,然后点击“扇区清零”按钮,程序执行完清零功能后,重新回到图5-2的界面,等待操作者下一步的选择。
关于本程序的“扇区清零”功能,需要重点介绍一下它的用途。该项功能在排除硬盘的某些逻辑故障时,能起到四两拨千斤的作用,收到很好的效果。
如果硬盘被某些软件设置了逻辑锁,或是被类似的病毒所感染,则硬盘就不能正常引导。用软盘启动计算机以后,也不能进入硬盘。这是因为主引导记录的代码被修改了,在读取主引导记录时,将启动过程引入了一种死循环状态。
这时用一块正常的硬盘启动计算机,用本程序的扇区清零功能,将故障盘的0号扇区进行清零操作,即可解除硬盘的死锁故障。如果故障盘上没有重要数据,可以重新分区和格式化。如果故障盘上有重要数据,可以找一个装有相同操作系统的硬盘,将其0号扇区的数据拷贝到故障盘上,然后再手工编制一下主分区表,就能将故障盘修复。
第6章 监视0磁道变化程序
在第1章中曾经简要介绍了硬盘0磁道的特点,以及笔者使用的计算机中,两块硬盘0磁道的监测结果。
本章介绍硬盘0磁道的监测工具,该工具程序能根据操作者设定的硬盘号,将指定硬盘的0磁道中63个扇区的数据,用扇区字节算术累加和的形式显示在对话框中,供操作者进行观察和判断。
硬盘不管是什么型号的,也不管它的容量有多大,其0磁道在整个物理结构中占有非常特殊和重要的地位。因为在计算机启动的过程中,首先读取的系统数据,就是0磁道第1扇区的主引导记录。
在其他扇区上存储的系统引导数据,如果发生逻辑故障,一般只会影响这些数据所属的逻辑驱动器,而不会危及整个硬盘。但是如果0磁道第1扇区的系统引导数据被破坏,则整个硬盘就不能工作了。
硬盘0磁道的另一个特点,是该磁道的63个扇区中,系统只使用了第1扇区,其他的62个扇区都空闲不用。而无论是操作系统还是应用软件,如无特殊需要,都不会访问这些扇区。就连对硬盘扇区进行最底层操作的FDISK分区程序,也只访问0磁道的第1扇区,对其他的62个扇区不进行操作。
鉴于此,0磁道空闲的62个扇区,就是备份重要数据的理想存储空间。当然备份的数据量不能太大,因为62个扇区只有31KB的存储容量。
现在介绍本章程序的使用方法,运行“监视0磁道变化.EXE”程序,其主窗口的初始界面如图6-1所示。

图6-1
在图6-1的程序界面中,编辑框里输入硬盘编号,如果计算机只有一块硬盘,它就是“0”号硬盘。笔者使用的计算机中有两块硬盘,现在想操作第二IDE口上的硬盘,就在编辑框中输入它的编号“1”,然后点击“显示数据”按钮。程序转入下一个界面,如图6-2所示。