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

📄 dosfdb.c

📁 一种文件系统的结构
💻 C
📖 第 1 页 / 共 2 页
字号:
										}								
									}														
								}
								else
								{//find next
									if((tdw_Tag1<tdw_Temp_flag)&&(tdw_Temp_flag<tdw_Tag0))
									{																
										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;						
									}

									if(tdw_Temp_flag!=tdw_Tag0)
									{
										if(tdw_Temp_flag==tdw_Tag1)	
										{							
											if(tdw_StartCluster1!=p_mp->dw_File_StartCluster)
											{//startcluster is not equal
												if(tbt_SameFlag)
												{//current fdb is after 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;	
											}		
										}
									}								
								}
							}
						}						
						else if(p_mp->c_Search_Mode==K_ORDER_FINDFDB || p_mp->c_Search_Mode == K_FIND_DIR_EXTNAME) //find by	order
						{		
							if(p_mp->c_Search_Direction) 
							{
								// Pre
								if(tw_DirIndex<gw_DirIndex[p_mp->c_type])
								{
									if(tc_FileSkipNumber==0 || p_mp->c_Search_Attribute)
									{
										tw_DirIndex1=tw_DirIndex;
										p_mp->dw_FDB_Cluster=tw_DirIndex;
										p_mp->w_FDB_Offset=tw_FdbOffset;
										p_mp->dw_FDB_LogAdd=tc_SectorOffset+tdw_SectorAdd;
										p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
									   	p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
										gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;	
										tbt_SortFlag=1;
									}
									else 
									{
										tw_DirIndex1=tw_DirIndex;
										tc_FDB_Cluster[Pointer]=tw_DirIndex;
										tc_FDB_Offset[Pointer]=tw_FdbOffset;
										tc_FDB_LogAdd[Pointer]=tc_SectorOffset+tdw_SectorAdd;
										tc_LFDB_LogAdd1[Pointer]=tdw_FDB_LogAdd1;
									   	tc_LFDB_LogAdd0[Pointer]=tdw_FDB_LogAdd0;
										tc_File_Type[Pointer]=tc_PlayMode;	
										Pointer++;
										gc_FileSkipNumber--;
										if(Pointer==tc_FileSkipNumber)
										{
											tbt_SortFlag=1;
											Pointer=0;
										}
									}
								}
							}
							else
							{  		
								// Next										 
								if(tw_DirIndex>(gw_DirIndex[p_mp->c_type]))
								{
									p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;//add for DRM
								 	p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;//add for DRM
									gw_DirIndex[p_mp->c_type] = tw_DirIndex;
									tc_sts=0;	 
									gb_FindFile=1;	// maxliao 20070403																									
								}			
							}
						}
						else if(p_mp->c_Search_Mode==K_SPECIFIC_STARTCLUSTER)	//find by StartCluster
						{
							((U8 *)(&tdw_StartCluster))[0]=gc_UserDataBuf[tw_FdbOffset+0x15];
							((U8 *)(&tdw_StartCluster))[1]=gc_UserDataBuf[tw_FdbOffset+0x14];
							((U8 *)(&tdw_StartCluster))[2]=gc_UserDataBuf[tw_FdbOffset+0x1b];
							((U8 *)(&tdw_StartCluster))[3]=gc_UserDataBuf[tw_FdbOffset+0x1a];
							if(tdw_StartCluster==p_mp->Compare.dw_StartCluster)
							{
								tc_sts=0;
							} 						
						}
						else if(p_mp->c_Search_Mode==K_SPECIFIC_SHORT_FILENAME)
						{//find by short file name
							tw_FileLongName--;	

							for(tw_ByteOffset=0; tw_ByteOffset<tw_FileLongName;tw_ByteOffset++)
							{//Compare shortfdb												
								if(gc_UserDataBuf[tw_FdbOffset+tw_ByteOffset]!=p_mp->pc_LongFileName[5+tw_ByteOffset])
								{
									break;
								}
							}//compare shortfdb								

							if(tw_ByteOffset==tw_FileLongName)
							{//short file name is equal						
								p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
								p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
								tc_sts=0;
							}						
						}					
					}
			 	}//short_fdb
	
				if(!tc_sts) //get  what we want to get
				{
					if((gb_TriggerFileSkip==0) || (tc_FileSkipNumber==0))
					{
NextFIND:
						if(p_mp->c_Search_Attribute)
						{
							gw_DirIndex[p_mp->c_type] = tw_DirIndex;
						}

						if (p_mp->c_Search_Mode < K_SPECIFIC_LONG_FILENAME)
						{//查找指定文件不需要给c_FileType赋值 
							gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;							
						}
						else if (p_mp->c_Search_Mode == K_SPECIFIC_LONG_FILENAME)
						{
							tw_FdbOffset+=32;
							if (tw_FdbOffset == 0x200)
							{
								tw_FdbOffset = 0;
								p_mp->dw_LongFDB_LogAdd1 = tdw_FDB_LogAdd0;	
								p_mp->dw_LongFDB_LogAdd0 = tc_SectorOffset+tdw_SectorAdd;
								tc_SectorOffset ++;
								if (tc_SectorOffset == gc_DOS_SectorPerCluster)
								{
									tdw_S_ClusterNum = DOS_GetNextCluster(tdw_S_ClusterNum,1);
									tdw_SectorAdd=DOS_ClusterLogicAddr(tdw_S_ClusterNum);
									tc_SectorOffset = 0;
								}
							}
							else
							{
								p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
								p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
							}
						}
						
						p_mp->dw_FDB_Cluster=tdw_S_ClusterNum;
						p_mp->dw_FDB_LogAdd=tdw_SectorAdd+tc_SectorOffset;
						p_mp->w_FDB_Offset=tw_FdbOffset;
						p_mp->dw_FDB_StartCluster=tdw_FDBClusterNum;
						return(0); 					
					}
					else
					{
						if(gb_FindFile==1)
						{
							gb_FindFile=0;
							gc_FileSkipNumber-=1;
							if(gc_FileSkipNumber==0)
							{
								goto NextFIND;
							}
						}
					}	
				}
				else
				{//not get what we want directly
					if(tc_sts==1)
					{//the	fdb is end or the mode oversteps  				
						if(tbt_SortFlag==1)
						{//sort success 
							if(p_mp->c_Search_Direction && !(p_mp->c_Search_Attribute) && tc_FileSkipNumber!=0)
							{
								tw_DirIndex1=tc_FDB_Cluster[Pointer];
								p_mp->dw_FDB_Cluster=tc_FDB_Cluster[Pointer];
								p_mp->w_FDB_Offset=tc_FDB_Offset[Pointer];
								p_mp->dw_FDB_LogAdd=tc_FDB_LogAdd[Pointer];
								p_mp->dw_LongFDB_LogAdd1=tc_LFDB_LogAdd1[Pointer];
							   	p_mp->dw_LongFDB_LogAdd0=tc_LFDB_LogAdd0[Pointer];
								gs_File_FCB[p_mp->c_type].c_FileType = tc_File_Type[Pointer];	
							}	

							tbt_SortFlag=0;	
							tbt_SameFlag=0;
							p_mp->dw_File_StartCluster=tdw_StartCluster3;          //save startcluster of current fdb
							p_mp->Compare.dw_BubbleFlag=tdw_Tag0;						
							p_mp->dw_FDB_StartCluster=tdw_FDBClusterNum;
							gw_DirIndex[p_mp->c_type] = tw_DirIndex1;
							return(0);
						}
						else
						{
							p_mp->dw_FDB_Cluster = tdw_S_ClusterNum;
							p_mp->dw_FDB_LogAdd = tdw_SectorAdd+tc_SectorOffset;
							p_mp->w_FDB_Offset = tw_FdbOffset;
							p_mp->dw_FDB_StartCluster = tdw_FDBClusterNum;
							return(1); 			
						}
					}					
				}//not	get what we want directly
			}//for(tw_FdbOffset=tw_Temp_FdbOffset;tw_FdbOffset<K_DOS_SectorSize;tw_FdbOffset+=32)--------------->find in one sector
			tdw_FDB_LogAdd1=tdw_FDB_LogAdd0;
			tdw_FDB_LogAdd0=tdw_SectorAdd+tc_SectorOffset;						
		}//for(tc_SectorOffset=tc_Temp_SectorOffset;tc_SectorOffset<tdw_Find_ClusterSize;tc_SectorOffset++)--------->find in one cluster
		tdw_S_ClusterNum=DOS_GetNextCluster(tdw_S_ClusterNum,1); 		
	}//while(tdw_S_ClusterNum<0xffff)------------------------------------------------------------------------->find in one dir

	if(tbt_SortFlag)
	{//sort success 											
		if(p_mp->c_Search_Direction && (p_mp->c_Search_Attribute==0) && (tc_FileSkipNumber!=0))
		{
			tw_DirIndex1=tc_FDB_Cluster[Pointer];
			p_mp->dw_FDB_Cluster=tc_FDB_Cluster[Pointer];
			p_mp->w_FDB_Offset=tc_FDB_Offset[Pointer];
			p_mp->dw_FDB_LogAdd=tc_FDB_LogAdd[Pointer];
			p_mp->dw_LongFDB_LogAdd1=tc_LFDB_LogAdd1[Pointer];
		   	p_mp->dw_LongFDB_LogAdd0=tc_LFDB_LogAdd0[Pointer];
			gs_File_FCB[p_mp->c_type].c_FileType = tc_File_Type[Pointer];
		}	
												
		tbt_SortFlag=0;	
		tbt_SameFlag=0;
		p_mp->dw_File_StartCluster=tdw_StartCluster3;//save startcluster of current fdb
		p_mp->Compare.dw_BubbleFlag=tdw_Tag0;						
		p_mp->dw_FDB_StartCluster=tdw_FDBClusterNum;						
		gw_DirIndex[p_mp->c_type] = tw_DirIndex1;
		return(0); 
	}
	else
	{		
		p_mp->dw_FDB_Cluster = tdw_S_ClusterNum;
		p_mp->dw_FDB_LogAdd = tdw_SectorAdd+tc_SectorOffset;
		p_mp->w_FDB_Offset = tw_FdbOffset;
		p_mp->dw_FDB_StartCluster=tdw_FDBClusterNum;	
		return(1); 						
	}
}


