📄 fat.c
字号:
{
FAT_ReadCluster(pDriver, cluster);
while(offset < EntryTotal)
{
if(pDriverMessage->ClusterBuf[offset * 32 + 11] == 0x0f)
{
i = (pDriverMessage->ClusterBuf[offset * 32] & 0x0f);
if(pDriverMessage->ClusterBuf[offset * 32] & 0x40) j = i;
FAT_Unicode2CharMemCopy(pDriverMessage->ClusterBuf + offset * 32 + 1, pFdt->LongName + (i - 1) * 13, 5);
FAT_Unicode2CharMemCopy(pDriverMessage->ClusterBuf + offset * 32 + 14, pFdt->LongName + (i - 1) * 13 + 5, 6);
FAT_Unicode2CharMemCopy(pDriverMessage->ClusterBuf + offset * 32 + 28, pFdt->LongName + (i - 1) * 13 + 11, 2);
offset++;
}
else
{
pFdt->LongName[j * 26] = pFdt->LongName[j * 26 + 1] = 0;
MemCopy(pDriverMessage->ClusterBuf + offset * 32, pFdt->Name, 11);
pFdt->Attr = pDriverMessage->ClusterBuf[offset * 32 + 11];
pFdt->NTRes = pDriverMessage->ClusterBuf[offset * 32 + 12];
pFdt->CrtTimeTenth = pDriverMessage->ClusterBuf[offset * 32 + 13];
pFdt->CrtTime = FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 14);
pFdt->CrtDate = FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 16);
pFdt->LstAccDate = FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 18);
pFdt->FstClus = FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 20);
pFdt->FstClus = (pFdt->FstClus << 16) + FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 26);
pFdt->WrtTime = FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 22);
pFdt->WrtDate=FAT_GetInt16(pDriverMessage->ClusterBuf + offset * 32 + 24);
pFdt->FileSize=FAT_GetInt32(pDriverMessage->ClusterBuf + offset * 32 + 28);
return;
}
}
cluster = FAT32_GetNextCluster(pDriver, cluster);
offset = 0;
}
}
void FAT_SetFdt(PDriver pDriver ,UInt32 cluster, UInt32 offset ,struct FATFdt *pFdt)
{
unsigned char Chksum, i = 0;
UInt32 sector, namePointer = 0, EntryTotal;
struct FATDriverMessage* pDriverMessage;
pDriverMessage = (struct FATDriverMessage* )pDriver->MessageObject;
Chksum = ChkSum(pFdt->Name);
EntryTotal = pDriverMessage->SecPerClus * 16;
sector = pDriverMessage->DataAddr + (cluster - 2) * pDriverMessage->SecPerClus + offset / 16;
while(FAT_GetInt16(pFdt->LongName + namePointer)) namePointer += 2;
i = (namePointer - 2 + 25) / 26;
while(cluster < pDriverMessage->MaxClusNum)
{
FAT_ReadCluster(pDriver, cluster);
while(offset < EntryTotal)
{
if(i > 0)
{
if(i == (namePointer - 2 + 25) / 26)pDriverMessage->ClusterBuf[offset * 32] = i | 0x40;
else pDriverMessage->ClusterBuf[offset * 32] = i;
FAT_Char2UnicodeMemCopy(pFdt->LongName + (i - 1) * 13, pDriverMessage->ClusterBuf + offset * 32 + 1, 5);
FAT_Char2UnicodeMemCopy(pFdt->LongName + (i - 1) * 13 + 5, pDriverMessage->ClusterBuf + offset * 32 + 14, 6);
FAT_Char2UnicodeMemCopy(pFdt->LongName + (i - 1) * 13 + 11, pDriverMessage->ClusterBuf + offset * 32 + 28, 2);
pDriverMessage->ClusterBuf[offset * 32 + 11] = 0x0f;
pDriverMessage->ClusterBuf[offset * 32 + 12] = 0;
pDriverMessage->ClusterBuf[offset * 32 + 13] = Chksum;
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 26, 0);
i--; offset++;
}
else
{
MemCopy(pFdt->Name, pDriverMessage->ClusterBuf + offset * 32, 11);
pDriverMessage->ClusterBuf[offset * 32 + 11] = pFdt->Attr;
pDriverMessage->ClusterBuf[offset * 32 + 12] = pFdt->NTRes;
pDriverMessage->ClusterBuf[offset * 32 + 13] = pFdt->CrtTimeTenth;
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 14, pFdt->CrtTime);
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 16, pFdt->CrtDate);
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 18, pFdt->LstAccDate);
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 20, (UInt16)(pFdt->FstClus>>16));
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 26, (UInt16)(pFdt->FstClus&0xffff));
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 22, pFdt->WrtTime);
FAT_SetInt16(pDriverMessage->ClusterBuf + offset * 32 + 24, pFdt->WrtDate);
FAT_SetInt32(pDriverMessage->ClusterBuf + offset * 32 + 28, (UInt32)pFdt->FileSize);
FAT_WriteCluster(pDriver);
return;
}
}
FAT_WriteCluster(pDriver);
cluster = FAT32_GetNextCluster(pDriver, cluster);
offset = 0;
}
}
/**************************************************************
//查询父目录中,是否存在FileName目录项,不存在就填入此目录项
//pfdt的LongName,Name依据FileName和磁盘目录项。其他属性不变
****************************************************************/
UInt32 FAT_SearchFdt(PDirectory pDirectory,unsigned char *FileName,struct FATFdt *pFdt)
{
//上一个长文件名所在簇号
UInt32 LongCluster,cluster;
//上一个长文件名所在偏移量
UInt32 LongOffset;
//本文件长文件名fdt的个数
UInt32 LongFdtCount;
//当前fdt是第几个.
UInt32 CurreFdtId;
UInt32 OffsetStart;
UInt32 FirstNullCluster,FirstNullOffset,NullTotal;
unsigned char LongName[32];
unsigned char *ShortName;
unsigned int i,EntryTotal;
unsigned char ShortSum;
unsigned char *ClusterBuf;
UInt32 maxEnding = 1, ShortNamePartLen = 0;
PDriver pDriver;
struct FATDriverMessage* pDriverMessage;
struct FATDirectoryMessage *pDirectoryMessage;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage* )pDriver->MessageObject;
pDirectoryMessage=(struct FATDirectoryMessage *)pDirectory->MessageObject;
ClusterBuf=pDriverMessage->ClusterBuf;
ShortName=pFdt->Name;
StrCopy(FileName,pFdt->LongName);
// FAT_FileterFileName(FileName,pFdt->LongName);
LongFdtCount=CheckLongFile(FileName,ShortName);
while(ShortName[ShortNamePartLen] != '~' && ShortName[ShortNamePartLen] != 0)
ShortNamePartLen++;
ShortSum=ChkSum(ShortName);
CurreFdtId=LongFdtCount;
if(LongFdtCount>0)GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
LongCluster=0xfffffff0;
EntryTotal=pDriverMessage->SecPerClus*16;
if(pDirectory->Mark==0)
OffsetStart=0;
else
OffsetStart=2;
FirstNullCluster=0;
FirstNullOffset=OffsetStart;
NullTotal=0;
cluster=pDirectory->Mark;
while(cluster<pDriverMessage->MaxClusNum)
{
FAT_ReadCluster(pDriver,cluster);
for(i=OffsetStart;i<EntryTotal;i++)
{
if(ClusterBuf[i*32]==0)
{
if(NullTotal>LongFdtCount)
{
pDirectoryMessage->Offset=FirstNullOffset;
pDirectoryMessage->Cluster=FirstNullCluster;
}
else
{
pDirectoryMessage->Offset=i;
pDirectoryMessage->Cluster=cluster;
}
pFdt->FstClus=FAT32_MallocCluster(pDriver);
FAT_SetFdt(pDriver,cluster,i,pFdt);
pDirectory->CurrentEntry=pDirectory->CurrentEntry+1;
return 1;
}
if(ClusterBuf[i*32]==0xe5)
{
if(NullTotal==0)
{
FirstNullCluster=cluster;
FirstNullOffset=i;
}
NullTotal++;
continue;
}
if(NullTotal<=LongFdtCount)NullTotal=0; //没有找到这么多空项
if(ClusterBuf[i*32+11]==0x0f)
{
ShortSum=ClusterBuf[i*32+13];
//找到新的长文件名称.
if(LongCluster==0xfffffff0)
{
LongOffset=i;
LongCluster=cluster;
}
if(LongFdtCount==0)continue;
//查询长文件名称
if((MemComp(LongName, pDriverMessage->ClusterBuf + i * 32, 13) == 0) &&
(MemComp(LongName + 14, pDriverMessage->ClusterBuf + i * 32 + 14, 18) == 0))
{
//匹配准备比较下一串
if(CurreFdtId>1)
{
CurreFdtId--;
GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
}
}
else
{
//不匹配重新读取第一个串准备查询新的长文件名称.
LongCluster=0xfffffff0;
if(CurreFdtId!=LongFdtCount)
{
CurreFdtId=LongFdtCount;
GetLongFdt(FileName,LongName,ShortSum,CurreFdtId);
}
}
continue;
}
pDirectory->CurrentEntry++;
if(LongFdtCount != 0 && LongCluster != 0xfffffff0 && CurreFdtId == 1)
{
if(ShortSum==ChkSum(ClusterBuf+i*32))return 0;
else
{
LongCluster=0xfffffff0;
CurreFdtId=LongFdtCount;
GetLongFdt(FileName, LongName, ShortSum, CurreFdtId);
continue;
}
}
// LongCluster=0xfffffff0;
if(MemComp(pDriverMessage->ClusterBuf+i*32,ShortName,11)==0)
{
if(LongFdtCount==0) return 0;//短文件名称找到
//新名字number+1;
}
if(LongFdtCount != 0 &&
MemComp(pDriverMessage->ClusterBuf + i * 32, ShortName, ShortNamePartLen) == 0 &&
MemComp(pDriverMessage->ClusterBuf + i * 32 + 8, ShortName + 8, 3) == 0)
{
if(ShortName[ShortNamePartLen] == '~' && pDriverMessage->ClusterBuf[i * 32 + ShortNamePartLen + 1] > maxEnding)
{
maxEnding = pDriverMessage->ClusterBuf[i * 32 + ShortNamePartLen + 1];
ShortName[ShortNamePartLen + 1] = maxEnding;
}
}
}
OffsetStart=0;
cluster=FAT32_GetNextCluster(pDriver,cluster);
}
return 0;
}
PDriver Fat_OpenDriver(PDisk pDisk,UInt32 PartitionPos)
{
PDriver pDriver;
unsigned char SectorBuf[512];
struct FATDriverMessage * pDriverMessage;
UInt32 RootAddr,RootEntCnt,RootDirSectors,TotSec,MaxClusNum;
pDisk->ReadSector(pDisk->DbrAddr,SectorBuf);
pDriver=(PDriver)MemNew(sizeof(struct CDriver));
pDriver->MessageObject=0;
pDriver->DiskObject=pDisk;
pDriver->PathDepth=0;
pDriver->StartSector=pDisk->DbrAddr;
pDriver->Path[0]=0;
pDriverMessage=(struct FATDriverMessage* )MemNew(sizeof(struct FATDriverMessage));
pDriverMessage->SecPerClus=SectorBuf[13];
pDriverMessage->ClusterBuf=(unsigned char *)MemNew(pDriverMessage->SecPerClus*512);
pDriverMessage->Fat1Addr=FAT_GetInt16(SectorBuf+14);
pDriverMessage->FATSz=FAT_GetInt16(SectorBuf+22);
if(pDriverMessage->FATSz==0)pDriverMessage->FATSz=FAT_GetInt32(SectorBuf+36);
pDriverMessage->NumFATs=SectorBuf[16];
RootAddr=pDriverMessage->Fat1Addr+pDriverMessage->FATSz*pDriverMessage->NumFATs;
RootEntCnt=FAT_GetInt16(SectorBuf+17);
RootDirSectors=(RootEntCnt*32+pDriverMessage->SecPerClus-1)/pDriverMessage->SecPerClus;
pDriverMessage->DataAddr=RootAddr+RootDirSectors;
TotSec=FAT_GetInt16(SectorBuf+19);
if(!TotSec)TotSec=FAT_GetInt32(SectorBuf+32);
pDriverMessage->Capacity=TotSec-pDriverMessage->DataAddr;
MaxClusNum=pDriverMessage->Capacity/pDriverMessage->SecPerClus;
if(MaxClusNum<4085)
{
pDriver->FileSystem=FS_ERROR;
}
else if(MaxClusNum<65525)
{
pDriver->FileSystem=FS_FAT16;
if(pDriverMessage->Capacity>pDriverMessage->FATSz*256*pDriverMessage->SecPerClus)pDriverMessage->Capacity=pDriverMessage->FATSz*256*pDriverMessage->SecPerClus;
}
else
{
pDriver->FileSystem=FS_FAT32;
if(pDriverMessage->Capacity>pDriverMessage->FATSz*128*pDriverMessage->SecPerClus)pDriverMessage->Capacity=pDriverMessage->FATSz*128*pDriverMessage->SecPerClus;
}
pDriver->SectorCount=TotSec;
pDriver->MessageObject=(UInt32)pDriverMessage;
pDriverMessage->Cluster=1;
pDriverMessage->fat=0;
pDriverMessage->MaxClusNum=MaxClusNum;
Driver_ReadSector(pDriver,pDriverMessage->Fat1Addr,pDriverMessage->FatBuf);
FAT_ReadCluster(pDriver,0);
FAT32_GetNextCluster(pDriver,0);
return pDriver;
}
PDirectory Fat_OpenDirectory(PDriver pDriver,UInt32 DirectoryMark)
{
PDirectory pDirectory;
struct FATDriverMessage *pDriverMessage;
struct FATDirectoryMessage *pMessage;
struct FATFdt *pFolder;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pDirectory=(PDirectory)MemNew(sizeof(struct CDirectory));
pMessage=(struct FATDirectoryMessage *)MemNew(sizeof(struct FATDirectoryMessage));
pDirectory->DriverObject=pDriver;
pDirectory->Mark=DirectoryMark;
pDirectory->FatherMark=0;
pDirectory->MessageObject =(UInt32)pMessage;
pDirectory->CurrentEntry=0;
pDirectory->CurrentMark=0;
pDirectory->CurrentType=TYPE_FILE;
pMessage->Cluster=DirectoryMark;
if(DirectoryMark==0)
pMessage->Offset=0;
else
pMessage->Offset=2;
pFolder=&pMessage->Folder;
FAT_ReadCluster(pDriver,DirectoryMark);
if(DirectoryMark!=0)
{
pMessage->FatherFstClus=pFolder->FstClus;
pMessage->FatherFstClus=FAT_GetInt16(pDriverMessage->ClusterBuf+52);
pMessage->FatherFstClus<<=16;
pMessage->FatherFstClus+=FAT_GetInt16(pDriverMessage->ClusterBuf+58);
pDirectory->FatherMark=pMessage->FatherFstClus;
FAT_SearchCluster(pDirectory);
FAT_GetFdt(pDriver,pMessage->FatherCluster,pMessage->Offset,pFolder);
}
else
{
MemSet((unsigned char *)pFolder,0,sizeof(struct FATFdt));
pMessage->FatherFstClus=0;
}
pDirectory->CurrentMark=0;
return pDirectory;
}
UInt32 Fat_Create(PDirectory pDirectory)
{
/* PDriver pDriver;
PDirectory pChild;
struct FATDriverMessage *pDriverMessage;
struct FATDirectoryMessage* pChildMessage;
struct FATDirectoryMessage* pFatherMessage;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pFatherMessage=(struct FATDirectoryMessage* )pDirectory->MessageObject;
pChild=(PDirectory)MemNew(sizeof(struct CDirectory));
pChildMessage=(struct FATDirectoryMessage* )MemNew(sizeof(struct FATDirectoryMessage));
pChild->MessageObject=(UInt32)pChildMessage;
pChild->CurrentEntry=0;
pChild->CurrentMark=0;
pChild->CurrentType=TYPE_FILE;
pChild->DriverObject=pDriver;
pChild->FatherMark=pDirectory->Mark;
pChild->Mark=FAT32_MallocCluster(pDriver);
//当前访问到的簇
pChildMessage->Cluster=pChild->Mark;
//其FDT在父目录中的偏移量
pChildMessage->FatherOffset=pFatherMessage->Offset;
//其FDT在父目录中的簇号
pChildMessage->FatherCluster=pFatherMessage->Cluster;
//folder 是本目录的一些属性
pChildMessage->Folder.FstClus=pChild->Mark;
pChildMessage->Folder.Attr=0x10;
pChildMessage->Folder.CrtDate=0;
pChildMessage->Folder.CrtTime=0;
pChildMessage->Folder.CrtTimeTenth=0;
pChildMessage->Folder.FileSize=0;
pChildMessage->Folder.LstAccDate=0;
pChildMessage->Folder.Name[0]=0;
pChildMessage->Folder.NTRes=0;
FAT_SearchFdt(pDirectory,DirName,&pChildMessage->Folder);
//当前访问的fdt的偏移量
pChildMessage->Offset=pFatherMessage->Offset;
//父目录的首簇号
pChildMessage->FatherFstClus=pFatherMessage->Cluster;
return pChild;
PFile Fat_CreateFile(PDirectory pDirectory,unsigned char *FileName)
{
PDriver pDriver;
PFile pFile;
struct FATDriverMessage *pDriverMessage;
struct FATFileMessage* pFileMessage;
struct FATDirectoryMessage* pDirectoryMessage;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pFile=(PFile)MemNew(sizeof(struct CCatalogFile));
pFileMessage=(struct FATFileMessage* )MemNew(sizeof(struct FATFileMessage));
pDirectoryMessage=(struct FATDirectoryMessage* )pDirectory->MessageObject;
pFile->MessageObject=(UInt32)pFileMessage;
pFile->buffer=(unsigned char *)MemNew((UInt16)(pDriverMessage->SecPerClus*512));
pFile->DriverObject=pDriver;
pFile->FileLen_High=0;
pFile->FileLen_Low=0;
pFile->FilePtr_High=0;
pFile->FilePtr_Low=0;
pFile->Mark=FAT32_MallocCluster(pDriver);
pFile->Mode=OPEN_MODE_NEW;
//当前访问到的簇
pFileMessage->Cluster=pFile->Mark;
//文件的数据的簇内指针
pFileMessage->ptr=0;
//父目录的首簇号
pFileMessage->FatherFstClus=pDirectory->Mark;
//本文件的属性
pFileMessage->file.Attr=0;
pFileMessage->file.CrtDate=0;
pFileMessage->file.CrtTime=0;
pFileMessage->file.CrtTimeTenth=0;
pFileMessage->file.FileSize=0;
pFileMessage->file.FstClus=pFile->Mark;
pFileMessage->file.LstAccDate=0;
pFileMessage->file.NTRes=0;
FAT_SearchFdt(pDirectory,FileName,&pFileMessage->file);
//本文件fdt在父目录中的偏移量
pFileMessage->FatherOffset=pDirectoryMessage->Offset;
//本文件fdt在父目录中的簇号
pFileMessage->FatherCluster=pDirectoryMessage->Cluster;
return pFile;*/
return 0;
}
UInt32 Fat_SearchFirst(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;
pDriver=pDirectory->DriverObject;
pDriverMessage=(struct FATDriverMessage *)pDriver->MessageObject;
pMessage=(struct FATDirectoryMessage *)pDirectory->MessageObject;
pChildFdt = &pMessage->Child;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -