【跪求大神】关于直接读取NTFS硬盘扇区和FAT32优盘扇区的有关问题
【跪求大神】关于直接读取NTFS硬盘扇区和FAT32优盘扇区的问题
DeviceIoControl(...,FSCTL_GET_RETRIEVAL_POINTERS,...)获取到文件物理地址后
在NTFS本地磁盘中可以ReadFile正确读取到扇区
但是在FAT32的优盘中读取的却不是正确的文件。。。
-------------------------------------------------------------------------------------------
例如一个文件内容是“00000000000000000000000000000000000...........”
NTFS下读取扇区可以读取到"0000000....."
但是在FAT32的优盘下读取到的是乱码或者直接是0xFF........
过程中函数没有错误
-------------------------------------------------------------------------------------------
求大神帮帮忙看看是怎么回事,代码该如何修改?万分感谢
用到的代码是http://blog.****.net/momosp/article/details/6448733里面的代码
------解决思路----------------------
FAT32的数据区起始位置不是0, 读取前要额外计算
包括保留扇区, FAT, ....等
参考
DeviceIoControl(...,FSCTL_GET_RETRIEVAL_POINTERS,...)获取到文件物理地址后
在NTFS本地磁盘中可以ReadFile正确读取到扇区
但是在FAT32的优盘中读取的却不是正确的文件。。。
-------------------------------------------------------------------------------------------
例如一个文件内容是“00000000000000000000000000000000000...........”
NTFS下读取扇区可以读取到"0000000....."
但是在FAT32的优盘下读取到的是乱码或者直接是0xFF........
过程中函数没有错误
-------------------------------------------------------------------------------------------
求大神帮帮忙看看是怎么回事,代码该如何修改?万分感谢
用到的代码是http://blog.****.net/momosp/article/details/6448733里面的代码
------解决思路----------------------
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;