如果多运行中最高位大于等于8,即1000(最高位为1),是否需要按以下方法操作?

[复制链接]

该用户从未签到

23

主题

182

回帖

4134

积分

[INTOHARD]团长

Rank: 8Rank: 8

积分
4134
QQ
发表于 2009-8-24 15:56:53 | 显示全部楼层 |阅读模式
---------------------------------------------
以下是取自本论坛另一坛友文章。


以下是小弟初学NTFS底层结构时遇到一问题,即MFT中80H属性的数据运行。

单一的运行很好理解,但是多运行,有一个疑问,为什么子运行3要取反加1,fd7a0d怎么就是一个负数呢

望高手解答,不胜感激。以下是NTFS底层结构原文中的一段

21  48  06  24  31  01  f3  aa   02  31  01  0d  7a  fd  31  01
f3  38  02  31  01  c3  4b  05   00  a2  6b  81  d0  50  3d  e1
该运行分为
子运行1:21  48  06  24
子运行2:31  01  f3  aa  02
子运行3:31  01  0d  7a  fd
子运行4:31  01  f3  38  02
子运行5:31  01  c3  4b  05
以子运行1:“21  48  06  24”为例,“2”表示后面4个字节中后面2个字节是子运行的起始簇号,即子运行的起始簇号为“24 06”,“1”

表示前面的1个字节表示子运行的大小,即该子运行的大小为“48”。所以该文件数据实际是从起始扇区号为0x2406的地方,占用0x48个簇。接

下来是子运行2,运行2的簇号的起始位置为0x2406 + 0x02aaf3 = 0x2cef9。占用0x01个簇。接下来是子运行3,按照前面的理论,子运行3的起

始簇号应该是0x2cef9+0xfd7a0d。但是 0xfd7a0d的第一个字节为1(fd的首字节),证明此数为负数,所以不能简单的做加法,而应该取该数

的补数来计算。既,0xfd7a0d取反加1,得到0x2F5F2,所以运行3的起始扇区号为0x2cef9 - 0x285f3 = 0x4096。占用0x01个簇。依此类推直到

子运行之后为“00”时结束。

----------------------------------------------

针对于上面的子运行3起始簇号,我个人理解是这样。

第1种方法:

由于子运行3是0Xfd7a0d,最高位是1(即f的最高位是1),故应用0X1000000-0Xfd7a0d=0X285f3

再由子运行2的起始簇号减去上步骤得出的数:0x2cef9-0x285f3=0x4096

故子运行3起始位置是0x4096


第2种方法

由于子运行3是0Xfd7a0d,故最高位是1(即f的最高位),故先直接将子运行2与子运行3相加,即0X2cef9+0Xfd7a0d=0X1004906

再砍去最高位1(0X1004906去除第1位),即得到0x004906

故子运行3起始位置是0x4906


问题:如果运行中最高位大于等于8,即1000(最高位为1),是否就需要按以上方法进行操作呢?

该用户从未签到

23

主题

182

回帖

4134

积分

[INTOHARD]团长

Rank: 8Rank: 8

积分
4134
QQ
 楼主| 发表于 2009-8-25 10:45:56 | 显示全部楼层
没有人顶,自己先顶一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表