JD2022-TU1/main/extern/Camcam/Tools/FileIO.cpp

221 lines
4 KiB
C++

#include "scene.h"
//#pragma optimize("",off)
#ifdef SUPPORT_BINARIZE
#define EndString "C0DE2008C0DE2009"
u32 FILEIO_BinarizeMode = 0;
UNIC_Dico BinarizationDico;
u32 FILEIO_CurrentBase = 0;
typedef struct FILIO_Desc_
{
u32 Pos;
u32 Lenght;
} FILIO_Desc;
FILIO_Desc FILEIO_FileDesc[2048] ;
u32 FILEIO_FileDescNum = 0;
/*
DWORD GetTempPath(
DWORD nBufferLength,
LPTSTR lpBuffer
);
*/
u32 FILEIO_IsModePackedEXE()
{
return FILEIO_BinarizeMode;
}
#else
u32 FILEIO_IsModePackedEXE()
{
return 0;
}
#endif
u32 FILEIO_Binarize()
{
#ifdef SUPPORT_BINARIZE
BinarizationDico.Init();
FILEIO_BinarizeMode = 1;
FILEIO_CurrentBase = 0;
#endif
return 0;
}
u32 FILEIO_DetectPackedExeMode(char *EXEname)
{
#ifdef SUPPORT_BINARIZE
char Buf[2048];
u32 Loaded = 0;
u32 EXESize = 0;
u32 Return = 0;
u32 TheoricalDataBase = 0;
FILE *EXEFile = fopen(EXEname,"rb");
if (EXEFile)
{
while (Loaded = fread(Buf,1,2048,EXEFile))
{
EXESize += Loaded;
}
fclose(EXEFile);
EXEFile = fopen(EXEname,"rb");
fseek(EXEFile,EXESize-strlen(EndString) - 4,0);
fread(&TheoricalDataBase,1,4,EXEFile);
fread(Buf,1,strlen(EndString),EXEFile);
u32 ToRead = EXESize - TheoricalDataBase - strlen(EndString);
Buf[strlen(EndString)] = 0;
if (strcmp(Buf ,EndString ) == 0)
{
/* Packed Mode */
FILEIO_BinarizeMode = 2;
/* UnPack ZCC */
fclose(EXEFile);
sprintf(Buf,"%s",EXEname);
SetFileNameExtend(Buf,'.ZCC');
FILE *ZCCFile = fopen(Buf,"wb");
EXEFile = fopen(EXEname,"rb");
fseek(EXEFile,TheoricalDataBase,0);
while (ToRead)
{
Loaded = ToRead > 2048 ? 2048 : ToRead;
fread(Buf,1,Loaded,EXEFile);
fwrite(Buf,1,Loaded,ZCCFile);
ToRead -= Loaded;
}
fclose(EXEFile);
fclose(ZCCFile);
return 1;
}
fclose(EXEFile);
}
#endif
return 0;
}
void CLBKDico1(char *Filname,void *USRP)
{
WORLD *pScene = (WORLD *)USRP;
pScene ->PACK_ADDREFFILE(Filname);
}
u32 FILEIO_PackIntoExe(WORLD *pScene,char *EXEname,char *DSTname)
{
#ifdef SUPPORT_BINARIZE
char Buf[2048];
u32 DataBase;
DataBase = 0;
if (!FILEIO_BinarizeMode) return 0;
u32 Loaded = 0;
/* 1 Copy EXE */
FILE *F = fopen(EXEname,"rb");
FILE *FDST = fopen(DSTname,"wb");
if (!FDST) return 0;
if (F)
{
while (Loaded = fread(Buf,1,2048,F))
{
fwrite(Buf,1,Loaded,FDST);
DataBase += Loaded;
}
}
/* 2 Add ZCC */
SetFileNameExtend(DSTname,'.ZCC');
pScene->PackFileDico.Init();
BinarizationDico.EnumWords(CLBKDico1,pScene,0);
pScene->PACK(DSTname,1);
F = fopen(DSTname,"rb");
if (F)
{
while (Loaded = fread(Buf,1,2048,F))
{
fwrite(Buf,1,Loaded,FDST);
}
fclose(F);
}
SetFileNameExtend(DSTname,'.EXE');
/* Add special code */
fwrite(&DataBase,1,4,FDST);
sprintf(Buf,EndString);
fwrite(Buf,1,strlen(Buf),FDST);
fclose(FDST);
#endif
return 0;
}
u32 IsReadMode(const char * _Mode)
{
while (*_Mode)
{
if ((*_Mode == 'r') ||(*_Mode == 'R')) return 1;
_Mode++;
}
return 0;
}
extern u32 GetFileNameExtend(char *TRACKqs);
FILE * CC_fopen(const char * _Filename, const char * _Mode)
{
#ifdef SUPPORT_BINARIZE
if (FILEIO_BinarizeMode == 1)
{
u32 OK = 1;
if (IsReadMode(_Mode))
{
u32 Extention = GetFileNameExtend((char * )_Filename);
if (Extention == '.XML')
OK = 0;
if (Extention == '.EXE')
OK = 0;
} else
OK = 0;
char CurrentPath[1024];
GetCurrentDirectory(1024,CurrentPath);
char *Dir,*Fln;
Fln = (char*)_Filename;
Dir = CurrentPath;
while ((*Fln == *Dir) && *Dir) {Fln++;Dir++;};
if (*Dir == 0)
{
sprintf(CurrentPath,"./%s",Fln);
_Filename = CurrentPath;
}
if (_Filename[1] == ':') OK = 0;
if (!FILEIO_BinarizeMode) OK = 0;
if (!OK) return fopen(_Filename, _Mode);
/* Start binarize here */
if (FILEIO_BinarizeMode == 1)
{
if (BinarizationDico.IsExist((char *)_Filename) == -1)
{
FILE *F = fopen(_Filename,"rb");
if (F)
{
UnicID OutID;
BinarizationDico.GetUnic(&OutID,(char*)_Filename);
fclose(F);
}
}
}
}
#endif
return fopen(_Filename, _Mode);
}
int CC_fclose(FILE * _File)
{
return fclose(_File);
}