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

📄 fat.c

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