⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 FAT32文件系统
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -