本帖最后由 great82149 于 2014-10-26 11:54:08 编辑

解决方案 »

  1.   

    FAT32的数据区起始位置不是0, 读取前要额外计算
    包括保留扇区, FAT, ....等参考BOOL CDiskFile::ReadDiskCluster(LARGE_INTEGER llFirstCluster, LARGE_INTEGER llCount, BYTE *pBuf)
    {
    LARGE_INTEGER llOffset;
    LARGE_INTEGER llReadCount;
    DWORD dwRetVal;
    BOOL bResult;
    DWORD dwReadSize; bResult = FALSE;
    llOffset.QuadPart = llFirstCluster.QuadPart * m_dwBytesPerSector * m_dwSectorsPerCluster;
    llOffset.QuadPart += m_dwFat32FirstDataSector * m_dwBytesPerSector;
    dwRetVal = SetFilePointer(m_hVolume, llOffset.LowPart, &llOffset.HighPart, FILE_BEGIN);
    if(dwRetVal == INVALID_SET_FILE_POINTER)
    goto ReadDiskClusterDone; llReadCount.QuadPart = llCount.QuadPart * m_dwBytesPerSector * m_dwSectorsPerCluster;
    if(llReadCount.HighPart != 0)
    assert(0); bResult = ReadFile(m_hVolume, pBuf, llReadCount.LowPart, &dwReadSize, NULL);
    if(bResult && llReadCount.QuadPart != dwReadSize)
    goto ReadDiskClusterDone; bResult = TRUE;ReadDiskClusterDone:
    return bResult;
    }
    ................
    DWORD dwReservedSectors;
    DWORD dwFatSectors;
    DWORD dwDirtoryTableSectors; dwReservedSectors = Boot.ReservedSectors;
    dwFatSectors = Boot.BigSectorsPerFat * Boot.NumberOfFATs; //FAT32
    dwDirtoryTableSectors = ((Boot.RootEntries * 32 - 1) / m_dwBytesPerSector + 1) * m_dwBytesPerSector; m_dwFat32FirstDataSector = dwReservedSectors + dwFatSectors + dwDirtoryTableSectors;