1

FreeDOS を仮想ハードディスクにインストールするプログラムを開発中です。DiskPart スクリプトを生成および実行して、VHD を作成し、パーティション分割し、フォーマットしてから、ドライブ文字を割り当てます。

これはうまくいきます。インストーラーはすべてを VHD にコピーしますが、ボリュームに直接アクセスする必要があるブート セクターを書き込む必要があります。このプロセスを開始する前に、FSCTL_LOCK_VOLUME でボリュームをロックしようとします。

問題は次のとおりです。これは、(MSDN によると) ボリューム上で開いているファイルがあることを意味しますDeviceIoControlERROR_ACCESS_DENIEDしかし、インストーラーはコピーが完了するとすべてのファイルを閉じるため、他に何が原因なのかわかりません。DiskPart が VHD をマウントした方法と関係がありますか?

サンプル DiskPart スクリプト

create vdisk file=E:\Dev\freedos.vhd maximum=128 type=fixed
select vdisk file=E:\Dev\freedos.vhd
attach vdisk
create partition primary
select partition 1
format quick fs=FAT
assign letter=A

注: ファイル パス、ディスク サイズ、ファイル システム、およびドライブ文字の値は、プログラムに指定されたオプションによって異なります。

C コード

HANDLE volume;
char volName[MAX_PATH];
DWORD bytesReturned;

if (!GetVolumeNameForVolumeMountPoint(config.volRoot, volName, sizeof(volName)))
    ThrowError(1, "Failed to get volume name (error %d)!", GetLastError());

/*
* CreateFile will fail if the volume name has a trailing backslash
*/
PathRemoveBackslash(volName);

volume = CreateFile(volName, (GENERIC_READ | GENERIC_WRITE),
    (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

if (volume == INVALID_HANDLE_VALUE)
    ThrowError(1, "Failed to open installation volume (error %d)!", GetLastError());

if (!DeviceIoControl(volume, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &bytesReturned, NULL))
    ThrowError(1, "Failed to lock installation volume (error %d)!", GetLastError());

CloseHandle(volume);
4

1 に答える 1

0

これは実際にはあなたの質問に答えるものではありませんが、実際には最初に VHD を直接作成してからマウントする方が良いかもしれません。VHD は非常に単純な形式です。おそらく、事前に作成されたブートローダー (つまり、CreateFile/WriteFile を使用するだけ) を使用して VHD を直接作成するプログラムを作成し、それをマウントしてファイルシステムを作成することができます。

于 2011-07-23T21:41:28.270 に答える