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

📄 dosfdb.c

📁 一种文件系统的结构
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "..\define.h"
#include "..\all.h"

data	bit		gb_FindFile=0;
idata	U8		gc_DOS_Status;
idata	U32		gdw_StartCluster2;
idata	U32		gdw_CurrFlag;

xdata	U16		gw_DOS_CreateDate;
xdata	U16		gw_DOS_CreateTime;
xdata	U16		gw_FdbOffset;
xdata	U8		tc_File_Type[100];
xdata	U16		tc_FDB_Offset[100];
xdata	U32		tc_FDB_Cluster[100];
xdata	U32		tc_FDB_LogAdd[100];
xdata	U32		tc_LFDB_LogAdd0[100];
xdata	U32		tc_LFDB_LogAdd1[100];

extern	data	bit	gb_TriggerFileSkip;
extern	data	U8	gc_FileSkipNumber;

extern	xdata	U8	EXT_NameA[];
extern	xdata	U8	EXT_NameB[];
extern	xdata	U8	EXT_NameC[]; 
extern	xdata	U8*	EXT_Name[];

extern	void	MoveUSBtoUserDataBuf(U16 tw_StartAddr);

void	DOS_FillFdb(U8 * tpc_Fdb, U8 * tpc_Name, U32 tdw_StartCluster, U32 tdw_FileSize);
U8		Find_Fdb(SearchFdb *p_mp);
U8		Dos_GetFileLongName(U8 tc_FileHandle, U8 *tpc_LongName);

void DOS_FillFdb(U8 * tpc_Fdb, U8 * tpc_Name, U32 tdw_StartCluster, U32 tdw_FileSize)
{
	// update new name
	memcpy(tpc_Fdb,tpc_Name,0x0C);					  				

	tpc_Fdb[0x0C] = 0;	// reserved 
	tpc_Fdb[0x0D] = 0;	// creation time in millisecond 
		
	//creation time
	tpc_Fdb[0x0E] = gw_DOS_CreateTime;
	tpc_Fdb[0x0F] = gw_DOS_CreateTime >> 8;
	
	//creation date
	tpc_Fdb[0x10] = gw_DOS_CreateDate;		
	tpc_Fdb[0x11] = gw_DOS_CreateDate >> 8;	
	
	//last access date
	tpc_Fdb[0x12] = gw_DOS_CreateDate;
	tpc_Fdb[0x13] = gw_DOS_CreateDate >> 8;	
	
	//last modify time
	tpc_Fdb[0x16] =	gw_DOS_CreateTime;
	tpc_Fdb[0x17] =	gw_DOS_CreateTime >> 8;
	
	//last modify date
	tpc_Fdb[0x18] =	gw_DOS_CreateDate;		
	tpc_Fdb[0x19] =	gw_DOS_CreateDate >> 8;

	tpc_Fdb[0x1A] =	tdw_StartCluster;
	tpc_Fdb[0x1B] =	tdw_StartCluster >>	8;

	//high word of start cluster number
	tpc_Fdb[0x14] = tdw_StartCluster >> 16;		
	tpc_Fdb[0x15] = tdw_StartCluster >> 24;

	tpc_Fdb[0x1C] =	tdw_FileSize;
	tpc_Fdb[0x1D] =	tdw_FileSize >>	8;
	tpc_Fdb[0x1E] =	tdw_FileSize >>	16;
	tpc_Fdb[0x1F] =	tdw_FileSize >>	24;

	return;
}


