我正在为具有多个分区的磁盘创建动态 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++;
}
谢谢