Я хочу рассчитать конечное смещение родительского локатора в виртуальном жестком диске. Вот часть заголовка 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-байтовых секторов, необходимых для хранения локатора родительского жесткого диска».
должно быть
«Пространство данных платформы: в этом поле хранится количество байтов, необходимых для хранения локатора родительского жесткого диска».?
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