VHD无法在超级V中启动

时间:2013-03-08 08:09:49

标签: c++ windows virtualization vhd mbr

我正在为具有多个分区的磁盘创建动态vhd。

所涉及的步骤是

  1. 首先,我通过创建页眉和页脚并计算bat(块分配表)大小来创建VHD。

  2. 然后我使用win32 API获取磁盘大小和分区详细信息

  3. 我拍摄了卷的快照

  4. 我读取了父盘的mbr并覆盖了扇区偏移,然后我将带有多个分区的mbr写入VHD。

  5. 现在,对于每个卷影副本,我都会读取快照并写入VHD文件

  6. 此过程成功完成,然后我在diskmgmt.msc中打开vhd。它显示了两个分区,我可以看到这些分区中的数据。

  7. 现在我将此vhd复制到hyper V机器,然后创建一个新的vm并将此vhd添加到该机器。

  8. 当它启动时它会给我一个错误“磁盘读取错误”,但是当我将此vhd添加到现有操作系统并在启动加载程序中添加启动项时,它启动正常。

  9. 我不知道出了什么问题。如果有人来,请给我一些指示。

    以下是编写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++;
    
     }
    

    由于

1 个答案:

答案 0 :(得分:0)

DiscUtils提供了访问和编写与Hyper-V兼容的.VHD文件的参考

DiskFactory

开始,了解它如何构建VHD