在 C 语言中,使用标准 Windows API,读取未格式化磁盘的最佳方法是什么?具体来说,我有一个 MMC 或者 SD卡 有数据,但没有文件系统(不是 FAT16,不是 FAT32,只是原始数据)。如果有一种简单的方法可以打开整个卡进行逐字节二进制访问,那就太好了。

谢谢!

有帮助吗?

解决方案

我会和

HANDLE drive = CreateFile(_T("\\.\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
// error handling
DWORD br = 0;
DISK_GEOMETRY dg;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_GEOMETRY, 0, 0, &dg, sizeof(dg), &br, 0);
//
LARGE_INTEGER pos;
pos.QuadPart = static_cast<LONGLONG>(sectorToRead) * dg.BytesPerSector;
SetFilePointerEx(drive, pos, 0, FILE_BEGIN);
const bool success = ReadFile(drive, sectorData, dg.BytesPerSector, &br) && br == dg.BytesPerSector;
//
CloseHandle(drive);

请注意,为了验证您是否已成功读取扇区,您必须验证读取的字节数是否与您想要读取的字节数相对应,即根据我的经验,即使没有读取任何字节(或者可能我只是有一个有问题的驱动程序),物理磁盘上的 ReadFile() 也可以返回 TRUE。

剩下的问题是确定您的驱动器号(我的示例中使用的 0 指的是 C:这可能不是你想要的)。我不知道该怎么做,但如果您只连接了一个未格式化的驱动器,则应该可以通过调用按顺序打开每个 PhysicalDrive 并调用 DeviceIOControl() 来实现 IOCTL_DISK_GET_DRIVE_LAYOUT_EX 作为命令:

DRIVE_LAYOUT_INFORMATION_EX dl;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, &dl, sizeof(dl), &br, 0);
if(dl.PartitionStyle == PARTITION_STYLE_RAW)
{
  // found correct disk
}

但这只是一个猜测。

其他提示

MSDN 上的 CreateFile 函数参考

向下滚动到“物理磁盘和卷” - 请注意,Vista 上的安全限制不适用于没有文件系统的卷,因此,即使在您给出的条件下,即使在 Vista 上,您也可以正常工作。

您必须使用以下命令打开设备文件 创建文件 然后使用 读文件/读取文件Ex. 。不要忘记关闭文件 关闭句柄

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top