原来的簇链查找函数如下:
#if 0
//备注:本函数假定BytePerSector为512字节。
ulong mLinkCluster(ulong ulCurrent_Cluster)
{
unsigned long ulResult;
unsigned int uiOffset; //扇区内的偏移量
unsigned long fatOffset;
unsigned long sector;
uchar data *ucTemp;
// unsigned int offset;
if(FAT_TYPE == c_FAT_Type_FAT12)
{
// uiResult = ++uiCurrent_Cluster;
fatOffset = ulCurrent_Cluster+(ulCurrent_Cluster>>1);
// sector = BootSector + RsvdSecCnt + (fatOffset /512);
sector = FATStartSecotr + (fatOffset /512);
uiOffset = fatOffset % 512;
if(uiOffset == 511)
{
ReadSector_SD(sector,Sector_Buf);
ulResult = ((unsigned long)Sector_Buf[511]);
ReadSector_SD(sector+1,Sector_Buf);
ulResult |= (((unsigned long)Sector_Buf[0])<<8)&0xffff;
}
else
{
ReadSector_SD(sector,Sector_Buf);
ulResult = Sector_Buf[uiOffset] + (((unsigned long)Sector_Buf[uiOffset+1])<<8);
}
if (ulCurrent_Cluster & 0x0001)
{
ulResult >>= 4;
}
else
{
ulResult &= 0x0fff;
}
}
else if(FAT_TYPE == c_FAT_Type_FAT16)
{
// ReadSector_SD( BootSector + RsvdSecCnt + uiCurrent_Cluster / 256, Sector_Buf ); /* 读取簇号所在的FAT扇区 */
// ReadSector_SD( FATStartSecotr + uiCurrent_Cluster / 256, Sector_Buf ); /* 读取簇号所在的FAT扇区 */
mReadSector(FATStartSecotr + ulCurrent_Cluster / 256);
uiOffset = ( ulCurrent_Cluster + ulCurrent_Cluster ) & 0x01FF;
ulResult = Sector_Buf[uiOffset]+ ( (ulong)Sector_Buf[uiOffset+1]<<8);
}
else if(FAT_TYPE == c_FAT_Type_FAT32)
{
mReadSector(FATStartSecotr + ulCurrent_Cluster / 128);
uiOffset = ( ulCurrent_Cluster << 2) & 0x01FF;
// uiOffset = ( ulCurrent_Cluster * 4) & 0x01FF;
ucTemp = (uchar *)&ulResult;
*ucTemp++ = Sector_Buf[uiOffset+3];
*ucTemp++ = Sector_Buf[uiOffset+2];
*ucTemp++ = Sector_Buf[uiOffset+1];
*ucTemp++ = Sector_Buf[uiOffset];
// ulResult = Sector_Buf[uiOffset]+ ( (ulong)Sector_Buf[uiOffset+1]<<8)+ ( (ulong)Sector_Buf[uiOffset+2]<<16)+ ( (ulong)Sector_Buf[uiOffset+3]<<24);
}
else
{
}
return(ulResult);
}
#endif
|