读取未格式化的数据
时间:2020-03-05 18:58:04 来源:igfitidea点击:
在C中,使用标准的Windows API,读取未格式化磁盘的最佳方法是什么?具体来说,我有一个带有数据的MMC或者SD卡,但是没有文件系统(不是FAT16,不是FAT32,只是原始数据)。如果有一种简单的方法可以打开整个卡以逐字节进行二进制访问,那将是很好的。
谢谢!
解决方案
回答
我们必须使用CreateFile打开设备文件,然后使用ReadFile / readFileEx。别忘了用CloseHandle关闭文件
回答
MSDN上的CreateFile函数参考
向下滚动到" Physical Disks and Volumes"(物理磁盘和卷),请注意Vista上的安全限制不适用于没有文件系统的voulmes,因此即使在给定的条件下在Vista上也可以。
回答
我会去
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并使用`IOCTL_DISK_GET_DRIVE_LAYOUT_EX'作为命令调用DeviceIOControl()来实现:
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 }
但这只是一个猜测。