一、模板概述
定制数据结构模板,这当然比直接分析16进制的原始数据要方便得多,而且不容易出错。你编辑好数据结构模板保存后,数据模板就生效了。这样你就可以分析来自硬盘、内存等一些数据,这些数据将套用你数据结构模板来显示数据了。例如:这样你可以定制一个模板来查阅数据库记录。
模板本身是个带扩展名TPL的文本文件。WINHEX提供的模板编辑器可以让您写模板的定义,并提供语法检查. 模板的定义,主要包含变量声明,类似于源代码的编程语言. 支持的数据类型包括所有的共同整数,浮点和布尔类型,日期类型, hex值,二进制,文字, 串型. 数组变量和一组变量,都可以使用.能自由移动,前移和后移的数据,使得使用模板的特别灵活:
1.同一个变量可以有多种用途
2.你不关心的数据部分可以跳过
模板管理器列出所有的模板的winhex目录,包含模板定义、标题、附加说明、文件名,点击应用按钮,显示模板选用模板定义的数据,在当前编辑窗在目前的数据解释. 你也可以创造一个新的模板定义,删除或编辑一个现有winhex提供的几个模板样例.
二、模板定义
模板由头部和主体两部分组成,模板头部定义的格式如下:
template "title" //模板标题
[description "description"] //说明
[applies_to (file/disk/RAM)] //应用到文件、磁盘还是内存
[fixed_start offset] //固定的起始偏移值
[sector-aligned] //扇区对齐
[requires offset "hex values"]//要求偏移的HEX值相等
[big-endian] //高字节优先
[hexadecimal/octal]
[read-only] //只读
[multiple [fixed overall size]]
// Put any general comments to the template here.
begin
variable declarations ...
end
中括号代表是该项是可选的. 表达式里面含有空格的话就要用双引号引起来. 评论会出现在模板的定义. 字继双斜线被忽略的解析器. 注释可以写在任何地方,在注释前要“//”号。
1.关键字" applies_to "必须跟着一个只有一个文件,磁盘或内存 . 如果你是用一个模板解析的数据和用此关键字定义的数据来源不相同的话,winhex会发出一个警告。
2.当模板解释这些数据时默认是从当前的光标位置处开始的,一旦使用fixed_start声明位置,解释将总是以指定的偏移位置处开始解释.
3.如果模板应用于磁盘的情况下, 关键字"sector-aligned"确保模板从当前的扇区的开始处进行解释, 而不管确切的光标在当前扇区的确切位置.
4."requires"的声明与"applies_to "声明有点类似,"requires" 声明使WinHex 防止模板定义对不匹配的数据做错误解释。指定一个偏移量和一个任意长度HEX串(十六进制串)来进行匹配。例如,一个有效的主引导记录,可以确认的hex串值“55AA”在偏移0x1fe处 ; 一个可执行文件的hex串值 " mz "在偏移0x0处 . 有许多" appliesto "声明的模板定义头部 ,都是考虑.
5.关键字"big-endian"导致模板定义所有多字节整数和布尔变量是以big-endian顺序(高字节为优先)的读写 .
6. 关键字" hexadecimal "使模板定义的所有整数变量的以十六进制记法显示 .
7.关键字"read-only"确保模板只能用来显示数据. 数据将成灰色,就不能修改数据如果在头部设定"multiple"关键字 , winhex允许浏览到相邻的数据记录在同个模板. 这就要求winhex要知道的记录的大小. 如果"multiple"关键字没有指定为尺寸参数,winhex 计算模板结构总尺寸( = record )来解释当前位置到模板的对应的末尾. 如果这是一个可变尺寸, 即数组大小或移动参数来动态决定 winhex不能浏览先前数据记录.
三、变量声明
模板主体的定义主要包括变量声明,类似于编程语言. 下面是变量声明的基本形式
type "title"//类型 标题
下面是类型:
int8, uint8 = byte, int16, uint16, int24, uint24, int32, uint32, int64,
uint_flex
binary,
float = single, real, double, longdouble = extended,
char, char16, string, string16,
zstring, zstring16,
boole8 = boolean, boole16, boole32hex,
DOSDateTime, FileTime, OLEDateTime, SQLDateTime, UNIXDateTime = time_t, JavaDateTime
"title"只能包含在引号中若含空字符. "title"绝不能仅由数字组成. winhex不区分大小写字符称. 最多有41字符.
在类型之前可以跟以下关键字
big-endian(高字节优先 little-endian (低字节优先)
hexadecimal(十六进制) decimal(十进制) octal(八进制)
read-only(只读) read-write(可读写)
这些修正只影响紧随其后的变量. 他们是多余的,如果他们出现在头已经定义数据类型后面的数据代表占用空间大小的位数,char16和string16是一样的,winhex支持Unicode字符和字符串. 但是, Unicode字符以外的256个第一的ANSI等价字都不支持. 最高字符串大小,可以修改用模板是8192字节.
各类串, string16 , hex需要额外参数,明确了一些内容. 这个参数可以是一个常数或一个先前宣布变数或数学表达(见下文) . 如果它是一个常数,可以指定十六进制格式, 这是公认的,如果号码是先0x .
你可以声明变量数组,把数组大小括号旁边的种类或 称号. 以下两行宣布可变大小的 ascii字符串,其长度取决于前变:
uint8 "len"
char[len] "A string"
同样的功能可以通过以下两句来定义:
byte "len"
string len "A string"
字符"~ "可以作为一个占位后更换与实际的数组元素的数目(见高级 命令) . 这并不适用于数组char变数,因为它们会自动被翻译成一个字符串. 字符串的参数,整型变量数据大小的表达式,可在指定的数学符号. 他们将处理的综合公式解析器. 这些用语须圆括号. 他们不能含有空字符. 他们可利用先前宣布整型变量的名字不包含空字符. 支持的行动,另外, ( + ) ,减法( - ) ,乘法( * ) ,整除( / ) ,取模( % ) , 位与 ( & ) , 位或 ( | ) , and 异或 ( ^ ) . 有效的数学公式所举例( 5 * 2+1 )或( len1 / ( len2 +4 ) ) . 结果总是一个整数,必须是一个正数.
zstring和zstring16都是NULL结尾的字符串,其大小取决于动态地在运行决定.
四、高级命令
当附背带,若干变量声明包含一个块,可以反复使用作为一个整体. 但是请注意,块不能嵌套在当前的执行工作. " ~ "字符可以用一个变量的名字作为占位符后更换为实际计数. 择" numbering "声明界定在哪里开始计数( 0 by default )
numbering 1
{ tab byte "len"
string len "String No. ~"
} [10]
在这个例子实际变量的名字放在模板将"String No. 1", "String No. 2", ..., "String No. 10". 而不是一个固定的重复数目 ( 10在这个例子中) ,您可能还注明是"无限" . 在这种情况下winhex将重复块到年底档案遭遇. " exitloop "可以用来走出这条回路在任何时间
" ifequal "是有用的比较两个表达式. operands可分为两个数值,是恒定值十进制,整型变量或公式, 或者字节序列作文字或hex值是比较byte字节. ascii字符串表达式必须加上引号, hex序列必须prreced了" 0x "标识. 公式须括弧.
{ r byte Value
IfEqual Value 1
ExitLoop
EndIf
} [10]
" ifequal " 以结束" endif "的声明. 如果比较表达都是相等的,模板的解释后继续" ifequal " . optionally , " ifequal "可以遵循的不等的声明. 模板处理器支进入" else "区块,如果表达不能划等号. " ifequal "命令不能嵌套. " ifgreater "类似于" ifequal " . 条件是正确的,如果第一表达的是大于二. 字符串按词典顺序进行比较.
为了便于阅读和导航模板 你可确定一组的变量,在对话框中会在不同组的变量用空间分开:
section "...Section Title..."
...variable declaractions...
endsection
"section", "endsection", 和 "numbering"关键字都没有与当前位置的解释有
关。
有两个命令也不做变量声明,但被明确用来改变目前的位置. 可以跳过无关紧要的数据(向前移动)或能取得一定的变量不止一次 由于不同类型(反向运动) . 用" move n "声明中跳过n字节,由目前的位置,其中N可说是消极的. " goto n " 到指定绝对位置,从一开始的模板解释(必须是位置) . :
int32 "Disk serial number (decimal)"
move -4
hex 4 "Disk serial number (hex)"
作者归档:Windows Hao
解除硬盘HPA -- setmax.c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
/* setmax.c - aeb, 000326 - use on 2.4.0test9 or newer */ /* IBM part thanks to Matan Ziv-Av <matan@svgalib.org> */ /* * Results on Maxtor disks: * The jumper that clips capacity does not influence the value returned * by READ_NATIVE_MAX_ADDRESS, so it is possible to set the jumper * and let the kernel, or a utility (like this one) run at boot time * restore full capacity. * For example, run "setmax -d 0 /dev/hdX" for suitable X. * Kernel patches exist that do the same. * * Results on IBM disks: * The jumper that clips capacity is ruthless. You clipped capacity. * However, if your BIOS hangs on a large disk, do not use the jumper * but find another machine and use a utility (like this one) to * clip the non-volatile max address. * For example, run "setmax -m 66055248 /dev/hdX" for suitable X. * Now go back to your first machine and proceed as with Maxtor drives above. */ #include <stdio.h> #include <fcntl.h> #include <getopt.h> #include <linux/hdreg.h> #ifndef HDIO_DRIVE_CMD_AEB #define HDIO_DRIVE_CMD_AEB 0x031e #endif #define INITIALIZE_DRIVE_PARAMETERS 0x91 #define READ_NATIVE_MAX_ADDRESS 0xf8 #define CHECK_POWER_MODE 0xe5 #define SET_MAX 0xf9 #define LBA 0x40 #define VV 1 /* if set in sectorct then NOT volatile */ struct idecmdin { unsigned char cmd; unsigned char feature; unsigned char nsect; unsigned char sect, lcyl, hcyl; unsigned char select; }; struct idecmdout { unsigned char status; unsigned char error; unsigned char nsect; unsigned char sect, lcyl, hcyl; unsigned char select; }; unsigned int tolba(unsigned char *args) { return ((args[6] & 0xf) << 24) + (args[5] << 16) + (args[4] << 8) + args[3]; } void fromlba(unsigned char *args, unsigned int lba) { args[3] = (lba & 0xff); lba >>= 8; args[4] = (lba & 0xff); lba >>= 8; args[5] = (lba & 0xff); lba >>= 8; args[6] = (args[6] & 0xf0) | (lba & 0xf); } int get_identity(int fd) { unsigned char args[4+512] = {WIN_IDENTIFY,0,0,1,}; struct hd_driveid *id = (struct hd_driveid *)&args[4]; if (ioctl(fd, HDIO_DRIVE_CMD, &args)) { perror("HDIO_DRIVE_CMD"); fprintf(stderr, "WIN_IDENTIFY failed - trying WIN_PIDENTIFY\n"); args[0] = WIN_PIDENTIFY; if (ioctl(fd, HDIO_DRIVE_CMD, &args)) { perror("HDIO_DRIVE_CMD"); fprintf(stderr, "WIN_PIDENTIFY also failed - giving up\n"); exit(1); } } printf("lba capacity: %d sectors (%lld bytes)\n", id->lba_capacity, (long long) id->lba_capacity * 512); } /* * result: in LBA mode precisely what is expected * in CHS mode the correct H and S, and C mod 65536. */ unsigned int get_native_max(int fd, int slave) { unsigned char args[7]; int i, max; for (i=0; i<7; i++) args[i] = 0; args[0] = READ_NATIVE_MAX_ADDRESS; args[6] = (slave ? 0x10 : 0) | LBA; if (ioctl(fd, HDIO_DRIVE_CMD_AEB, &args)) { perror("HDIO_DRIVE_CMD_AEB failed READ_NATIVE_MAX_ADDRESS"); for (i=0; i<7; i++) printf("%d = 0x%x\n", args[i], args[i]); exit(1); } return tolba(args); } /* * SET_MAX_ADDRESS requires immediately preceding READ_NATIVE_MAX_ADDRESS * * On old Maxtor disk: this fails for delta <= 254, succeeds for delta >= 255. * (So, in order to get the last 255*512=130560 bytes back one has to reboot. * Side effect: reset to CurCHS=16383/16/63, CurSects=16514064.) * On new Maxtor disk: this works. * On IBM disk without jumper: this works. */ void set_max_address(int fd, int slave, int delta, int max, int volat) { unsigned char args[7]; int i, nativemax, newmax; nativemax = get_native_max(fd, slave); printf("nativemax=%d (0x%x)\n", nativemax, nativemax); for (i=0; i<7; i++) args[i] = 0; args[0] = SET_MAX; args[1] = 0; args[2] = (volat ? 0 : 1); if (delta != -1) newmax = nativemax-delta; else newmax = max-1; fromlba(args, newmax); args[6] |= LBA; if (ioctl(fd, HDIO_DRIVE_CMD_AEB, &args)) { perror("HDIO_DRIVE_CMD_AEB failed SET_MAX"); for (i=0; i<7; i++) printf("%d = 0x%x\n", args[i], args[i]); exit(1); } } static char short_opts[] = "d:m:"; static const struct option long_opts[] = { { "delta", required_argument, NULL, 'd' }, { "max", required_argument, NULL, 'm' }, { NULL, 0, NULL, 0 } }; static char *usage_txt = "Call: setmax [-d D] [-m M] DEVICE\n" "\n" "The call \"setmax --max M DEVICE\" will do a SET_MAX command\n" "to set the non-volatile max number of accessible sectors to M.\n" "\n" "The call \"setmax --delta D DEVICE\" will do a SET_MAX command\n" "to set the maximum accessible sector number D sectors\n" "below end-of-disk.\n" "\n" "The call \"setmax DEVICE\" will do a READ_NATIVE_MAX_ADDRESS\n" "command, and report the maximum accessible sector number.\n" "\n" "This is IDE-only. Probably DEVICE is /dev/hdx for some x.\n\n"; main(int argc, char **argv){ int fd, c; int delta, max, volat; /* If you modify device, also update slave, if necessary. */ /* The kernel already does this for us since 2.4.0test9. */ /* master: hda, hdc, hde; slave: hdb, hdd, hdf */ char *device = NULL; /* e.g. "/dev/hda" */ int slave = 0; delta = max = volat = -1; while ((c = getopt_long (argc, argv, short_opts, long_opts, NULL)) != -1) { switch(c) { case 'd': delta = atoi(optarg); volat = 1; break; case 'm': max = atoi(optarg); volat = 0; break; case '?': default: fprintf(stderr, "unknown option\n"); fprintf(stderr, usage_txt); exit(1); } } if (optind < argc) device = argv[optind]; if (!device) { fprintf(stderr, "no device specified - " "use e.g. \"setmax /dev/hdb\"\n"); fprintf(stderr, usage_txt); exit(1); } printf("Using device %s\n", device); fd = open(device, O_RDONLY); if (fd == -1) { perror("open"); exit(1); } if (delta != -1 || max != -1) { if (delta != -1) printf("setting delta=%d\n", delta); else printf("setting max=%d\n", max); set_max_address(fd, slave, delta, max, volat); } else { int mad = get_native_max(fd, slave); long long bytes = (long long) (mad+1) * 512; int hMB = (bytes+50000000)/100000000; printf("native max address: %d\n", mad); printf("that is %lld bytes, %d.%d GB\n", bytes, hMB/10, hMB%10); } get_identity(fd); return 0; } |
神舟九号已通过出厂评审 运抵酒泉卫星发射中心

神舟9号4月9日运抵酒泉卫星发射基地
中国载人航天工程新闻发言人9日宣布,执行我国首次载人交会对接任务的神舟九号飞船已通过出厂评审,于4月9日运抵酒泉卫星发射中心,进行在发射场的各项测试准备工作。
这位发言人介绍,神舟九号飞船等飞行产品已按技术流程完成了研制、总装和出厂前测试工作,质量受控、功能性能满足要求。发射神舟九号的长征二号F遥九火箭正在按计划进行出厂前的各项测试工作。
此前,针对神舟九号载人飞行特点,酒泉卫星发射中心从提高参试设备安全性、可靠性入手,有针对性地开展了总体技术准备和岗位训练,完成了任务设施设备的检修检测,培训考核了各岗位人员。目前,发射场设施设备状态良好,各项准备工作正按计划有序进行。
据悉,天宫一号目标飞行器在轨运行状态良好,工作正常,具备执行交会对接任务条件。
远程数据恢复
远程数据恢复
在网络日益普及的今天,网络已波及到人们的生活、工作、学习及消费等广泛领域,其服务和管理也涉及政府、工商、金融及用户等诸多方面。网络逐渐渗透到每个人的生活中,而各种业务在网络上的相继展开也在不断推动电子商务这一新兴领域的昌盛和繁荣。电子商务可应用于小到家庭理财、个人购物,大至企业经营、国际贸易等方面,网络让人类的生活更便捷和丰富,从而促进全球人类社会的进步。并且丰富人类的精神世界和物质世界,让人类最便捷地获取信息,找到所求,让人类的生活更快乐。
为了满足远程客户的需求,提高数据恢复效率,节省客户宝贵时间,通过远程数据恢复服务,即使你在遥远的海外只要网络通畅,都是可以让您足不出户将您丢失的宝贵数据高效复原。
远程数据恢复指:数据恢复工程师通过网络,远程协助客户将丢失的数据恢复的过程。
远程数据恢复的局限性。
能够远程数据恢复均为逻辑故障数据恢复 如:误格式化、误Ghost、误删除、误分区、病毒破坏、目录损坏、RAW格式、0字节、分区丢失、OFFICE文件修复、数据库文件修复、邮件修复等;也就是说存储介质本身没有问题,只不过是出现一些逻辑性的错误。
对于存储介质,存在不能正确识别,摔伤,等等物理故障就无能为力了。 网络不顺畅,电信 联通之间的互联限制对远程恢复数据也有局限。
远程数据恢复的必要前提条件。
出现数据丢失的存储介质(硬盘,移动硬盘,U盘,存储卡,数码设备等)能够挂接到正常的电脑上。电脑系统能够正常启动,并且链接到互联网络上。能够正常上网,使用一些远程协助,即时通讯交流软件工具。例如:百度HI、腾讯QQ、MSN、TeamViewer等。网络连接要求顺畅。恢复操作电脑无毒,无木马程序。有足够的存储空间用于保存恢复出的数据文件。一些必要的数据恢复检测软件(应该由数据恢复者提供)。
远程数据恢复的安全性。
远程数据恢复的安全性要高于传统意义上的数据恢复。远程数据恢复操作,是由专业的人员。通过远程辅助软件程序,远程操控需要恢复数据的人员的电脑,对出现问题的存储介质进行检测恢复。这个过程是在对方的监视下进行。所有操作均是在对方的电脑上进行操作。不存在数据外泄的可能。这也要求数据恢复操作者对于数据丢失的故障的认知判断。对数据恢复者有很高的专业知识的要求。一定要慎重选择,操作。出现数据丢失后。对于远程数据恢复的选择,一定要慎重。因为很多时候数据恢复错误的操作是致命的。不可逆的。
数据恢复常识
一·注意事项:
1.数据恢复过程中最怕被误操作而造成二次破坏,造成恢复难度陡增。数据恢复过程中,禁止往源盘里面写入新数据的。
2.不要做DskChk磁盘检查。一般文件系统出现错误后,系统开机进入启动画面时会自动提示是否需要做磁盘检查,默认10秒后开始进行DskChk磁盘检查操作,这个操作有时候可以修复一些小损坏的目录文件,但是很多时候会破坏了数据。因为复杂的目录结构它是无法修复的。修复失败后,在根目录下会形成FOUND.000这样的目录,里面有大量的以.CHK为扩展名的文件。有时候这些文件改个名字就可以恢复,有时候则完蛋了,特别是FAT32分区或者是NTFS比较大的数据库文件等。
3.不要再次格式化分区。用户第一次格式化分区后分区类型改变,造成数据丢失,比如原来是FAT32分区格成NTFS分区,或者原来是NTFS的分区格式化成FAT32分区。数据丢失后,用一般的软件不能扫描出原来的目录格式,就再次把分区格式化会原来的类型,再来扫描数据。我们指出的是,第2次格式化会原来的分区类型就是严重的错误操作,很可能把本来可以恢复的一些大的文件给破坏了,造成永久无法恢复。
4.不要把数据直接恢复到源盘上。很多普通客户删除文件后,用一般的软件恢复出来的文件直接还原到原来的目录下,这样破坏原来数据的可能性非常大,所以严格禁止直接还原到源盘。
5.不要进行重建分区操作。分区表破坏或者分区被删除后,若直接使用分区表重建工具直接建立或者格式化分区,很容易破坏掉原先分区的文件分配表(FAT)或者文件记录表(MFT)等重要区域,造成恢复难度大大增加。我们在恢复的实践过程中碰到过多次客户在分区表破坏后,先自行尝试过几种分区工具都无法恢复数据后才想到找专业人员帮忙,结果我们发现在多种分区工具作用后,破坏了一些重要的目录文件,造成文件目录恢复不完整,有些大的文件无法恢复。而按客户描述的最初分区丢失的情况,这些文件一般都可以完全恢复了,真是很可惜啊。专业的数据恢复人员在重建分区表之前都会先定位分区的具体位置(逻辑扇区号),然后用扇区查看工具先检查分区的几个重要参数比如DBR/FAT/FDT/MFT等,确认后才修改分区表的,而且修改完分区表后在启动系统过程中会禁止系统做dskchk破坏分区目录,保证数据不会被破坏到。
6.阵列丢失后不要重做阵列。我们在挽救服务器阵列的实践中遇到过有些网管在服务器崩溃后强行让阵列上线,即使掉线了的硬盘也强制上线,或者直接做rebuilding。这些操作都是非常危险的,任何写入盘的操作都有可能破坏数据。
7.数据丢失后,要严禁往需要恢复的分区里面存新文件。最好是关闭下载工具,不要上网,不必要的应用程序也关掉,再来扫描恢复数据。若要恢复的分区是系统分区,当数据文件删除丢失后,若这个电脑里面没有数据库之类的重要数据,我们建议您直接把电脑断电,然后把硬盘挂到别的电脑来恢复,因为在关机或者开机状态下,操作系统会往系统盘里面写数据,可能会破坏数据。
二·日常处理数据时需要注意以下问题:
1.不要剪切文件。我们经常碰到客户剪切一个目录到另外一个盘,中间出错,源盘目录没有,目标盘也没复制进数据。这看起来是一个系统的BUG,偶尔会出现的。所以我们建议如果数据重要,那么先复制数据到目标盘,没有问题后再删除源盘里面的目录文件,不要图省事造成数据丢失。
2.目录文件非常多的分区,不要直接做磁盘碎片整理。因为磁盘碎片整理过程中可能会出错,万一出错了数据就很难恢复。我们建议将数据复制到别的盘后,再格式化要做磁盘整理的盘,然后拷回数据。
3.不要用第三方工具调整分区大小。调整分区大小过程中也很容易出错(比如断电等),一出错也很难恢复,因为数据被挪来挪去覆盖破坏很严重的。建议在重新分区之前,备份好数据,再使用Windows自带的磁盘管理里面来分区,安全性高一些。
定期备份数据,确保数据安全,最好是刻盘备份,比存在硬盘里面更安全。
三·影响数据恢复成功率的相关因素
1.FAT或者FAT32分区,删除或者格式化后,比较大的文件或者经常编辑修改的文件,恢复成功率要低一些,比如经常编辑修改的XLS或者CDR文件就很难完整恢复。那些文件拷进去后就不动的文件,恢复成功率比较高,比如PDF或者JPG,MPG等不经常修改的文件,恢复率还是比较高的。这是因为FAT和FAT32分区使用文件分配表来记录每个文件的簇链碎片信息,删除或者格式化后簇链碎片信息就被清空了,那些经常编辑修改的文件由于它们的文件长度动态增长,在文件系统中一般都不会连续存放,所以文件碎片信息就无法恢复,文件恢复也就不完整了。
2.NTFS分区的恢复概率比较高,一般删除或者格式化后绝大部分都可以完整恢复的。某些文件有时候无法恢复,例如文件长度非常大或者文件在编辑使用很长时间,这文件会形成很多的碎片信息,在删除文件后,这个文件就无法知道文件长度,很难恢复了,例如一些使用很多年的数据库文件,删除后用数据恢复软件扫描到的文件长度是0,无法恢复。定期做磁盘碎片整理可以减少这种情况的发生,但是直接做磁盘碎片整理也有风险,请参考上面需要注意的问题。
3.重新分区或者删除分区或者分区表破坏,一般后面的分区基本能完整恢复,越靠后的分区被破坏的可能性越低,所以重要数据最好放在比较靠后的分区里面,不要放在C,D盘里。
4.经过回收站删除的文件,有时候会无法找到文件。NTFS下,从回收站中删除的文件,文件名会被系统自动修改成De001.doc之类的名字,原来的文件名被破坏。当您的数据丢失后,不能直接找到文件名,记得别漏过这些被系统改名过的文件哦。直接Shift+Del删除的则不会破坏文件名。