c++ - 使用 CreateFile 访问驱动器分区

标签 c++ winapi createfile

我拥有管理员权限,可以毫无问题地获得有效句柄并最终通过以下方式读取整个硬盘:

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)。

当然,如果我使驱动器脱机,则会收到“系统找不到指定的文件”。 我已经尝试了所有我能想到的不同分区、不同选项等,但都没有。

最佳答案

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

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

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

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

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

关于c++ - 使用 CreateFile 访问驱动器分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27962353/

相关文章:

c++ - 旧代码不能用新的 CGAL 版本编译(错误 : invalid application of ‘sizeof’ )

c++ - 每个层次结构的单独单例继承

c++ - 我们能把这样的结构变成类型化的类/函数吗?

c++ - 类 Vector2 最终 : shared_ptr<Vector2> correct or not (Updated! )

winapi - 给定一个 HBITMAP,有没有办法找出它是否包含 alpha channel ?

c++ - NetShareEnum (..) winapi 无法删除不必要的共享文件夹

iphone - 可以在 Windows 中使用 CreateFile 以编程方式从 iPhone 读取图像吗?

c++ - 文件大小比应有的大,添加了额外的新行

command-line - MacVim:使用 `alias mvim="open -a macvim"` 从命令行创建新文件

windows - 为什么此 CreateFile() 调用会导致 Windows 8 出现蓝屏?