首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FSCTL_LOCK_VOLUME在挂载VHD上的ERROR_ACCESS_DENIED失败

FSCTL_LOCK_VOLUME在挂载VHD上的ERROR_ACCESS_DENIED失败
EN

Stack Overflow用户
提问于 2011-07-23 19:46:17
回答 1查看 2.3K关注 0票数 1

我正在编写一个将FreeDOS安装到虚拟硬盘上的程序。它生成并执行一个DiskPart脚本来创建VHD、划分它、格式化它,然后给它分配一个驱动器号。

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

问题是:DeviceIoControl返回ERROR_ACCESS_DENIED,这意味着卷上有打开的文件。但是,我的安装程序一旦完成复制,就会关闭每个文件,所以我不知道还会有什么原因造成这种情况。这与DiskPart如何安装VHD有关吗?

示例DiskPart脚本

代码语言:javascript
运行
复制
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代码

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2011-07-23 21:41:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6802884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档