【问题标题】:Using CreateFile To Access a Drive Partition使用 CreateFile 访问驱动器分区
【发布时间】:2015-03-13 18:46:48
【问题描述】:

我有管理员权限,并且可以通过以下方式获取有效句柄并最终读取整个硬盘驱动器:

IntPtr handle = CreateFile(@"\\.\PHYSICALDRIVE1", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

当我尝试打开该驱动器的目录时,我也可以获得一个有效的句柄:

IntPtr handle = CreateFile(@"\\.\Z:\\", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

但是当我尝试简单地打开该驱动器的分区时,我无法获得有效的句柄:

IntPtr handle = CreateFile(@"\\.\Z:", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

GetLastWin32Error 返回拒绝访问 (5)。

当然,如果我使驱动器脱机,我会得到“The system cannot find the file specified”。 我已经尝试了所有我能想到的不同分区、不同选项等的方法,但都没有。

【问题讨论】:

  • 嘿,你找到打开驱动器分区的方法了吗?

标签: c++ winapi createfile


【解决方案1】:

我自己找到了答案。让我纠正自己指出 CreateFile(@"\.\Z:" 正在打开一个卷,不一定是一个分区。但是,我什至无法打开一个卷。

直到我将 FILE_SHARE_WRITE 添加到选项中,如下所示:

IntPtr 句柄 = CreateFile(@"\.\Z:", GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

这是获得有效句柄的关键。这当然不直观!

我猜只有微软知道为什么会这样。

【讨论】:

  • 可能有错别字,文件名应该是´@"\\.\Z:"´ 此外,我发现在驱动器后省略尾部斜杠很重要(!!)字母“C:”不是“C:\”
【解决方案2】:

我想指出CreateFile 的文档中关于FILE_SHARE_WRITE 的内容如下:

启用对文件或设备的后续打开操作以请求写入访问权限。

否则,如果其他进程请求写访问权限,则无法打开文件或设备。

如果未指定此标志,但文件或设备已打开以进行写访问或具有可写访问的文件映射,则函数失败

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2013-09-10
    • 2022-11-29
    • 2023-03-02
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多