如何通过Win32 API在不锁定/卸载卷的情况下读取原始磁盘?
如何通过Win32 API直接读取磁盘/卷(无需锁定/卸载)?
首先明确:你用MSVC的fopen("\\\\.\\D:", "rb")能读取磁盘,根本不是什么特殊操作——fopen底层就是封装了Win32的CreateFile API。直接用Win32原生API完全能实现同样的效果,而且确实不需要锁定或卸载卷,只要满足两个条件:以只读方式打开,并且设置正确的共享访问权限。
具体实现代码
下面是用Win32 API直接读取卷第一个字节的示例:
#include <windows.h> #include <stdio.h> int main() { // 打开D盘卷,注意路径是宽字符格式 HANDLE hDisk = CreateFile( L"\\\\.\\D:", GENERIC_READ, // 只读权限,避免高权限要求 FILE_SHARE_READ | FILE_SHARE_WRITE, // 允许其他进程同时读写,不独占 NULL, OPEN_EXISTING, // 必须用这个参数打开已存在的卷/磁盘 FILE_ATTRIBUTE_NORMAL, NULL ); if (hDisk == INVALID_HANDLE_VALUE) { printf("打开磁盘失败,错误码:%lu\n", GetLastError()); return 1; } BYTE firstByte; DWORD bytesRead; // 读取第一个字节 if (ReadFile(hDisk, &firstByte, 1, &bytesRead, NULL) && bytesRead == 1) { printf("D盘第一个字节:0x%02X\n", firstByte); } else { printf("读取失败,错误码:%lu\n", GetLastError()); } CloseHandle(hDisk); return 0; }
关键参数说明
- 路径格式:
\\\\.\\D:是Win32中访问逻辑卷的标准命名格式,和fopen用的路径完全一致,双反斜杠是转义后的结果 - 共享权限:
FILE_SHARE_READ | FILE_SHARE_WRITE是核心——它允许其他进程(包括系统)同时访问这个卷,所以你能正常使用C盘的同时,用HxD或自己的程序读取内容,不会出现独占锁定的情况 - 打开方式:
OPEN_EXISTING是打开磁盘/卷的必填参数,不能用CREATE_NEW或CREATE_ALWAYS
为什么不需要锁定/卸载卷?
网上有些答案提到锁定卷,那是针对写入操作或者需要独占访问的场景。如果只是只读访问,并且设置了正确的共享模式,Windows允许在卷正常挂载的情况下直接读取,不需要卸载或锁定——这就是HxD能无缝打开C盘的原因,它也是用同样的只读+共享模式来访问磁盘的。
内容的提问来源于stack exchange,提问作者Schilive
相关产品推荐
相关产品推荐

