安装的VHD上的FSCTL_LOCK_VOLUME失败并显示ERROR_ACCESS_DENIED

时间:2011-07-23 19:46:18

标签: c windows vhd deviceiocontrol

我正在开发一个将FreeDOS安装到虚拟硬盘上的程序。它生成并执行DiskPart脚本来创建VHD,对其进行分区,格式化,然后为其分配驱动器号。

这很好用。我的安装程序将所有内容复制到VHD,但现在我需要编写引导扇区,这需要直接访问卷。在开始此过程之前,我尝试使用FSCTL_LOCK_VOLUME锁定卷。

问题是:DeviceIoControl返回ERROR_ACCESS_DENIED,(根据MSDN)表示卷上有文件打开。但是我的安装程序在完成复制后会关闭每个文件,因此我不确定还有什么可能导致这个问题。它与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);

1 个答案:

答案 0 :(得分:0)

这并没有真正回答你的问题,但实际上最好直接创建VHD ,然后安装它。 VHD是一种简单的简单格式,您可以编写一个程序来直接创建一个已经预先编写的引导加载程序的VHD(即只使用CreateFile / WriteFile),然后挂载它并创建一个文件系统。