Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VHD未在hyper V中启动_C++_Windows_Virtualization_Vhd_Mbr - Fatal编程技术网

C++ VHD未在hyper V中启动

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

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

所涉及的步骤包括

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

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

  • 我拍摄卷的快照

  • 我读取父磁盘的mbr并覆盖扇区偏移量,然后将带有多个分区的mbr写入VHD

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

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

  • 现在我将这个vhd复制到hyper V机器上,然后创建一个新的vm并将这个vhd添加到那个机器上

  • 当它启动时,它会给我一个错误“Disk read error”,但当我将这个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的第一个数据块*/
    字节零扇区[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