【问题标题】:Reading Unformatted Data读取无格式数据
【发布时间】:2010-09-09 23:28:42
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c windows disk


    【解决方案1】:

    我会去

    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
    }
    

    但这只是猜测。

    【讨论】:

      【解决方案2】:

      CreateFile function reference on MSDN

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

      【讨论】:

        【解决方案3】:

        您必须使用CreateFile 打开设备文件,然后使用ReadFile/readFileEx。不要忘记用CloseHandle关闭文件

        【讨论】:

          猜你喜欢
          • 2019-08-26
          • 2012-08-13
          • 2016-01-06
          • 2020-11-20
          • 1970-01-01
          • 2016-05-19
          • 1970-01-01
          • 2012-08-20
          • 2014-06-12
          相关资源
          最近更新 更多