我有管理员权限,并且通过以下方式获取有效句柄并最终阅读整个硬盘驱动器没有问题:
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
。"
我已经尝试了所有我能想到的不同分区,不同选项等等,以便无法使用。
答案 0 :(得分:1)
我自己找到了答案。让我纠正自己指出CreateFile(@" \。\ Z:"正在打开一个卷,不一定是一个分区。但是,我甚至无法打开一个卷。
直到我将FILE_SHARE_WRITE添加到选项中,如下所示:
IntPtr handle = CreateFile(@" \。\ Z:",GENERIC_READ,FILE_SHARE_WRITE | FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
这是获得有效句柄的关键。这当然不直观!
为什么会出现这种情况只有微软知道。
答案 1 :(得分:0)
我想指出CreateFile
的文档说明FILE_SHARE_WRITE
以下内容:
在文件或设备上启用后续打开操作以请求写访问权。
否则,如果其他进程请求写访问权限,则无法打开文件或设备。
如果未指定此标志,但文件或设备已打开以进行写访问,或者具有带写访问权限的文件映射,该功能将失败。