虚拟硬盘映像格式规范中的错误?

时间:2016-11-23 09:13:24

标签: windows vhd

我想计算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(扇区偏移),这对应于文件偏移量0x1ce00(扇区偏移* 512),如果第二个父定位符以0x1c000结束,则表示正常。

但如果使用公式数据偏移+ 512 *数据空间,他最终会在父定位器中写入其他数据。 (但是,在这个例子中,没有数据损坏,因为平台数据长度非常小)

这是规范中的错误和句子

“平台数据空间:此字段存储存储父硬盘定位器所需的512字节扇区数。”

应该是

“平台数据空间:此字段存储存储父硬盘定位器所需的字节数。”?

1 个答案:

答案 0 :(得分: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.
 */