C++ VHD未在hyper V中启动
我正在为具有多个分区的磁盘创建动态vhd 所涉及的步骤包括C++ VHD未在hyper V中启动,c++,windows,virtualization,vhd,mbr,C++,Windows,Virtualization,Vhd,Mbr,我正在为具有多个分区的磁盘创建动态vhd 所涉及的步骤包括 首先,我通过创建页眉和页脚并计算bat(块分配表)大小来创建VHD 然后我使用win32 API获取磁盘大小和分区详细信息 我拍摄卷的快照 我读取父磁盘的mbr并覆盖扇区偏移量,然后将带有多个分区的mbr写入VHD 现在,对于每个卷影副本,我读取快照并写入VHD文件 此过程成功完成,然后我在diskmgmt.msc中打开vhd。它显示了两个分区,我可以看到这些分区中的数据 现在我将这个vhd复制到hyper V机器上,然后创建一个新的v
/* 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的第一个数据块*/
字节零扇区[512]={0};
零扇区[0]=0x80;
断言(0!=WriteFile(hFile,零扇区,512,&nwrited,NULL));/*这是第一个块的块位图*/
零扇区[0]=0x00;
unint16 mcount=0;
unint64 indexOffset=0;
memcpy(&mbr,mbrbuff,512);
for(vector::iterator pTemp=pPart.begin();pTemp!=pPart.end();pTemp++)
{
mbr.partition[mcount].type=0x07;
mbr.partition[mcount].start_扇区=4096+indexOffset;
mbr.signature=0xAA55;
mbr.partition[mcount].total_sectors=((*pTemp)->total_sectors))+1;
指数偏移量+=((*pTemp)->总扇区数))+1;
//如果(mcount==0)
//indexOffset+=((*pTemp)->起始扇区)/512);
mcount++;
}
感谢为访问和写入与Hyper-V兼容的.VHD文件提供了参考
看看它是如何构建一个VHD的,从我已经发布了写mbr的代码开始,你在哪里把你的
mbr
变量写到磁盘上?因为VHD偏移量是1536字节+sizeof(块分配表)字节+512字节,对于位图,在这个偏移量我在VHD文件中写mbr