複数のパーティションを持つディスクの動的 vhd を作成しています。
必要な手順は次のとおりです。
まず、ヘッダーとフッターを作成し、バット (ブロック割り当てテーブル) のサイズを計算して VHD を作成します。
次に、win32 API を使用してディスク サイズとパーティションの詳細を取得します
ボリュームのスナップショットを作成します
親ディスクの mbr を読み取り、セクター オフセットを上書きしてから、複数のパーティションを含む mbr を VHD に書き込みます。
シャドウ コピーごとに、スナップショットを読み取り、VHD ファイルに書き込みます
このプロセスは正常に完了し、diskmgmt.msc で vhd を開きます。両方のパーティションが表示され、それらのパーティションのデータを確認できます。
次に、この vhd を hyper V マシンにコピーしてから、新しい vm を作成し、この vhd をそのマシンに追加します。
起動すると「ディスク読み取りエラー」というエラーが表示されますが、このvhdを既存のOSに追加し、ブートローダーにブートエントリを追加すると、正常に起動します。
何がうまくいかないのかわかりません。もし誰かが来たら、私にいくつかの指針を教えてください。
ここに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++;
}
ありがとう