C++ 使用CreateFile访问驱动器分区

C++ 使用CreateFile访问驱动器分区,c++,winapi,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_EXIST

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

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);
但是,当我试图简单地打开该驱动器的分区时,无法获得有效的句柄:

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:”正在打开一个卷,不一定是一个分区。但是,我甚至无法打开一个卷

直到我将文件\u共享\u写入选项,如下所示:

IntPtr handle=CreateFile(@“\.\Z:”,泛型读取,文件共享写入;文件共享读取,0,打开现有,0,0)

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


为什么会出现这种情况,我想只有微软知道。

我想指出,
CreateFile
的文档中提到了以下关于
文件共享\u写入的内容:

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

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

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


嘿,你找到打开驱动器分区的方法了吗?可能是打字错误,文件名应该是`@“\\\.\Z:`。此外,我发现重要的是(!!)在驱动器字母'C:'后省略一个尾随斜杠,而不是'C:\'