虚拟硬盘镜像格式规范有误?
Mistake in Virtual Hard Disk Image Format Specification?
我想计算 VHD 中 parent 定位器的结束偏移量。这是 VHD 的一部分 header:
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 的一些定义:
"Table偏移量:该字段存储文件中Block Allocation Table(BAT)的绝对字节偏移量。
Platform Data Space:该字段存储存储parent硬盘定位符所需的512字节扇区数。
平台数据偏移量:此字段存储绝对文件偏移量(以字节为单位),其中存储了平台特定文件定位器数据。
平台数据长度。该字段以字节为单位存储 parent 硬盘定位器的实际长度。"
基于此,两个 parent 定位器的结束偏移量应为:
数据偏移量 + 512 * 数据 space:
0x1000 + 512 * 4096 = 0x201000
0xc000 + 512 * 65536 = 0x200c000
但是如果只使用数据偏移+数据space:
0x1000 + 4096 = 0x2000 //end of parent locator 1, begin of BAT
0xc000 + 65536 = 0x1c000
后一种计算更有意义:第一个 parent 定位符的结尾是 BAT 的开头(参见上面的 header 数据);并且由于第一个 BAT 条目是 0xe7(扇区偏移量),这对应于文件偏移量 0x1ce00(扇区偏移量 * 512),如果第二个 parent 定位器在 0x1c000.
结束,这是可以的
但如果使用公式数据偏移量 + 512 * 数据 space,他最终会将其他数据写入 parent 定位器。 (但是,在这个例子中不会有数据损坏,因为平台数据长度非常小)
所以这是规范中的错误吗,句子
"Platform Data Space: This field stores the number of 512-byte sectors needed to store the parent hard disk locator."
应该是
"Platform Data Space: This field stores the number of bytes needed to store the parent hard disk locator."?
显然 Microsoft 并不关心纠正他们的错误,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.
*/
我想计算 VHD 中 parent 定位器的结束偏移量。这是 VHD 的一部分 header:
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 的一些定义:
"Table偏移量:该字段存储文件中Block Allocation Table(BAT)的绝对字节偏移量。 Platform Data Space:该字段存储存储parent硬盘定位符所需的512字节扇区数。 平台数据偏移量:此字段存储绝对文件偏移量(以字节为单位),其中存储了平台特定文件定位器数据。 平台数据长度。该字段以字节为单位存储 parent 硬盘定位器的实际长度。"
基于此,两个 parent 定位器的结束偏移量应为: 数据偏移量 + 512 * 数据 space:
0x1000 + 512 * 4096 = 0x201000
0xc000 + 512 * 65536 = 0x200c000
但是如果只使用数据偏移+数据space:
0x1000 + 4096 = 0x2000 //end of parent locator 1, begin of BAT
0xc000 + 65536 = 0x1c000
后一种计算更有意义:第一个 parent 定位符的结尾是 BAT 的开头(参见上面的 header 数据);并且由于第一个 BAT 条目是 0xe7(扇区偏移量),这对应于文件偏移量 0x1ce00(扇区偏移量 * 512),如果第二个 parent 定位器在 0x1c000.
结束,这是可以的但如果使用公式数据偏移量 + 512 * 数据 space,他最终会将其他数据写入 parent 定位器。 (但是,在这个例子中不会有数据损坏,因为平台数据长度非常小)
所以这是规范中的错误吗,句子
"Platform Data Space: This field stores the number of 512-byte sectors needed to store the parent hard disk locator."
应该是
"Platform Data Space: This field stores the number of bytes needed to store the parent hard disk locator."?
显然 Microsoft 并不关心纠正他们的错误,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.
*/