汇编语言程序与硬盘数据恢复示例
这是我2年前修过的一块硬盘,2001年ibm生产的15G硬盘

第一章:故障分析

老弟送来一块硬盘,非常着急,数据非常重要,价值数万元,甚至多几倍。
新购买的硬盘,使用才二个月不到。
故障现象:bios能够检测出来,但是比较费劲,长时间的嘎吱嘎吱。
win98的dos方式进入时也很困难,有几分钟之久的嘎吱嘎吱,
进入之后,C盘不能够显示目录,有乱码,D盘进不去。
很明显硬盘有硬伤:就是在关键数据区有坏道。
用scandisk检测,果然发现硬盘最开始部分就有坏道,而且在硬盘40%容量处有大量坏道,
最后末尾有少量坏道。
硬盘共分C,D二个区,C为系统分区,仅2GB,而D盘有12。6G,均系FAT32,有近10GB的重要数据。
用diskedit扫描,发现里面数据基本完好,就是说有修的价值。

第二章:数据恢复工具大比武

确定故障之后,首先想到的是如果能够用修复工具搞定最好不过。于是,找来各种各样的修复工具如:xyhddfix,fdc263,RecoverNT,Tiramus,kv300等等,终于很快失望。

原来,各种修复工具都是以FAT2修复FAT1,而这块硬盘偏巧FAT1的第一个扇区物理损坏,而且
FAT2的第一个扇区也物理损坏。

而多数工具都是从头构筑文件系统链条。

不敢在试修复工具了,因为修复工具在试图修复时,反复读取坏道,这会加大坏道面积,
硬盘已经脆弱不堪了,不能够再折磨它了,否则会丢失更多的数据。

为了减少对硬盘的损伤,经过试验,发现dos6.22进入时不试图读出硬盘的系统数据,而win98的
启动盘就爱管事情,于是使用dos6.22软盘作为修复环境。

虽然DOS6.22不认识fat32分区,但是现在什么也看不见。

;Added on 2001-09-13 by hofman
;Revised on 2003-06-07 by hofman
dseg segment
block db 10h,15 dup(0)
buffer db 8000h dup(0)
msg1 db 'reading error.skipping',24h
msg2 db ' writing error.skipping',24h
msg3 db 'All are ok. Ended at bx=0045h',24h
dseg ends

stack_seg segment stack
dw 20 dup(0)
top_of_stack label word
stack_seg ends

cseg segment
main proc far
assume cs:cseg,ds:dseg,es:dseg,ss:stack_seg
start:
push ds
xor ax,ax
push ax
mov ax,dseg
mov ds,ax
mov es,ax
;
lea si,block
mov byte ptr [si+2],01h; each time 10h sectors

mov bx,003eh ; starting abs sectors's hight bits
mov [si+0ah],bx ;save it
mov ax,829eh ; low bits:829fh=829e+1h
mov [si+08],ax

loop1:
mov ax,[si+08h]
mov cx,0001h
add ax,cx
mov [si+08h],ax
mov bx,[si+0ah]
mov dx,bx
mov bx,0
adc dx,bx
mov bx,dx
cmp bx,0045h ; here encountering bad sectors
je exitn
mov [si+0ah],bx

lea bx,buffer
mov word ptr [si+4],bx
mov word ptr [si+6],es
;
mov dl,81h
mov ax,4200h
int 13h ; read 3fh sectors
jnc ok
lea dx,msg1
mov ah,09
int 21h
jmp loop1
;
ok:
mov dl,80h
mov ax,4300h
int 13h ; write 3fh sectors
jnc loop1
jmp error
exitn: lea dx,msg3
mov ah,09h
int 21h
jmp exit
error: lea dx,msg2
mov ah,09
int 21h
jmp loop1
exit:
mov ah,4ch
int 21h
main endp
cseg ends
end start


------
回复此文章

使用的汇编程序非常简单,是个helloword级的小程序。

但是修复思路不错。成功地抢救出近10GB数据中的95%以上的数据。

简单的小程序说明,即使只懂一点汇编,有时也能够起大作用,

单纯依赖工具软件是不行的。
因为工具软件是通用的,它不明白你的特殊情况,
因而,往往不能找到最佳方法。

声明:
不建议非计算机专业学生学习汇编语言。因为其使用领域非常有限。


hofman   2005-11-19 23:10:42 评论:1   阅读:865   引用:0
相当感谢! @2007-01-09 11:01:25  cyp
我们在做课程设计,我选的是一个驻留内存程序,驻留程序就是关于硬盘保护的.

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2006 powered by YuLog