You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:01:04