www.pudn.com > UDiskFileSystem.rar > mx_FFS_dir.cpp
/*************************************************************************/
/* */
/* Copyright (c) 1993-2001 Macronix, Inc. */
/* */
/* PROPRIETARY RIGHTS of Macronix are involved in the */
/* subject matter of this material. All manufacturing, reproduction, */
/* use, and sales rights pertaining to this subject matter are governed */
/* by the license agreement. The recipient of this software implicitly */
/* accepts the terms of the license. */
/* */
/*************************************************************************/
/*************************************************************************/
/* FILE NAME */
/* MX_FFS_DIR.c */
/* DESCRIPTION */
/* This file definition only internal used in File System */
/* AUTHOR */
/* MXIC ISG , Inc. System Application Department */
/* */
/* */
/* HISTORY */
/* 2006/03/16 Test version 0.00 for BCB6 */
/*************************************************************************/
#ifndef MX_FFS_DIR_C
#define MX_FFS_DIR_C
#include "MX_FFS_LAYER1.h"
#include "mx_FFS_Layer2.h"
#include "mx_FFS_fdb.h"
mxDRIVE_PROPERTY Disk_Property[Disk_Num];
mxDISK_HISTORY Disk_History[Disk_Num];
//mxDISK_HISTORY TempDisk_History[2];// for change folder and copy/move file use
//mxFDB_LFN FDBLfn[20];
#ifdef BCB6
#include "main.h"
extern FILE *hFile;
extern void U_Printf(char *fmt,...);
#endif
u_16 Folder_Num = 0;
u_16 File_Num = 0;
/*FAT File System Ready */
/*Get FAT Boot Sector Information and record in Disk History*/
/* IN : */
/* None */
/*OUT: */
/* Return 0 is Ready, 1 is Not Ready */
u_8 MX_FFSReadyGet(void)
{
u_8 Error = FAT_PASS;
u_8 BootSector_Buffer[0x200];
u_8 SystemTypeCode,i = 0;
for(i=0;i (10*PathDepth + 4))
{
Error = FAT_FOLDERPATH_ERROR;
return Error;
}
for(i=0;i<9;i++)
{
FolderMainName[i] = 0x20;
if(i<3)
{
FolderExtName[i] = 0x20;
}
}
FolderExtName[4] = 0;
LayerNum = GetFolderLayer(Path, PathLen);
if(LayerNum == 0xffff)// only folder name....
{
CurrentPathLen = strlen(TempDisk_History.CurrentPath);
for(i=0; i < PathLen ; i++)
{
Disk_History[DiskIndex].CurrentPath[CurrentPathLen + i] = Path[i];
FolderMainName[i] = Path[i];
}
Error = MX_GetFDB(FolderFDB, DiskIndex, FolderMainName, FolderExtName);
Disk_History[DiskIndex] = TempDisk_History;
}
else if(LayerNum == 0) // Disk Root
{
SetDiskHistoryInit(&Disk_History[DiskIndex],Disk_Property[DiskIndex]);
for(i=0; i < PathLen ; i++)
{
Disk_History[DiskIndex].CurrentPath[i] = Path[i];
}
for(i=0;i<10;i++)
{
//MX_GetFDBList(FolderFDB,1,DiskIndex);
MX_GetLFNList(&LFN,1,DiskIndex,1);
*FolderFDB = LFN.FDB_Entry;
if(FolderFDB->attr == ATTR_VOLUME_ID)// find Volume Lable
{
Error = FAT_PASS;
break;
}
}
if(i == 10)
{
Error = FAT_FILE_NOTFIND;
}
Disk_History[DiskIndex] = TempDisk_History;
}
else // other path
{
// Set to Root Start
SetDiskHistoryInit(&Disk_History[DiskIndex],Disk_Property[DiskIndex]);
// Set to Root End
for(i=0; i < 2 ; i++)
{
Disk_History[DiskIndex].CurrentPath[i] = Path[i]; //C:\\
}
//CurrentLayerNum = GetFolderLayer(Disk_History[DiskIndex].CurrentPath, CurrentPathLen);
for(i=1; i <= LayerNum ; i++) // 0 is Root
{
Error = GetFolderLayerName(Path, FolderMainName, i, PathLen);
if(Error != FAT_PASS)
{
break;
}
FolderNameLen = strlen(FolderMainName);
for(j = FolderNameLen ; j<8 ; j++)
{
FolderMainName[j] = 0x20;
}
FolderMainName[8] = 0;
CurrentPathLen = strlen(Disk_History[DiskIndex].CurrentPath);
for(j=0; j < (FolderNameLen+2) ; j++)
{
Disk_History[DiskIndex].CurrentPath[j+CurrentPathLen] = Path[j+CurrentPathLen];// record current Path Name
}
Error = MX_GetFDB(FolderFDB, DiskIndex, FolderMainName, FolderExtName);
if(Error != FAT_PASS)
{
break;
}
MX_SetFolderLinkPath(*FolderFDB,&Disk_History[DiskIndex]);
}
Disk_History[DiskIndex] = TempDisk_History;
}
return Error;
}
/*Get FDB */
/*Get one File or Folder FDB exist in current work directory */
/* IN : */
/* DiskIndex Disk Number */
/* MainName Main File/Folder Name (8 byte) */
/* ExtName Ext. Name(3 bytes) */
/*OUT: */
/* FolderFDB return FDB Data Struct */
/* function return return Fat Error flag */
u_8 MX_GetFDB(mxFDB *FDB_Buf, u_8 DiskIndex, s_8 *MainName, s_8 *ExtName)
{
//u_8 SectorsPerCluster = Disk_Property[DiskIndex].DiskBoot.SectorsPerCluster;
u_32 BytesPerCluster = Disk_Property[DiskIndex].DiskBoot.BytesPerCluster;
u_32 Entry_Num;
u_8 TempBuffer[512],FDB_Buffer[0x20],FDB_Flag;// LFN_Flag = 0;
mxFDB TempFDB[1];
//s_8 FileName_TEMP[9], Extension_TEMP[4];
u_32 i;
u_8 Error,Index;
//j = 0;
Entry_Num = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = 0;
//memcpy(FileName_TEMP, (TEMPBuffer + i), 8);
while(1)
{
//Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex]);
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],0);
if(Error == 1)
{
break;
}
for(Index = 0; Index < (u_8)(BytesPerCluster / 512); Index++)
{
UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
//UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA, SectorsPerCluster, TempBuffer);
for(i= ((Disk_History[DiskIndex].EntryNum % (512/32)) * 32); i<(512); i=i+32)
{
memcpy(FDB_Buffer, (TempBuffer + i), 0x20);
FDB_Flag = Check_FDB(FDB_Buffer, &TempFDB[0], 0);
if((FDB_Flag != FDB_NOUSE) && (FDB_Flag != FDB_DELETE) && (FDB_Flag != FDB_LFNAME))
{
if(strncmp(TempFDB[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(TempFDB[0].extfilename, ExtName, 3) == 0 )
{
TempFDB[0].EntryNum = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = Entry_Num;
*FDB_Buf = TempFDB[0];
return FAT_PASS;
}
}
}
Disk_History[DiskIndex].EntryNum++;
}
}
}
Disk_History[DiskIndex].EntryNum = Entry_Num;
return FAT_FILE_NOTFIND;
}
/*Search Folder */
/* IN : */
/* Path Change Work Full Path(Short Name) */
/* DiskIndex Disk Number */
/* FolderFDB FDB Data Struct From MX_SearchFolder function */
/*OUT: */
/* function return return Fat Error flag */
u_8 MX_ChangeWorkFolder(s_8 *Path, mxFDB FolderFDB, u_8 DiskIndex)
{
u_16 PathLen = 0,CurrentPathLen = 0,i,j;
u_16 LayerNum = 0;//,CurrentLayerNum = 0;
u_8 Error = FAT_PASS;//,FolderNameLen = 0;
PathLen = strlen(Path);
LayerNum = GetFolderLayer(Path, PathLen);
if(PathLen > (10*PathDepth + 4))
{
Error = FAT_FOLDERPATH_ERROR;
return Error;
}
CurrentPathLen = strlen(Disk_History[DiskIndex].CurrentPath);
for(i=0;iLFN_Flag = 1;
LFN_Num = 0;
}
else
{
//FDB_Buf[0].EntryNum = 0;
LFN->LFN_Flag = 0;
}
FDB_Buf[0].EntryNum = Disk_History[DiskIndex].EntryNum;
LFN->FDB_Entry = FDB_Buf[0];
memcpy(&LFN->ShortName[0],FDB_Buf[0].mainfilename,8);
LFN->ShortName[8] = '.';
memcpy(&LFN->ShortName[9],FDB_Buf[0].extfilename,3);
LFN->ShortName[12] = 0;
if((Mode == 0) && ( FDB_Flag == FDB_FILE))
{
if(strncmp(FDB_Buf[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(FDB_Buf[0].extfilename, ExtName, 3) == 0 )
{
//FDB_Buf[0].EntryNum = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = FDB_Buf[0];
return FAT_PASS;
}
}
}
else if((Mode == 1) && ( FDB_Flag == FDB_FOLDER))
{
if(strncmp(FDB_Buf[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(FDB_Buf[0].extfilename, ExtName, 3) == 0 )
{
//FDB_Buf[0].EntryNum = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = FDB_Buf[0];
return FAT_PASS;
}
}
}
else if((Mode != 0) && (Mode != 1))
{
if(strncmp(FDB_Buf[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(FDB_Buf[0].extfilename, ExtName, 3) == 0 )
{
//FDB_Buf[0].EntryNum = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = FDB_Buf[0];
return FAT_PASS;
}
}
}
}
if(FDB_Flag == FDB_LFNAME)
{
LFNIndex = FDB_Buffer[0]&0x1F;
LFN_Num++;
GetLFN_FDB(&FDB_LFN[LFNIndex-1], FDB_Buffer);
}
if((FDB_Flag == FDB_LFNAME) && ((FDB_Buffer[0] & 0x0f) == 0x01))
{
LFN_Flag = 1;
}
Disk_History[DiskIndex].EntryNum++;
}
}
}
Disk_History[DiskIndex].EntryNum = Entry_Num;
return FAT_FILE_NOTFIND;
}
/*Set FDB */
/*Set one File or Folder FDB in current work directory */
/* IN : */
/* Mode 0 Create New FDB, 1, delete FDB, other is modify FDB ==> time,attr,date.*/
/* DiskIndex Disk Number */
/*OUT: */
/* FolderFDB return FDB Data Struct */
/* function return return Fat Error flag */
#if 1
u_8 MX_SetFDB(mxFDB *FDB_Buf, u_8 DiskIndex, u_8 Mode)
{
//u_8 SectorsPerCluster = Disk_Property[DiskIndex].DiskBoot.SectorsPerCluster;
u_32 BytesPerCluster = Disk_Property[DiskIndex].DiskBoot.BytesPerCluster;
u_32 Entry_Num;
u_8 TempBuffer[512],FDB_Buffer[0x20],FDB_Flag;// LFN_Flag = 0;
mxFDB TempFDB[1];
s_8 MainName[9], ExtName[4];
u_32 i;
u_8 Error,Index;
//j = 0;
for(i=0;i<8;i++)
{
MainName[i] = FDB_Buf->mainfilename[i];
}
MainName[8] = 0;
for(i=0;i<3;i++)
{
ExtName[i] = FDB_Buf->extfilename[i];
}
ExtName[i] = 0;
Entry_Num = Disk_History[DiskIndex].EntryNum;
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],1);
//Disk_History[DiskIndex].EntryNum = 0;
//memcpy(FileName_TEMP, (TEMPBuffer + i), 8);
while(1)
{
//Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex]);
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],0);
if(Error == 1)
{
break;
}
for(Index = 0; Index < (u_8)(BytesPerCluster / 512); Index++)
{
UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
//UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA, SectorsPerCluster, TempBuffer);
for(i= ((Disk_History[DiskIndex].EntryNum % (512/32)) * 32); i<(512); i=i+32)
{
memcpy(FDB_Buffer, (TempBuffer + i), 0x20);
FDB_Flag = Check_FDB(FDB_Buffer, &TempFDB[0], 0);
if((FDB_Flag != FDB_NOUSE) && (FDB_Flag != FDB_DELETE) && (FDB_Flag != FDB_LFNAME))
{
if(strncmp(TempFDB[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(TempFDB[0].extfilename, ExtName, 3) == 0 )
{
TempFDB[0].EntryNum = Disk_History[DiskIndex].EntryNum;
//Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = TempFDB[0];
return FAT_PASS;
}
}
}
Disk_History[DiskIndex].EntryNum++;
}
}
}
Disk_History[DiskIndex].EntryNum = Entry_Num;
return FAT_FILE_NOTFIND;
}
#endif
/*Create FDB */
/*Set one File or Folder FDB in current work directory */
/* IN : */
/* Mode 0 Create New FDB, 1, delete FDB, other is modify FDB ==> time,attr,date.*/
/* DiskIndex Disk Number */
/*OUT: */
/* FolderFDB return FDB Data Struct */
/* function return return Fat Error flag */
#if 1
u_8 MX_CeateFDB(mxFDB *FDB_Buf, u_8 DiskIndex, u_8 Mode)
{
//u_8 SectorsPerCluster = Disk_Property[DiskIndex].DiskBoot.SectorsPerCluster;
u_32 BytesPerCluster = Disk_Property[DiskIndex].DiskBoot.BytesPerCluster;
u_32 Entry_Num;
u_8 TempBuffer[512],FDB_Buffer[0x20],FDB_Flag;// LFN_Flag = 0;
mxFDB TempFDB[1];
s_8 MainName[9], ExtName[4];
u_32 i;
u_8 Error,Index;
//j = 0;
for(i=0;i<8;i++)
{
MainName[i] = FDB_Buf->mainfilename[i];
}
MainName[8] = 0;
for(i=0;i<3;i++)
{
ExtName[i] = FDB_Buf->extfilename[i];
}
ExtName[i] = 0;
Entry_Num = Disk_History[DiskIndex].EntryNum;
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],1);
//Disk_History[DiskIndex].EntryNum = 0;
//memcpy(FileName_TEMP, (TEMPBuffer + i), 8);
while(1)
{
//Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex]);
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],0);
if(Error == 1)
{
break;
}
for(Index = 0; Index < (u_8)(BytesPerCluster / 512); Index++)
{
UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
//UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA, SectorsPerCluster, TempBuffer);
for(i= ((Disk_History[DiskIndex].EntryNum % (512/32)) * 32); i<(512); i=i+32)
{
memcpy(FDB_Buffer, (TempBuffer + i), 0x20);
FDB_Flag = Check_FDB(FDB_Buffer, &TempFDB[0], 0);
if((FDB_Flag != FDB_NOUSE) && (FDB_Flag != FDB_DELETE) && (FDB_Flag != FDB_LFNAME))
{
if(strncmp(TempFDB[0].mainfilename, MainName, 8) == 0 )
{
if(strncmp(TempFDB[0].extfilename, ExtName, 3) == 0 )
{
TempFDB[0].EntryNum = Disk_History[DiskIndex].EntryNum;
//Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = TempFDB[0];
return FAT_PASS;
}
}
}
Disk_History[DiskIndex].EntryNum++;
}
}
}
Disk_History[DiskIndex].EntryNum = Entry_Num;
return FAT_FILE_NOTFIND;
}
#endif
//extern void UFI_WriteFile(HANDLE SourceFile, u_32 LBA_START, u_16 LBA_Length, u_8 *Buffer);
u_8 MX_FRename(s_8 *pSrcFileName, s_8 *pTrgFileName)
{
u_8 DiskIndex=0;
// u_8 SectorsPerCluster = Disk_Property[DiskIndex].DiskBoot.SectorsPerCluster;
u_32 BytesPerCluster = Disk_Property[DiskIndex].DiskBoot.BytesPerCluster;
u_32 Entry_Num;
u_8 TempBuffer[512],FDB_Buffer[0x20],FDB_Flag, j,LFN_Flag = 0;
mxFDB FDB_Buf[1];
s_8 MainName1[9]={0},ExtName1[4]={0}, MainName2[9]={0},ExtName2[4]={0};
//s_8 FileName_TEMP[9], Extension_TEMP[4];
u_32 i,pos=0;
u_8 Error,Index;
u_8 LFNCheckSum,LFNIndex,LFN_Num = 0;
mxFDB_LFN FDB_LFN[20];
///*
// U_Printf("aaaa");
for(i=0;ipos)
{
ExtName1[i-pos-1]=pSrcFileName[i];
}
}
MainName1[8]=0;
ExtName1[3]=0;
// U_Printf("old file ext:%s",ExtName1);
//*
for(i=0;ipos)
ExtName2[i-pos-1]=pTrgFileName[i];
}
MainName2[8]=0;
ExtName2[3]=0;
// U_Printf("new file ext:%s",ExtName2);
Entry_Num = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = 0;
//memcpy(FileName_TEMP, (TEMPBuffer + i), 8);
// U_Printf("bbbb");
while(1)
{
//Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex]);
Error = SearchFDBLinkEntry( &Disk_Property[DiskIndex], &Disk_History[DiskIndex],0);
if(Error == 1)
{
break;
}
for(Index = 0; Index < (u_8)(BytesPerCluster / 512); Index++)
{
UFI_ReadFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
// UFI_WriteFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
// U_Printf("cccc");
for(i= ((Disk_History[DiskIndex].EntryNum % (512/32)) * 32); i<512; i=i+32) // 16
{
// U_Printf("dddd");
memcpy(FDB_Buffer, (TempBuffer + i), 0x20);
FDB_Flag = Check_FDB(FDB_Buffer, &FDB_Buf[0], 0);
if(FDB_Flag == FDB_NOUSE)
{
return j;
}
{
{
if(strncmp(FDB_Buf[0].mainfilename, MainName1, 8) == 0 )
{
FDB_Buf[0].mainfilename[8]=0;
// U_Printf("gggg");
if(strncmp(FDB_Buf[0].extfilename, ExtName1, 3) == 0 )
{
FDB_Buf[0].extfilename[3]=0;
// U_Printf("hhhh");
U_Printf("find file:%s.%s",FDB_Buf[0].mainfilename/*MainName1*/,FDB_Buf[0].extfilename);
U_Printf("new file:%s.%s",MainName2,ExtName2);
//FDB_Buf[0].EntryNum = Disk_History[DiskIndex].EntryNum;
Disk_History[DiskIndex].EntryNum = Entry_Num;
//*FDB_Buf = FDB_Buf[0];
memcpy(&FDB_Buffer[0],MainName2,8);
memcpy(&FDB_Buffer[8],ExtName2,3);
memcpy((TempBuffer + i),FDB_Buffer, 0x20);
// UFI_WriteFile(hFile, Disk_History[DiskIndex].CurrentLBA+Index, 1, TempBuffer);
{
// /*
DWORD BytesRead;
SetFilePointer (hFile, (Disk_History[DiskIndex].CurrentLBA+Index * 0x200), NULL, FILE_BEGIN);
U_Printf("SetFilePointer");
WriteFile (hFile, TempBuffer, (1 * 0x200), &BytesRead, NULL);
U_Printf("WriteFile");
// */
}
U_Printf("UFI_Write");
return FAT_PASS;
}
}
}
}
Disk_History[DiskIndex].EntryNum++;
}
}
}
Disk_History[DiskIndex].EntryNum = Entry_Num;
return FAT_FILE_NOTFIND;
}
#endif /*MX_FFS_DIR_C*/