gpt4 book ai didi

c++ - VHD 无法在 hyper V 中启动

转载 作者:行者123 更新时间:2023-12-03 07:48:59 25 4
gpt4 key购买 nike

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

涉及的步骤是

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

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

  3. 我拍摄卷快照

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

  5. 现在,对于每个卷影拷贝,我读取快照并写入 VHD 文件

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

  7. 现在我将此 vhd 复制到 hyper V 计算机,然后创建一个新虚拟机并将此 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++;

}

谢谢

最佳答案

DiscUtils提供访问和写入与 Hyper-V 兼容的 .VHD 文件的引用

看看它如何构建以 DiskFactory 开头的 VHD

关于c++ - VHD 无法在 hyper V 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15289405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com