Ошибка в спецификации формата образа виртуального жесткого диска?

Я хочу рассчитать конечное смещение родительского локатора в виртуальном жестком диске. Вот часть заголовка 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

Некоторые определения из Спецификации формата образа виртуального жесткого диска:

Смещение таблицы: в этом поле хранится абсолютное смещение в байтах таблицы распределения блоков (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-байтовых секторов, необходимых для хранения локатора родительского жесткого диска».

должно быть

«Пространство данных платформы: в этом поле хранится количество байтов, необходимых для хранения локатора родительского жесткого диска».?


person robert    schedule 23.11.2016    source источник
comment
Мое первое предположение будет заключаться в том, что то, что отображает заголовок VHD для вас, уже умножило длину данных платформы на 512. Вам нужно посмотреть на фактическое двоичное содержимое заголовка, чтобы быть уверенным.   -  person Harry Johnston    schedule 24.11.2016
comment
Для извлечения информации из заголовка я использовал свой собственный инструмент, но я ничего не умножаю. Вот необработанные данные из шестнадцатеричного редактора: 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).   -  person robert    schedule 24.11.2016
comment
Конечно, похоже, что это количество байтов, а не количество секторов. Это может быть ошибка в спецификациях или ошибка со стороны какого-либо программного обеспечения, сгенерировавшего рассматриваемый виртуальный жесткий диск; в любом случае это, вероятно, осталось бы незамеченным, если бы изначально зарезервированного пространства всегда было достаточно.   -  person Harry Johnston    schedule 24.11.2016
comment
Есть ли инструмент MS, который изменяет содержимое родительского локатора жесткого диска для существующего виртуального жесткого диска? Если это так, он должен отказаться делать это, если пространство данных недостаточно велико для новых данных, поэтому, возможно, вы могли бы использовать двоичный редактор, чтобы изменить поле пространства данных для виртуального жесткого диска на 1 и посмотреть, интерпретирует ли инструмент это как достаточно места для 512 байт данных или достаточно места для 1 байта данных. :-)   -  person Harry Johnston    schedule 24.11.2016


Ответы (1)


Очевидно, 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.
 */
person robert    schedule 24.11.2016