2008-09-17 71 views
2

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

谢谢!

回答

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()也会返回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 
} 

但这只是一个猜测。

1

CreateFile function reference on MSDN

滚动关闭文件到“物理磁盘和卷” - 注意,Vista的安全性限制,没有一个文件系统不申请voulmes,所以你会被罚款即使在Vista下,您所提供的条件也是如此。