📄 dosfdb.c
字号:
}
}
}
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 + -