U8 Dos_GetFileLongName(U8 tc_FileHandle,U8 *tpc_LongName)
{
	U16	i;
	U8	j,k;
	U8	tc_Chksum=0;
	U8	tc_EndSign=0;
	U8	tc_LogAddrNum=1;
	U8  tc_Array[26];
	U8  tc_DOS_FDBSize1;
	U16 tw_XBYTEstart;
	U16	tw_FDB_Offset,tw_LFN_Offset,tw_FileNameLen;
	U32	tdw_Addr;

	tdw_Addr=gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd;
	gc_ReadWriteDataArea=1;
	DOS_Read_LogicSector(tdw_Addr,1);

	tc_DOS_FDBSize1=gs_File_FCB[tc_FileHandle].w_FDB_Offset >> 9;						
	tw_FDB_Offset=gs_File_FCB[tc_FileHandle].w_FDB_Offset & 0x1FF;
	if(tc_DOS_FDBSize1)
	{
		tw_XBYTEstart=HOST_BUF_SA+((U16)tc_DOS_FDBSize1<<9);
		MoveUSBtoUserDataBuf(tw_XBYTEstart);
	}

	memcpy(tc_Array,&gc_UserDataBuf[tw_FDB_Offset],11);
	j=0;	
	for(i=11;i!=0;i--)
	{
		tc_Chksum = ((tc_Chksum & 1) ? 0x80 : 0) + (tc_Chksum >> 1) + gc_UserDataBuf[tw_FDB_Offset+j];
		j++;
	}
	
	tw_LFN_Offset=tw_FDB_Offset;
	i=5;
	while(i<512)
	{	 
		if(tw_LFN_Offset>=32)
		{	
			tw_LFN_Offset-=32;
			
		} 
		else
		{
			if(tc_DOS_FDBSize1)
			{
				tc_DOS_FDBSize1--;
				tw_XBYTEstart=HOST_BUF_SA+((U16)tc_DOS_FDBSize1<<9);
				MoveUSBtoUserDataBuf(tw_XBYTEstart);
				tw_LFN_Offset=512-32;
			}
			else
			{
				if(tc_LogAddrNum==1)
				{
					tdw_Addr=gs_File_FCB[tc_FileHandle].dw_LongFDB_LogAdd0;
					tc_LogAddrNum=2;
				} 
				else if(tc_LogAddrNum==2) 
				{
		   			tdw_Addr=gs_File_FCB[tc_FileHandle].dw_LongFDB_LogAdd1;
				}
				gc_ReadWriteDataArea=1;//与媒体发生读写的缓冲区为gc_UserDataBuf[512]
				DOS_Read_LogicSector(tdw_Addr,1);
				tw_LFN_Offset=512-32;
			}
		}
		
		if((gc_UserDataBuf[tw_LFN_Offset]&0x40)==0x40)
		{
			tc_EndSign=1;//置结束标志
		}	

		if(((gc_UserDataBuf[tw_LFN_Offset+11]==0x0f)||(gc_UserDataBuf[tw_LFN_Offset+11]==0x3f))&&(gc_UserDataBuf[tw_LFN_Offset+12]==0x00)&&(gc_UserDataBuf[tw_LFN_Offset+13]==tc_Chksum))
		{  	 
			   	j=1;
				k=0;
			 	while(j<32)
				{
					if(j==11)
					{
				 		j+=3; //跳过固定字节 
					}
					if(j==26)
					{
						j+=2;////跳过固定字节
					}
				  
					{
				  		tpc_LongName[i]=gc_UserDataBuf[tw_LFN_Offset+j];//fill	the long file name into the array
						i++;
					}
				  j++;
				  k++;
				}
		} else {
				j=0;
				gc_ReadWriteDataArea=1;//与媒体发生读写的缓冲区为gc_UserDataBuf[512]
				DOS_Read_LogicSector(gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd,1);
				tpc_LongName[0]=0;
				tpc_LongName[1]=0;
				tpc_LongName[3]=0;
				tpc_LongName[2]=1;	// Short filename
				while(j<8)
				{
					tpc_LongName[5+j]=tc_Array[j];
					if(tc_Array[j]==0x20)
					{
						break;
					}	
					j++;
				}

				if (tc_Array[8] != 0x20)
				{
					tpc_LongName[5+j]=0x2e;
					j+=1;
				}
				if (tc_Array[8] != 0x20)
				{
					tpc_LongName[5+j]=tc_Array[8];
					j++;
					if (tc_Array[9] != 0x20)
					{
						tpc_LongName[5+j]=tc_Array[9];
						j++;
						if (tc_Array[10] != 0x20)
						{
							tpc_LongName[5+j]=tc_Array[10];
							j++;
					   	}
				  	}
			   	}
				
				tpc_LongName[4]=j;
				
				return 0;		
		}
   		
		if(tc_EndSign) //when end,fill the first 3 bytes indicate the information of long file name!
		{		
			tpc_LongName[0]=gc_UserDataBuf[tw_LFN_Offset];
			tpc_LongName[2]=0;	// Long filename

			for (j = 26; j > 0; j=j-2)
			{
				if((gc_UserDataBuf[tw_LFN_Offset+Unicode_Offset[j-1]]==0)&&(gc_UserDataBuf[tw_LFN_Offset+Unicode_Offset[j-2]]==0))
				{
					break; 
				}
			}
			tpc_LongName[1] = j;
			tw_FileNameLen=(((tpc_LongName[0]&0x3f)-1)*26)+(26-tpc_LongName[1]-1);
			tpc_LongName[3] = ((U8 *)(&tw_FileNameLen))[0];            //save the high 4bit 
			tpc_LongName[4] = ((U8 *)(&tw_FileNameLen))[1];          //save the low 4bit
			return 0;	
			
		}
	}

	return 0;
}

⌨️ 快捷键说明

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