📄 fat.c
字号:
pMessage->Cluster=pDirectory->Mark;
if(pDirectory->Mark==0)
offset=0;
else
offset=2;
cluster=pMessage->Cluster;
LongCluster=0xfffffff0;
do
{
FAT_ReadCluster(pDriver,cluster);
for(i=offset;i<(unsigned int)(pDriverMessage->SecPerClus*16);i++)
{
if(pDriverMessage->ClusterBuf[i*32]==0)goto SearchFirst_End;
if(pDriverMessage->ClusterBuf[i*32]==0xe5)
{
LongCluster=0xfffffff0;
continue;
}
if(pDriverMessage->ClusterBuf[i*32+11]==0x0f)
{
ShortSum = pDriverMessage->ClusterBuf[i * 32 + 13];
LongCluster=cluster;
LongOffset=i;
continue;
}
if(LongCluster==0xfffffff0)
{
pMessage->Cluster=cluster;
pMessage->Offset=i;
}
else if(ShortSum == ChkSum(pDriverMessage->ClusterBuf + i * 32))
{
pMessage->Cluster=LongCluster;
pMessage->Offset=LongOffset;
}
else
{
LongCluster = 0xfffffff0;
continue;
}
pDirectory->CurrentEntry=1;
if((pDriverMessage->ClusterBuf[i*32+11]&0x10)==0)
pDirectory->CurrentType=TYPE_FILE;
else
pDirectory->CurrentType=TYPE_DIRECTORY;
FstCluster=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+20);
FstCluster<<=16;
FstCluster+=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+26);
FAT_GetFdt(pDriver, pMessage->Cluster, pMessage->Offset, pChildFdt);
if(FstCluster==0&&pDirectory->CurrentType==TYPE_FILE)
pDirectory->CurrentMark=pDriverMessage->MaxClusNum;
else
pDirectory->CurrentMark=FstCluster;
return pDirectory->CurrentMark;
}
cluster=FAT32_GetNextCluster(pDriver,cluster);
}while(cluster < pDriverMessage->MaxClusNum);
SearchFirst_End:
pDirectory->CurrentEntry=0;
pDirectory->CurrentMark=0;
pMessage->Cluster=pDirectory->Mark;
if(pDirectory->Mark==0)
pMessage->Offset=0;
else
pMessage->Offset=2;
return 0;
}
UInt32 Fat_SearchNext(PDirectory pDirectory)
{
PDriver pDriver;
unsigned int i;
UInt32 FstCluster,cluster;
struct FATDriverMessage *pDriverMessage;
struct FATDirectoryMessage *pMessage;
struct FATFdt *pChildFdt;
UInt32 LongOffset,LongCluster,offset;
unsigned char ShortSum;
unsigned char *clusterBuf;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pMessage=(struct FATDirectoryMessage *)pDirectory->MessageObject;
pChildFdt = &pMessage->Child;
offset=pMessage->Offset;
cluster=pMessage->Cluster;
FAT_ReadCluster(pDriver,cluster);
clusterBuf = pDriverMessage->ClusterBuf;
if(clusterBuf[offset * 32 + 11] == 0x0f)
{
offset += ((clusterBuf[offset * 32] & 0x0f) + 1);
}
else offset++;
if(offset >= (UInt32)pDriverMessage->SecPerClus * 16)
{
offset -= (UInt32)(pDriverMessage->SecPerClus * 16);
cluster = FAT32_GetNextCluster(pDriver,cluster);
}
LongCluster=0xfffffff0;
while(cluster < pDriverMessage->MaxClusNum)
{
FAT_ReadCluster(pDriver,cluster);
for(i=offset;i<(unsigned int)(pDriverMessage->SecPerClus*16);i++)
{
if(pDriverMessage->ClusterBuf[i*32]==0)goto SearchNext_End;
if(pDriverMessage->ClusterBuf[i*32]==0xe5)
{
LongCluster=0xfffffff0;
continue;
}
if(pDriverMessage->ClusterBuf[i*32+11]==0x0f)
{
ShortSum = pDriverMessage->ClusterBuf[i * 32 + 13];
LongCluster=cluster;
LongOffset=i;
continue;
}
if(LongCluster==0xfffffff0)
{
pMessage->Cluster=cluster;
pMessage->Offset=i;
}
else if(ShortSum == ChkSum(pDriverMessage->ClusterBuf + i * 32))
{
pMessage->Cluster=LongCluster;
pMessage->Offset=LongOffset;
}
else
{
LongCluster = 0xfffffff0;
continue;
}
pDirectory->CurrentEntry++;
FAT_GetFdt(pDriver, pMessage->Cluster, pMessage->Offset, pChildFdt);
if((pDriverMessage->ClusterBuf[i*32+11]&0x10)==0)
pDirectory->CurrentType=TYPE_FILE;
else
pDirectory->CurrentType=TYPE_DIRECTORY;
FstCluster=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+20);
FstCluster<<=16;
FstCluster+=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+26);
if(FstCluster==0&&pDirectory->CurrentType==TYPE_FILE)
pDirectory->CurrentMark=pDriverMessage->MaxClusNum;
else
pDirectory->CurrentMark=FstCluster;
return pDirectory->CurrentMark;
}
cluster=FAT32_GetNextCluster(pDriver,cluster);
}
SearchNext_End:
pDirectory->CurrentEntry=0;
pDirectory->CurrentMark=0;
pMessage->Cluster=pDirectory->Mark;
if(pDirectory->Mark==0)
pMessage->Offset=0;
else
pMessage->Offset=2;
return 0;
}
UInt32 Fat_SearchPrev(PDirectory pDirectory)
{
return 2468;
}
UInt32 Fat_GotoAny(PDirectory pDirectory,UInt32 num)
{
return 2468;
}
/*****************************************
如果FileName是标准的短文件名称,则搜索短文件名,
并设置好长文件名称的offset.
如果FileName是长文件名称,则搜索长文件名
并设置好长文件名称的offset.
************************************/
UInt32 Fat_SearchName(PDirectory pDirectory,unsigned char *FileName)
{
PDriver pDriver;
unsigned int i;
unsigned char ShortSum;
UInt32 FstCluster,cluster;
struct FATDriverMessage *pDriverMessage;
struct FATDirectoryMessage *pDirectoryMessage;
//上一个长文件名所在簇号
UInt32 LongCluster;
//上一个长文件名所在偏移量
UInt32 LongOffset;
//本文件长文件名fdt的个数
UInt32 LongFdtCount;
//当前fdt是第几个.
UInt32 CurreFdtId;
UInt32 Offset,CurrentEntry;
unsigned char LongName[32];
unsigned char ShortName[12];
pDirectoryMessage=(struct FATDirectoryMessage *)pDirectory->MessageObject;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
LongFdtCount=CheckLongFile(FileName,ShortName);
ShortSum=ChkSum(ShortName);
CurreFdtId=LongFdtCount;
if(LongFdtCount>0)GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
LongCluster=0xfffffff0;
if(pDirectory->Mark==0)
Offset=0;
else
Offset=2;
cluster=pDirectory->Mark;
CurrentEntry=0;
while(1)
{
FAT_ReadCluster(pDriver,cluster);
for(i=Offset;i<(unsigned int)(pDriverMessage->SecPerClus*16);i++)
{
//没有找到此文件
if(pDriverMessage->ClusterBuf[i*32]==0)
{
pDirectory->CurrentMark=0;
return 0;
}
//空目录项
if(pDriverMessage->ClusterBuf[i*32]==0xe5)
{
LongCluster = 0xfffffff0;
CurreFdtId=LongFdtCount;
continue;
}
if(pDriverMessage->ClusterBuf[i*32+11]==0x0f)
{
//找到新的长文件名称.
if(LongCluster == 0xfffffff0)
{
LongOffset=i;
LongCluster=cluster;
}
if(LongFdtCount!=0)
{
//查询长文件名称
if((MemComp(LongName, pDriverMessage->ClusterBuf + i * 32, 13) == 0) &&
(MemComp(LongName + 14, pDriverMessage->ClusterBuf + i * 32 + 14, 18) == 0))
{
ShortSum = pDriverMessage->ClusterBuf[i * 32 + 13];
//匹配准备比较下一串
if(CurreFdtId>1)
{
CurreFdtId--;
GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
}
}
else
{
//不匹配重新读取第一个串准备查询新的长文件名称.
LongCluster = 0xfffffff0;
if(CurreFdtId!=LongFdtCount)
{
CurreFdtId=LongFdtCount;
GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
}
}
}
continue;
}
CurrentEntry++;//what to do here
if(LongFdtCount!=0&&LongCluster!=0xfffffff0)
{
//长文件名找到
if(CurreFdtId==1)
{
if(ShortSum != ChkSum(pDriverMessage->ClusterBuf + i * 32))
{
LongCluster = 0xfffffff0;
CurreFdtId = LongFdtCount;
GetLongFdt(FileName, LongName, ShortSum, CurreFdtId);
continue;
}
else
{
pDirectoryMessage->Cluster=LongCluster;
pDirectoryMessage->Offset=LongOffset;
goto SearchName_End;
}
}
}
LongCluster=0xfffffff0;
if(LongFdtCount==0&&MemComp(pDriverMessage->ClusterBuf+i*32,ShortName,11)==0)
{
//短文件名称找到
pDirectoryMessage->Cluster=cluster;
pDirectoryMessage->Offset=i;
goto SearchName_End;
}
}// end for
cluster=FAT32_GetNextCluster(pDriver,cluster);
Offset=0;
}// end while
SearchName_End:
pDirectory->CurrentEntry=CurrentEntry;
if((pDriverMessage->ClusterBuf[i*32+11]&0x10)==0)
pDirectory->CurrentType=TYPE_FILE;
else
pDirectory->CurrentType=TYPE_DIRECTORY;
FstCluster=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+20);
FstCluster<<=16;
FstCluster+=FAT_GetInt16(pDriverMessage->ClusterBuf+i*32+26);
pDirectory->CurrentMark=FstCluster;
return pDirectory->CurrentMark;
}
UInt32 Fat_GetFileNum(PDirectory pDirectory)
{
return 12;
}
UInt32 Fat_GetDirectoryNum(PDirectory pDirectory)
{
return 13;
}
UInt32 Fat_GetChildNum(PDirectory pDirectory)
{
return 25;
}
void Fat_RenameDirectory(PDirectory pDirectory,unsigned char*FileName)
{
}
void Fat_DeleteDirectory(PDirectory pDirectory)
{
}
PFile Fat_OpenFile(PDirectory pDirectory,UInt32 FileMark)
{
PDriver pDriver;
PFile pFile;
struct FATDriverMessage *pDriverMessage;
struct FATDirectoryMessage *pDirectoryMessage;
struct FATFileMessage *pFileMessage;
pDriver=pDirectory->DriverObject;
pFile=(PFile)MemNew(sizeof(struct CCatalogFile));
pFile->DriverObject=pDirectory->DriverObject;
pFile->Mark=FileMark;
pFile->FilePtr_High=0;
pFile->FilePtr_Low=0;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pDirectoryMessage=(struct FATDirectoryMessage *)pDirectory->MessageObject;
pFileMessage=(struct FATFileMessage *)MemNew(sizeof(struct FATFileMessage));
pFile->MessageObject=(UInt32)pFileMessage;
pFile->buffer=(unsigned char *)MemNew((UInt16)(pDriverMessage->SecPerClus*512));
pFileMessage->FatherCluster=pDirectoryMessage->Cluster;
pFileMessage->FatherOffset=pDirectoryMessage->Offset;
pFileMessage->FatherFstClus=pDirectory->Mark;
if(FileMark>=pDriverMessage->MaxClusNum) pFileMessage->Cluster=0;
else pFileMessage->Cluster=FileMark;
FAT_ReadCluster(pDriver,pFileMessage->FatherCluster);
FAT_GetFdt(pDriver,pFileMessage->FatherCluster,pFileMessage->FatherOffset,&pFileMessage->file);
pFileMessage->Cluster=pFileMessage->file.FstClus;
pFileMessage->ptr=0;
pFile->FileLen_High=0;
pFile->FileLen_Low=pFileMessage->file.FileSize;
return pFile;
}
signed int Fat_GetChar(PFile pFile)
{
PDriver pDriver;
signed int RetChar;
struct FATFileMessage *pFileMessage;
struct FATDriverMessage *pDriverMessage;
pDriver=pFile->DriverObject;
pFileMessage=(struct FATFileMessage *)pFile->MessageObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
if(pFileMessage->ptr==0)FAT_FileReadCluster(pFile);
RetChar=pFile->buffer[pFileMessage->ptr];
pFile->FilePtr_Low++;
pFileMessage->ptr++;
if(pFileMessage->ptr==(UInt32)pDriverMessage->SecPerClus*512)
{
pFileMessage->Cluster=FAT32_GetNextCluster(pDriver,pFileMessage->Cluster);
pFileMessage->ptr=0;
}
return RetChar;
}
void Fat_PutChar(PFile pFile,unsigned char ch)
{
PDriver pDriver;
UInt32 cluster;
struct FATDriverMessage *pDriverMessage;
struct FATFileMessage* pFileMessage;
pDriver=pFile->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pFileMessage=(struct FATFileMessage* )pFile->MessageObject;
pFile->buffer[pFileMessage->ptr++]=ch;
pFile->FilePtr_Low++;
if(pFileMessage->ptr<(UInt32)pDriverMessage->SecPerClus*512) return;
pFileMessage->ptr=0;
FAT_FileWriteCluster(pFile);
cluster=FAT32_MallocCluster(pDriver);
FAT32_SetNextCluster(pDriver,pFileMessage->Cluster,cluster);
pFileMessage->Cluster=cluster;
}
void Fat_ReadFile(PFile pFile,unsigned char *buf,UInt32 size)
{
UInt32 i;
for(i=0;i<size;i++)
{
*buf++=Fat_GetChar(pFile);
}
}
void Fat_WriteFile(PFile pFile,unsigned char *buf,UInt32 size)
{
UInt32 i;
for(i=0;i<size;i++)
{
Fat_PutChar(pFile,*buf++);
}
}
void Fat_RenameFile(PFile pFile,unsigned char*FileName)
{
return;
}
void Fat_DeleteFile(PFile pFile)
{
return;
}
/****************************************
对新建的文件关闭操作,
就是要向文件写入缓冲中的数据.
和长度等属性.
*****************************************/
void Fat_CloseFile(PFile pFile)
{
PDriver pDriver;
struct FATDriverMessage *pDriverMessage;
struct FATFileMessage* pFileMessage;
pDriver=pFile->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pFileMessage=(struct FATFileMessage* )pFile->MessageObject;
pFileMessage->file.FileSize=pFile->FilePtr_Low;
FAT_SetFdt(pDriver,pFileMessage->FatherCluster,pFileMessage->FatherOffset,&pFileMessage->file);
FAT_FileWriteCluster(pFile);
}
void Fat_Seek(PFile pFile,UInt32 pos,U8 mode)
{
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -