/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2007.06.21 * ³» ¿ë : ÆÐó * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "BSTreeLinkedList.h" #include "PatcherDlg.h" #define MAX_PACKS 128 class cPatcherDlg; class ClassDesc; enum ePatchStatus; /// .pack ÆÄÀÏ·Î ÀúÀåÀÌ ¾ÈµÇ¾ß ÇÏ´Â Æú´õµé. - # script Æú´õ°¡ Ç×»ó ¸¶Áö¸·¿¡ ÀÖ¾î¾ß ÇÔ. const char* const gUnpackFolder[] = { "sound", "launcher", "hackshield", "script" }; /// Ŭ¶óÀ̾ðÆ®ÀÇ ÆÄÀÏ Á¤º¸¸¦ ¸ðÀ» Æú´õµé. const char* const gCheckFolder[] = { "data", "script", "sound", "miles", "language", "hackshield" }; const char* const SCRIPT_DIRECTORY = "script"; const DWORD g16KBYTE = 16384; // # script Æú´õ°¡ Ç×»ó ¸¶Áö¸·¿¡ ÀÖ¾î¾ß ÇÔ. enum eUnpackFolder { FOLDER_SOUND = 0, FOLDER_LAUNCHER, FOLDER_HACKSHIELD, FOLDER_SCRIPT, UNPACK_FOLDER_COUNT, }; enum eCheckFolder { CHECK_FOLDER_DATA = 0, CHECK_FOLDER_SCRIPT, CHECK_FOLDER_SOUND, CHECK_FOLDER_SOUND_MILES, CHECK_FOLDER_LANGUAGE, CHECK_FOLDER_HACKSHIELD, CHECK_FOLDER_COUNT }; enum eMAKELIST_RETURN_VALUE { eMAKELIST_SUCCESS, eERROR_MAKELIST_WRONG_HEADER, eERROR_MAKELIST_WRONG_EXECUTE, eERROR_MAKELIST_DIFF_PATCHLIST, eERROR_MAKELIST_PARSE, eERROR_MAKELIST_END_APP, }; struct sFilePathInfo { char fullPath [ MAX_PATH ]; char rootFolder[ _MAX_DIR ]; char packFolder[ _MAX_DIR ]; char fileName [ _MAX_DIR ]; sFilePathInfo() { memset( fullPath, 0, sizeof( fullPath )); memset( rootFolder, 0, sizeof( rootFolder )); memset( packFolder, 0, sizeof( packFolder )); memset( fileName, 0, sizeof( fileName )); } }; struct Packfile { char directory[ 1024 ]; // µð·ºÅ丮 }; struct Packlist { Packfile* pack; ULONG offset; // ¿ÀÇÁ¼Â ULONG length; // Àüü°¹¼ö }; struct Patchfile { sFilePathInfo fileInfo; // ÆÄÀÏÀ̸§ Á¤º¸ DWORD sizeHigh; // ÆÄÀÏÅ©±â DWORD sizeLow; // ÆÄÀÏÅ©±â FILETIME writeTime; // ÆÄÀϳ¯Â¥ }; typedef tPointerHashMap cPatchfileList; struct sPackUpdateInfo { cPatchfileList patchfiles; CZipStringArray updateFiles; }; struct Patchlist { Patchfile* file; // ¾÷µ¥ÀÌÆ® ÆÄÀÏ ±¸Á¶Ã¼ ULONG offset; // ¿ÀÇÁ¼Â ULONG length; // Àüü°¹¼ö }; /// ÆÐó class cPatcher { public: cPatcher( cPatcherDlg* dlg ); ~cPatcher(); void Clear(); void Init( HWND wnd, HINSTANCE instance ); DWORD ThreadProc(); void StopWorking(); bool IsWorking() const; bool IsEndIO() const; void SetExcuteMode( eCLIENT_EXECUTE_MODE mode ) { mExecuteMode = mode; } unsigned long GetLoginIP(); bool PatchlistCheck(); char* GetWorkDirectory(){ return m_currentDirectory; } protected: eMAKELIST_RETURN_VALUE MakeList(char* buffer); void SetProgressMax( ePatchStatus status, int max ); void SetProgressPos( const char* fileName, int pos ); private: int GetString(int id, char* buffer, int bufferSize ); bool UnpackPatchList( char** buffer, DWORD *bufferLen ); void FileTimeToDOS(FILETIME* filetime); bool UpdateNoPackFile(Patchfile* patchfile, char* buffer, DWORD bufferLen); bool UpdatePackFile( Patchfile* patchfile, char* buffer, DWORD bufferLen , cFilePack *pack ); int Search(char* root, char* sub, bool opcode); HANDLE GetProcessList( bool* bFuncFailed ); bool CheckPackFile( sFilePathInfo* fileName ); bool SetPackFileNameInfo( char* fullPath, sFilePathInfo* fileInfo ); void EventWrite(LPCTSTR format, ...); void ErrorPrint(char *msg); void ErrorMessageBox(LPCTSTR caption, LPCTSTR format, ...); private: /// ´ÙÀ̾ó·Î±× cPatcherDlg* mDlg; HWND mWnd; HINSTANCE mInstance; bool mEndApp; bool mEndIO; char m_currentDirectory[ MAX_PATH ]; Packlist m_packlist; /// Àüü Á¤º¸ tPointerHashMap mPackPatchList; tPointerHashMap mUnPackPatchList; /// ºÐ¼®ÈÄ °ü¸® Á¤º¸(°¢ pack ÆÄÀϺ°·Î ¾÷µ¥ÀÌÆ® ÇØ¾ßÇÒ Á¤º¸µé) tPointerHashMap mPackUpdateFileMap; /// ÁøÇà¹Ù unsigned int mNumPatchFiles; /// loader ClassDesc* m_libClassDesc; /// ¹öÁ¯ Á¤º¸ Ã¼Å©ÇØ¼­ ¸ðµç pack ÆÄÀÏ Áö¿ì±â bool mDelAllPack; // eCLIENT_EXECUTE_MODE eCLIENT_EXECUTE_MODE mExecuteMode; char mLoginIP [ MAX_PATH ]; char mHostAddr[ MAX_PATH ]; char mHostUrl [ MAX_PATH ]; char mHostList[ MAX_PATH ]; public: static DWORD WINAPI LoaderProgressRoutine( DWORD totalFileSize, DWORD totalBytesTransferred, void* data ); }; inline bool cPatcher::IsWorking() const { return !mEndApp; } inline bool cPatcher::IsEndIO() const { return mEndIO; }