Я создаю динамический VHD для диска, имеющего несколько разделов.
Шаги включают
Сначала я создаю VHD, создавая верхний и нижний колонтитулы и вычисляя размер bat (Таблица размещения блоков).
Затем я получаю информацию о размере диска и разделе с помощью Win32 API
Я делаю снимки томов
Я читаю mbr родительского диска и перезаписываю смещения секторов, затем пишу mbr с несколькими разделами на VHD.
Теперь для каждой теневой копии я читаю снимок и записываю в VHD файл
Этот процесс завершается успешно, а затем я открываю VHD в diskmgmt.msc. Он показывает оба раздела, и я могу видеть данные в этих разделах.
Теперь я копирую этот VHD на машину с гипер V, а затем создаю новый VM и добавляю этот VHD на этот компьютер.
Когда он запускается, он выдает ошибку «Ошибка чтения диска», но когда я добавляю этот VHD в существующую ОС и добавляю загрузочную запись в загрузчик, он загружается нормально.
Я не знаю, что происходит не так. Если кто-нибудь пришел, дай мне несколько советов.
Вот код, чтобы написать mbr
/* Stream out the first data block which contains only the MBR */
BYTE zerosector[512] = {0};
zerosector[0] = 0x80;
assert(0 != WriteFile(hFile, zerosector, 512, &nWritten, NULL)); /* here goes the first block's block bitmap */
zerosector[0] = 0x00;unint16 mcount = 0;
unint64 indexOffset = 0;
memcpy(&mbr,mbrbuff,512);
for(vector<PartOffset*>::iterator pTemp = pPart.begin();pTemp!=pPart.end();pTemp++)
{
mbr.partition[mcount].type = 0x07;
mbr.partition[mcount].start_sector = 4096 + indexOffset ;
mbr.signature = 0xAA55;
mbr.partition[mcount].total_sectors = (((*pTemp)->total_sectors)) + 1 ;
indexOffset += ((((*pTemp)->total_sectors))) + 1;
//if(mcount==0)
// indexOffset += ((((*pTemp)->start_sector)/512) );
mcount++;
}
Спасибо
DiscUtils предоставляет ссылку для доступа и записи файлов .VHD, совместимых с Hyper-V
Посмотрите, как он создает VHD, начиная с DiskFactory
Других решений пока нет …