目前的版本,仅支持对根目录的文件表进行读取。子目录下面的还没开始研究…… #ifndef _MYFDT_H_ #define _MYFDT_H_ typedef unsigned char U8; typedef unsigned short int U16; typedef unsigned long int U32; typedef U8 Type_FDTIndex; typedef struct{ U16 u16Year; U8 u8Month; U8 u8Day; }MyDate_st; typedef struct{ U8 u8Hour; U8 u8Minute; U8 u8Second; }MyTime_st; class CMyFDT{ protected: #define FDT_START_ADDR (0x2600U) #define FDT_END_ADDR (0x41FFU) #define FDT_INFO_LENGTH (32U) #define FDT_INDEX_MAX ((Type_FDTIndex)((FDT_END_ADDR-FDT_START_ADDR+1U)/FDT_INFO_LENGTH)) typedef struct{ TCHAR tcFileName[9]; TCHAR tcExtName[4]; U8 u8Ability; U8 u8NoUse[11]; U16 u16ModifyTime; U16 u16ModifyDate; U16 u16FisrtCluster; U32 u32FileLength; }MyFDTElement_st; MyFDTElement_st m_FDT[FDT_INDEX_MAX]; Type_FDTIndex m_IndexCnt; public: CMyFDT(); BOOL LoadFDTInfo(TCHAR u8File_p[]);// 参数为磁盘镜像文件首地址 Type_FDTIndex GetIndexCnt(); TCHAR *GetFileName(Type_FDTIndex uIndex,TCHAR *u8FileName_p=NULL); TCHAR *GetExtName(Type_FDTIndex uIndex,TCHAR *u8ExtName_p=NULL); BOOL GetFileExist(Type_FDTIndex uIndex); U8 GetAbility(Type_FDTIndex uIndex); void GetModifyDate(Type_FDTIndex uIndex,MyDate_st *); void GetModifyTime(Type_FDTIndex uIndex,MyTime_st *); U16 GetFisrtCluster(Type_FDTIndex uIndex); U32 GetFileLength(Type_FDTIndex uIndex); }; #endif /* _MYFDT_H_ */ #include "MyFDT.h" TCHAR *TrimRight(TCHAR *tcBuff) { U32 u32Len; u32Len = _z_Strlen(tcBuff); for(U32 i=u32Len;i>0;i--){ if((U8)(tcBuff[i-1]) == ' '){ tcBuff[i-1] = '/0'; } else{ break; } } return tcBuff; } CMyFDT::CMyFDT() { m_IndexCnt = 0; memset(m_FDT,'/0',sizeof(m_FDT)); } BOOL CMyFDT::LoadFDTInfo(TCHAR u8FilePt[]) { TCHAR *tcCrt_p; BOOL bRet; bRet = TRUE; tcCrt_p = u8FilePt + FDT_START_ADDR; while(tcCrt_p[0] != '/0'){ TCHAR tcFileBuff[9]; memset(tcFileBuff,'/0',sizeof(tcFileBuff)); memcpy(tcFileBuff,&tcCrt_p[0],8); memcpy(m_FDT[m_IndexCnt].tcFileName,TrimRight(tcFileBuff),8); memset(tcFileBuff,'/0',sizeof(tcFileBuff)); memcpy(tcFileBuff,&tcCrt_p[8],3); memcpy(m_FDT[m_IndexCnt].tcExtName,TrimRight(tcFileBuff),3); m_FDT[m_IndexCnt].u8Ability = (TBYTE)tcCrt_p[11]; memcpy(m_FDT[m_IndexCnt].u8NoUse,&(tcCrt_p[12]),10); m_FDT[m_IndexCnt].u16ModifyTime = (U8)tcCrt_p[22] + ((U8)tcCrt_p[23]*0x100); m_FDT[m_IndexCnt].u16ModifyDate = (U8)tcCrt_p[24] + ((U8)tcCrt_p[25]*0x100); m_FDT[m_IndexCnt].u16FisrtCluster = (U8)tcCrt_p[26] + ((U8)tcCrt_p[27]*0x100); m_FDT[m_IndexCnt].u32FileLength = (U8)tcCrt_p[28] + ((U8)tcCrt_p[29]*0x100)+ ((U8)tcCrt_p[30]*0x10000)+ ((U8)tcCrt_p[31]*0x1000000); tcCrt_p += FDT_INFO_LENGTH; m_IndexCnt ++; } if(m_IndexCnt==0){ bRet = FALSE; } return bRet; } Type_FDTIndex CMyFDT::GetIndexCnt() { return m_IndexCnt; } TCHAR *CMyFDT::GetFileName(Type_FDTIndex uIndex,TCHAR *u8FileName_p) { if(u8FileName_p!=NULL){ strcpy(u8FileName_p,m_FDT[uIndex].tcFileName); } return m_FDT[uIndex].tcFileName; } TCHAR *CMyFDT::GetExtName(Type_FDTIndex uIndex,TCHAR *u8ExtName_p) { if(u8ExtName_p!=NULL){ _z_Strcpy(u8ExtName_p,(PTCHAR)m_FDT[uIndex].tcExtName); } return m_FDT[uIndex].tcExtName; } BOOL CMyFDT::GetFileExist(Type_FDTIndex uIndex) { BOOL bRet = TRUE; if((U8)m_FDT[uIndex].tcFileName[0] == 0xE5){ bRet = FALSE; } else if((U8)m_FDT[uIndex].tcFileName[0] == 0x00U){ bRet = FALSE; } return bRet; } U8 CMyFDT::GetAbility(Type_FDTIndex uIndex) { return m_FDT[uIndex].u8Ability; } void CMyFDT::GetModifyDate(Type_FDTIndex uIndex,MyDate_st *stDate_p) { stDate_p->u16Year = ((m_FDT[uIndex].u16ModifyDate & 0xFE00) >> 9) + 1980; stDate_p->u8Month = (m_FDT[uIndex].u16ModifyDate & 0x01E0) >> 5; stDate_p->u8Day = (m_FDT[uIndex].u16ModifyDate & 0x001F); } void CMyFDT::GetModifyTime(Type_FDTIndex uIndex,MyTime_st *stTime_p) { stTime_p->u8Hour = ((m_FDT[uIndex].u16ModifyTime & 0xF800) >> 11); stTime_p->u8Minute = (m_FDT[uIndex].u16ModifyTime & 0x07E0) >> 5; stTime_p->u8Second = (m_FDT[uIndex].u16ModifyTime & 0x001F); } U16 CMyFDT::GetFisrtCluster(Type_FDTIndex uIndex) { return m_FDT[uIndex].u16FisrtCluster; } U32 CMyFDT::GetFileLength(Type_FDTIndex uIndex) { return m_FDT[uIndex].u32FileLength; }