我想計算VHD中父定位器的結束偏移量。下面是VHD頭的一部分:虛擬硬盤映像格式規範中的錯誤?
Cookie: cxsparse
Data offset: 0xffffffffffffffff
Table offset: 0x2000
Header version: 0x00010000
Max table entries: 10240
Block size: 0x200000
Checksum: 4294956454
Parent Unique Id: 0x9678bf077e719640b55e40826ce5d178
Parent time stamp: 525527478
Reserved: 0
Parent Unicode name:
Parent locator 1:
- platform code: 0x57326b75
- platform_data_space: 4096
- platform_data_length: 86
- reserved: 0
- platform_data_offset: 0x1000
Parent locator 2:
- platform code: 0x57327275
- platform_data_space: 65536
- platform_data_length: 34
- reserved: 0
- platform_data_offset: 0xc000
從Virtual Hard Disk Image Format Specification一些定義:
「表偏移:該字段存儲絕對字節的文件中的塊分配表(BAT)的偏移 平臺數據空間:此字段存儲到存儲父硬盤定位需要512字節扇區的數量 平臺數據偏移:該字段將絕對文件中的字節偏移所在平臺的特定文件定位數據存儲 平臺數據。長度。該字段以字節爲單位存儲父硬盤定位器的實際長度。「
在此基礎上的端部的兩個上級定位器的偏移應爲: 數據偏移+ 512個*數據空間:
0x1000 + 512 * 4096 = 0x201000
0xc000 + 512 * 65536 = 0x200c000
但是,如果一個僅使用數據偏移+數據空間:
0x1000 + 4096 = 0x2000 //end of parent locator 1, begin of BAT
0xc000 + 65536 = 0x1c000
後一種計算更有意義:第一個父定位符的結尾是BAT的開始(請參閱上面的標題數據);並且由於第一個BAT入口是0xe7(扇區偏移量),因此如果第二個父定位符結束於0x1c000,則這對應於文件偏移量0x1ce00(扇區偏移量* 512),這是正常的。
但是,如果一個使用公式數據偏移+ 512 *數據空間,他結束了具有寫在母定位器的其它數據。 (但是,在這個例子中就沒有數據損壞,因爲平臺數據長度很小)
因此,這是在規範中的錯誤,句子
「平臺數據空間:此字段存儲的存儲父硬盤定位器所需的512字節扇區數。「
應該
「平臺數據空間:該字段存儲需要存儲父硬盤定位的字節數」?
我的第一個猜想是,無論是顯示VHD頭你已經成倍平臺數據長度由512你需要看看頭的實際二進制內容確定。 –
爲了提取標題信息,我使用了我自己的工具,但是我不會乘以任何東西。以下是十六進制編輯器的原始數據:'57 32 6B 75 00 00 10 00 00 00 00 54 00 00 00 00 00 00 00 00 00 00 10 00 57 32 72 75 00 01 00 00'。在平臺代碼0x57326b75(W2ku)跟隨0x1000(4096)並且在0x57327275(W2ru)跟隨0x10000(65536)之後。 – robert
當然看起來像是字節數而不是扇區數。這可能是規範中的一個錯誤,也可能是所涉及的VHD產生的任何軟件的錯誤;無論如何,只要最初保留的空間總是足夠的,它可能會被忽視。 –