2016-11-23 69 views
4

我想計算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字節扇區數。「

應該

「平臺數據空間:該字段存儲需要存儲父硬盤定位的字節數」?

+0

我的第一個猜想是,無論是顯示VHD頭你已經成倍平臺數據長度由512你需要看看頭的實際二進制內容確定。 –

+0

爲了提取標題信息,我使用了我自己的工具,但是我不會乘以任何東西。以下是十六進制編輯器的原始數據:'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

+0

當然看起來像是字節數而不是扇區數。這可能是規範中的一個錯誤,也可能是所涉及的VHD產生的任何軟件的錯誤;無論如何,只要最初保留的空間總是足夠的,它可能會被忽視。 –

回答

4

顯然微軟並不關心糾正自己的錯誤,這是已經被VirtualBox的開發商發現。 VHD.cpp包含了以下評論:

/* 
* The VHD spec states that the DataSpace field holds the number of sectors 
* required to store the parent locator path. 
* As it turned out VPC and Hyper-V store the amount of bytes reserved for the 
* path and not the number of sectors. 
*/