使用 CreateFile 访问驱动器分区
Using CreateFile To Access a Drive Partition
我有管理员权限,可以毫无问题地获得有效的句柄并最终通过以下方式读取整个硬盘驱动器:
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
"。我已经尝试了我能想到的所有不同分区、不同选项等,但没有可用。
我自己找到了答案。 让我纠正自己指出 CreateFile(@"\.\Z:" 正在打开一个卷,不一定是一个分区。 但是,我什至无法打开卷。
直到我FILE_SHARE_WRITE添加到选项中,如下所示:
IntPtr 句柄 = CreateFile(@"\.\Z:", GENERIC_READ, FILE_SHARE_WRITE |FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
这是获得有效句柄的关键。 这当然不直观!
为什么会这样,我猜只有Microsoft知道。
我想
指出的是,CreateFile
的文档对FILE_SHARE_WRITE
有以下说明:
允许对文件或设备执行后续打开操作以请求写入访问权限。
否则,如果其他进程请求写入访问权限,则无法打开文件或设备。
如果未指定此标志,但文件或设备已打开以进行写入访问,或者具有具有写入访问权限的文件映射,则该函数将失败。
相关文章:
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 在QTreeView中仅显示共享驱动器和文件夹
- 按字母顺序对C++问题中的子字符串索引进行分区
- 如何查找集合的所有分区 (C++)
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 使用指针在分区函数中实现随机分区点
- Coursera DSA 算法工具箱第 4 周第 2 个问题 - 分区纪念品
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 对多个(可能)重叠范围进行分区的最简单算法
- 如何在MacOS(sierra-catalina)上获取分区的可用空间
- 并行快速排序分区中的隔离错误
- QT MYSQL 驱动器构建,未定义对"mysql_get_client_version@0"的引用
- C++年分区综述
- 实现 3 路分区以实现快速排序
- 驱动器/分区和Windows API中唯一的驱动器ID
- 使用 CreateFile 访问驱动器分区
- 如何在没有 Windows 分配驱动器号的情况下创建分区
- [Qt][Linux]列出驱动器或分区
- 如何使用C++将包含多个分区的映像写入Windows上的USB闪存驱动器