#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); }