在C中,使用标准Windows API,读取未格式化磁盘的最佳方法是什么?具体来说,我有MMC或SD card数据,但没有文件系统(不是FAT16,不是FAT32,只是原始数据)。如果有一种简单的方法可以打开整个卡进行逐字节二进制访问,那就太棒了。
谢谢!
答案 0 :(得分:4)
我会选择
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()可以返回即使没有读取字节也是正确的(或者我只是有一个错误的驱动程序)。
剩下的问题是确定你的驱动器号码(我的例子中使用的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
}
但这只是猜测。
答案 1 :(得分:1)
您必须使用CreateFile打开设备文件,然后使用ReadFile / readFileEx。不要忘记使用CloseHandle
关闭文件答案 2 :(得分:1)
CreateFile function reference on MSDN
向下滚动到“Physical Disks and Volumes” - 请注意Vista上的安全限制不适用于没有文件系统的voulmes,所以即使在Vista上你也可以在你提供的条件下使用。