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
相关产品推荐
相关产品推荐