U8 Find_Fdb(SearchFdb *p_mp)
{
	bit tbt_flag=0,tbt_SortFlag=0,tbt_FileSort_Flag=0,tbt_SameFlag=0;
	U8 tc_sts,tc_Read_fail,tc_SectorOffset,tc_Temp_SectorOffset;
	U8 tc_PlayMode,tc_ExtNameCon=3;
	U8 tc_DOS_FDBSize1;
	U16 tw_FdbOffset1; 
	U16 tw_XBYTEstart; 
	U16 tw_FdbOffset,tw_Temp_FdbOffset,tw_FileLongName,tw_ByteOffset;
	U32 tdw_SectorAdd,tdw_StartCluster,tdw_S_ClusterNum,tdw_FDBClusterNum;
	U32 tdw_Find_ClusterSize,tdw_TheEndCluster,tdw_StartCluster1,tdw_StartCluster3;
	U32 tdw_FDB_LogAdd0,tdw_FDB_LogAdd1;
	U32 tdw_Temp_flag=0;
	U16 tw_DirIndex=0,tw_DirIndex1=0;
	U8 tc_ExtNum,tc_RecFlag;
	U32 tdw_Tag0,tdw_Tag1;
	U8  code REC[]={'R','E','C','_'};
	U8	tc_FileSkipNumber;
	U8	Pointer=0;

	tc_FileSkipNumber=gc_FileSkipNumber;
	
	if (gc_DOS_Status > 0x80)
	{//dos error is occur, not to do search
		return 1;
	}
	tdw_Tag1= p_mp->Compare.dw_BubbleFlag;
	if(p_mp->c_Search_Direction) //find pre
	{					
		tdw_Tag0=0x0000;		
	}
	else
	{//find next					
		tdw_Tag0=0xffffffff;	
	}
	tdw_FDBClusterNum=p_mp->dw_FDB_StartCluster;
	p_mp->dw_LongFDB_LogAdd1=0;
	p_mp->dw_LongFDB_LogAdd0=0;		
	tw_Temp_FdbOffset=0x00;
	tc_Temp_SectorOffset=0x00;
	tdw_FDB_LogAdd0=0;
	tdw_FDB_LogAdd1=0;
	tdw_S_ClusterNum=p_mp->dw_FDB_StartCluster;	
	tc_sts=GO_ON;
													 							    					 
	if(gc_DOS_FileSystemType==0)
	{
		tdw_TheEndCluster=0x0fff;
	}
	else if(gc_DOS_FileSystemType==1)
	{
		tdw_TheEndCluster=0xffff;
	}
	else
	{
		tdw_TheEndCluster=0x0fffffff; 
	}			

	while(tdw_S_ClusterNum<tdw_TheEndCluster)//要考虑FAT32的情况
	{ //find in one	dir 
		if (!tdw_S_ClusterNum)		      //Is rootdir
		{
			tdw_Find_ClusterSize=(gdw_DOS_DataAddr - gdw_DOS_RootDirAddr);
			tdw_SectorAdd=gdw_DOS_RootDirAddr;		
		}
		else
		{
			tdw_Find_ClusterSize=gc_DOS_SectorPerCluster;	
			tdw_SectorAdd=DOS_ClusterLogicAddr(tdw_S_ClusterNum);
		}								   

	    for(tc_SectorOffset=tc_Temp_SectorOffset;tc_SectorOffset<tdw_Find_ClusterSize;tc_SectorOffset++)
		{//find	in one cluster 
		  	gc_ReadWriteDataArea=1;
			tc_Read_fail = DOS_Read_LogicSector((tdw_SectorAdd+tc_SectorOffset),1);													

			if(tc_Read_fail)
			{//read sector error(1 is fail)
				break;
			}

			if(tc_SectorOffset!=tc_Temp_SectorOffset)//when one Sector is(tw_FdbOffset)finished,fdboffset should be 0
			{
				tw_Temp_FdbOffset=0;
			}

			for(tw_FdbOffset1=tw_Temp_FdbOffset;tw_FdbOffset1<gw_DOS_SectorSize;tw_FdbOffset1+=32)
			{//Find in one sector
				tc_DOS_FDBSize1=tw_FdbOffset1>>9;						
				tw_FdbOffset=tw_FdbOffset1;
				if(tc_DOS_FDBSize1)
				{
					tw_XBYTEstart=HOST_BUF_SA+((U16)tc_DOS_FDBSize1<<9);
					MoveUSBtoUserDataBuf(tw_XBYTEstart);
				}
								
				tc_PlayMode=0;				
				tc_RecFlag=1;
				tw_DirIndex++;

				if(gc_UserDataBuf[tw_FdbOffset]==0xE5)
				{
					if(p_mp->c_Search_Mode==K_FIND_FREE_FDB)
					{
						tc_sts=0;
					} 				
				}
				else if(gc_UserDataBuf[tw_FdbOffset]==0x00)
				{
					if((p_mp->c_Search_Mode==K_FIND_FREE_FDB) || (p_mp->c_Search_Mode==K_FIND_LAST_FDB))
					{
						tc_sts=0;			  		
					}
					else
					{			
						tc_sts=1;	    //The dir is end flag  
 					}			
				}
				else if(gc_UserDataBuf[tw_FdbOffset+0x0b]==0x0f)	 //is longfdb
				{
					if(p_mp->c_Search_Mode==K_SPECIFIC_LONG_FILENAME)//find by long filename
					{
						if(gc_UserDataBuf[tw_FdbOffset]&0x40)		 //IS it the last longfdb?
						{	
							if(gc_UserDataBuf[tw_FdbOffset]==p_mp->pc_LongFileName[0])
							{					
								if (*(p_mp->pc_LongFileName+1) != 0)
								{
									if((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[*(p_mp->pc_LongFileName+1)-1]]==0x00) && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[*(p_mp->pc_LongFileName+1)-2]]==0x00))
									{
										goto MatchEXTName;
									}
								}
								else
								{//character NUM is equal
								MatchEXTName:
									tc_ExtNameCon = 6;
									((U8 *)(&tw_FileLongName))[0] = *(p_mp->pc_LongFileName+3);
									((U8 *)(&tw_FileLongName))[1] = *(p_mp->pc_LongFileName+4);
									tw_FileLongName+=5;
								
									for(tw_ByteOffset=0;tw_ByteOffset<(26-(*(p_mp->pc_LongFileName+1)));tw_ByteOffset++)
									{//compare the last longfdb
										if(gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]]!=p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset])  //last longfdb is not equal
										{
											if ((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]] >= 'a') && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]] <= 'z'))
											{//if current char is lower letter,try to compare after converting to upper letter
												if (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]]!=(p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset] + 0x20))
												{	 
													break;
												}
											}
											else
											{
												break;
											}										
										}
									}

									if(tw_ByteOffset==26-*(p_mp->pc_LongFileName+1))    //the last longfdb is equal
									{
										if((gc_UserDataBuf[tw_FdbOffset]&0x3f)==1)        //current longfdb is the first 
										{
											tc_sts=0;
										}
										else
										{
											tw_FileLongName-=tw_ByteOffset;
										}
									}
								}
							}
						}
						else
						{//not the	"last" longfdb
							for(tw_ByteOffset=0;tw_ByteOffset<26;tw_ByteOffset++)
							{//compare the longfdb which is not the last
								if(gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]]!=p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset])
								{
									if ((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]] >= 'a') && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]] <= 'z'))
									{//if current char is lower letter,try to compare after converting to upper letter
										if (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]]!=(p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset] + 0x20))
										{
											break;
										}
									}
									else
									{
										break;
									}		
								}
							}

							if(tw_ByteOffset==26) //equal  			
							{
								tw_FileLongName-=tw_ByteOffset; 
								if((gc_UserDataBuf[tw_FdbOffset]&0x3f)==1)
								{//current longfdb is the first									
									tc_sts=0;
								} 						
							}
						}
					}
				}
				else
				{//short_fdb
					tw_FileLongName = *(p_mp->pc_LongFileName+4);								
					if(gc_UserDataBuf[tw_FdbOffset+0x0b] & 0x10) 
					{//is dir
						if(p_mp->c_Search_Attribute)
						{//find dir
							p_mp->c_type = 4;
							if(gc_UserDataBuf[tw_FdbOffset]!=0x2e)
							{
								if (((p_mp->c_Search_Mode == K_FIND_DIR_EXTNAME) || (p_mp->c_Search_Mode == K_SPECIFIC_SHORT_FILENAME)))
								{
									goto EXTNAMECOMPARE;
							   	}
								else
								{
									tbt_flag=1;        //the flag which determine if implement the flowing program
							   	}
							}						
						}					
					}
					else if(!(p_mp->c_Search_Attribute))
					{//not dir and not find dir
						if((gc_UserDataBuf[tw_FdbOffset+0x0b]&0x08)!=0x08)
						{
EXTNAMECOMPARE:
							if(p_mp->c_EXTSelect==1)
							{//need compare EXTName						
								for(tc_ExtNum=0;tc_ExtNum<EXT_Name[p_mp->c_type][0];tc_ExtNum++)
								{//compare the ext_name
									for(tw_ByteOffset=0;tw_ByteOffset<3;tw_ByteOffset++)
									{//the max length of ext_name is 3 now 									
										if(gc_UserDataBuf[tw_FdbOffset+0x08+tw_ByteOffset]!=EXT_Name[p_mp->c_type][tw_ByteOffset+tc_PlayMode*3+1])
										{
											tc_PlayMode++;
											break;
										}
									}
									if(tw_ByteOffset>=3)
									{//EXTName is equal
										tbt_flag=1;
										tw_FileLongName-=3;
								        if(p_mp->c_type==1)
								        {
									        tc_PlayMode+=EXT_Name[0][0];
								        }
										break;
									}
								}
							}
							else if(p_mp->c_EXTSelect==0) 
							{//no need compare EXTName
								tbt_flag=1;	                     //the flag determines if implement the flowing programe
								tw_FileLongName-=3;
							}				
														
							if((tbt_flag==1)&&(p_mp->c_type==1))							
							{//voice file
	                        	for(tw_ByteOffset=0;tw_ByteOffset<4;tw_ByteOffset++)
							  	{//the max length of ext_name is 3 now 									
									if(gc_UserDataBuf[tw_FdbOffset+tw_ByteOffset]!=REC[tw_ByteOffset])
									{
										tbt_flag=0;
										break;
									}
								}
							}
						}
					}//not and not find dir

					if(tbt_flag)
					{
						tbt_flag=0;	
						if(p_mp->c_type==1)
						{
							for(tw_ByteOffset=0;tw_ByteOffset<0x04;tw_ByteOffset++)
							{
								if((gc_UserDataBuf[tw_FdbOffset+0x04+tw_ByteOffset]<0x30)||(gc_UserDataBuf[tw_FdbOffset+0x04+tw_ByteOffset]>0x39))
								{
									tc_RecFlag = 0;
								}		
								tdw_Temp_flag =tdw_Temp_flag<<8;			
								tdw_Temp_flag |= gc_UserDataBuf [tw_FdbOffset+0x04+tw_ByteOffset];  //sorts the name of current fdb
							}
						}		

						if(p_mp->c_Search_Mode==K_COUNTER_FILENUM)
						{																		
							if(p_mp->c_Search_Attribute)
							{
								p_mp->w_DirTotalNum++;
							}
							else
							{																	
								if(tc_RecFlag)												
								{
									p_mp->w_FileTotalNum++;
								}
							}											
						}
						else if((p_mp->c_Search_Mode==K_TIME_FINDFDB)||p_mp->c_Search_Mode==K_NAME_FINDFDB)		  //find by create time
						{				
							((U8 *)(&tdw_StartCluster1))[0]=gc_UserDataBuf[tw_FdbOffset+0x15];
							((U8 *)(&tdw_StartCluster1))[1]=gc_UserDataBuf[tw_FdbOffset+0x14];
							((U8 *)(&tdw_StartCluster1))[2]=gc_UserDataBuf[tw_FdbOffset+0x1b];
							((U8 *)(&tdw_StartCluster1))[3]=gc_UserDataBuf[tw_FdbOffset+0x1a];		

							if(tc_RecFlag)
							{			
								if(p_mp->c_Search_Direction)  
								{//find pre						
									if((tdw_Tag0<=tdw_Temp_flag)&&(tdw_Temp_flag<tdw_Tag1))
									{					
										tdw_Tag0= tdw_Temp_flag;
										p_mp->dw_FDB_Cluster=tdw_S_ClusterNum;
										p_mp->dw_FDB_LogAdd=tc_SectorOffset+tdw_SectorAdd;
										p_mp->w_FDB_Offset=tw_FdbOffset;
										tdw_StartCluster3=tdw_StartCluster1;
										p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
										p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
										tbt_SortFlag=1;	
										gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;								
									}							
									else if(tdw_Temp_flag==tdw_Tag1)
									{								
										if(tdw_StartCluster1!=p_mp->dw_File_StartCluster)
										{//startcluster is not equal
											if(!tbt_SameFlag)
											{//current fdb is  before pre fdb which we stored										
												tdw_Tag0= tdw_Temp_flag;
												p_mp->dw_FDB_Cluster=tdw_S_ClusterNum;
												p_mp->dw_FDB_LogAdd=tc_SectorOffset+tdw_SectorAdd;
												p_mp->w_FDB_Offset=tw_FdbOffset;
												tdw_StartCluster3=tdw_StartCluster1;
												p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
										        p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
												tbt_SortFlag=1;
												gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;																					
											}									
										}
										else
										{
											tbt_SameFlag=1;	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -