221 lines
4 KiB
C++
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);
|
|
}
|
|
|