Я создаю динамический vhd для диска, имеющего несколько разделов.
Необходимые шаги:
Сначала я создаю VHD, создавая верхний и нижний колонтитулы и вычисляя размер bat (Block Allocation Table).
Затем я получаю информацию о размере диска и разделе с помощью Win32 API.
Я делаю снимки томов
Я читаю mbr родительского диска и перезаписываю смещения секторов, затем записываю mbr с несколькими разделами на VHD.
Теперь для каждой теневой копии я читаю снимок и записываю в файл VHD.
Этот процесс завершается успешно, и затем я открываю vhd в diskmgmt.msc. Он показывает оба раздела, и я могу видеть данные в этих разделах.
Теперь я копирую этот vhd на машину Hyper 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++;
}
Спасибо
mbr
переменную на диск? - person Gabe   schedule 08.03.2013