【发布时间】:2013-02-23 17:26:13
【问题描述】:
我正在为具有多个分区的磁盘创建动态 vhd。
涉及的步骤是
首先我通过创建页眉和页脚并计算 bat(块分配表)大小来创建 VHD。
然后我使用 win32 API 获取磁盘大小和分区详细信息
我拍摄卷的快照
我读取父磁盘的 mbr 并覆盖扇区偏移量,然后将具有多个分区的 mbr 写入 VHD。
现在对于每个卷影副本,我读取快照并写入 VHD 文件
此过程成功完成,然后我在 diskmgmt.msc 中打开 vhd。它显示了两个分区,我可以看到这些分区中的数据。
现在我将此 vhd 复制到 hyper V 机器,然后创建一个新 vm 并将此 vhd 添加到该机器。
当它启动时,它给我一个错误“磁盘读取错误”,但是当我将此 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 的代码
-
你在哪里把你的
mbr变量写到磁盘上? -
对于 vhd 偏移量是 1536 字节 + sizeof(块分配表)以字节为单位 + 512 字节对于位图,在这个偏移量我将 mbr 写入 vhd 文件
标签: c++ windows virtualization vhd mbr