2013-03-08 61 views
0

我正在为有多个分区的磁盘创建一个动态vhd。VHD无法在超V启动V

涉及的步骤

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

  2. 然后我使用Win32 API

  3. 我带卷

  4. 我读父磁盘的MBR的快照,并改写行业偏移,然后我写的多分区的MBR获得磁盘的大小和分区的详细信息VHD。

  5. 现在,每一个卷影副本我读快照和写入VHD文件

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

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

  8. 它启动时会给我一个错误“磁盘读取错误”,但是当我将此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++; 

} 

感谢

+0

你的代码在哪里? – Gabe 2013-03-08 08:14:32

+0

我ahove发布代码写入mbr – singh 2013-03-08 08:43:07

+0

你在哪里写你的'mbr'变量到磁盘? – Gabe 2013-03-08 09:44:51

回答

0

DiscUtils提供访问和写入.VHD参考使用Hyper-V文件兼容

看一看它是如何建立up VHD起始于DiskFactory

相关问题