|
---------------------------------------------
以下是取自本论坛另一坛友文章。
以下是小弟初学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),是否就需要按以上方法进行操作呢? |
|