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

FAT32 SD卡根扇区损坏,Windows 10+如何读取单个扇区?

在Windows 10及以上系统读取块设备单个扇区的方法

一、定位目标SD卡的设备路径

Windows中块设备以设备路径标识,SD卡这类可移动存储的路径格式为 \\.\PhysicalDriveN,其中N是磁盘编号(从0开始)。

  • 获取磁盘编号的方式:
    • 手动打开磁盘管理(右键「此电脑」→「管理」→「磁盘管理」),找到目标SD卡对应的磁盘编号(如「磁盘1」「磁盘2」)。
    • 若需程序自动枚举,可通过CreateFile结合DeviceIoControl调用IOCTL_DISK_GET_DRIVE_GEOMETRY_EX接口遍历设备。

二、用Win32 API读取单个扇区

核心流程是打开设备、获取扇区参数、定位并读取目标扇区,具体实现如下:

1. 打开块设备

调用CreateFile时需指定正确的权限与标志,绕开系统缓存直接访问硬件:

HANDLE hDevice = CreateFile(
    L"\\\\.\\PhysicalDrive1",  // 替换为目标磁盘的编号
    GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE,  // 允许其他进程共享访问
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,  // 禁用缓存,直接读写硬件
    NULL
);
if (hDevice == INVALID_HANDLE_VALUE) {
    // 通过GetLastError()获取错误码,处理权限不足或设备不存在等问题
    return;
}

2. 获取设备扇区大小

不同设备扇区大小可能为512字节或4096字节,需先通过DeviceIoControl获取:

DISK_GEOMETRY_EX dgEx = {0};
DWORD bytesReturned = 0;
BOOL success = DeviceIoControl(
    hDevice,
    IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
    NULL,
    0,
    &dgEx,
    sizeof(dgEx),
    &bytesReturned,
    NULL
);
if (!success) {
    CloseHandle(hDevice);
    // 处理错误
    return;
}
DWORD sectorSize = dgEx.Geometry.BytesPerSector;

3. 读取指定扇区

通过SetFilePointerEx定位到目标扇区,再用ReadFile读取数据。注意缓冲区需对齐到扇区大小:

// 计算目标扇区的字节偏移:扇区号 × 扇区大小
LARGE_INTEGER offset = {0};
offset.QuadPart = (LONGLONG)targetSector * sectorSize;  // targetSector为要读取的扇区号

// 设置读取位置
if (!SetFilePointerEx(hDevice, offset, NULL, FILE_BEGIN)) {
    CloseHandle(hDevice);
    // 处理错误
    return;
}

// 分配对齐的缓冲区(FILE_FLAG_NO_BUFFERING要求缓冲区对齐)
BYTE* pBuffer = (BYTE*)VirtualAlloc(
    NULL,
    sectorSize,
    MEM_COMMIT | MEM_RESERVE,
    PAGE_READWRITE
);
if (!pBuffer) {
    CloseHandle(hDevice);
    // 处理内存分配失败
    return;
}

DWORD bytesRead = 0;
success = ReadFile(
    hDevice,
    pBuffer,
    sectorSize,
    &bytesRead,
    NULL
);
if (success && bytesRead == sectorSize) {
    // pBuffer中即为目标扇区的原始数据,可进行后续分析
} else {
    // 读取失败,处理错误
}

// 释放资源
VirtualFree(pBuffer, 0, MEM_RELEASE);
CloseHandle(hDevice);

三、关键注意事项

  • 管理员权限:程序必须以管理员权限运行,否则CreateFile会返回权限错误。
  • 扇区对齐:使用FILE_FLAG_NO_BUFFERING时,缓冲区大小、读取偏移必须是扇区大小的整数倍,否则ReadFile会失败。
  • 错误处理:每个API调用后务必检查返回值,通过GetLastError()获取具体错误信息,便于排查问题。

内容的提问来源于stack exchange,提问作者AxD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:35:05