我正在为具有多个分区的磁盘创建动态vhd。
所涉及的步骤是
首先,我通过创建页眉和页脚并计算bat(块分配表)大小来创建VHD。
然后我使用win32 API获取磁盘大小和分区详细信息
我拍摄了卷的快照
我读取了父盘的mbr并覆盖了扇区偏移,然后我将带有多个分区的mbr写入VHD。
现在,对于每个卷影副本,我都会读取快照并写入VHD文件
此过程成功完成,然后我在diskmgmt.msc中打开vhd。它显示了两个分区,我可以看到这些分区中的数据。
现在我将此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++;
}
由于