Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "StdAfx.h"
- #include "PythonApplication.h"
- #include "ProcessScanner.h"
- #include "PythonExceptionSender.h"
- #include "resource.h"
- #include "Version.h"
- #ifdef ENABLE_CHECK_FILES_MD5
- #include "md5.h"
- #include <windows.h>
- #endif
- #ifdef _DEBUG
- #include <crtdbg.h>
- #endif
- #include "../eterPack/EterPackManager.h"
- #include "../eterLib/Util.h"
- #include "../CWebBrowser/CWebBrowser.h"
- #include "../eterBase/CPostIt.h"
- #include "CheckLatestFiles.h"
- #include "Hackshield.h"
- #include "NProtectGameGuard.h"
- #include "WiseLogicXTrap.h"
- extern "C" {
- extern int _fltused;
- volatile int _AVOID_FLOATING_POINT_LIBRARY_BUG = _fltused;
- };
- #pragma comment(linker, "/NODEFAULTLIB:libci.lib")
- #pragma comment( lib, "version.lib" )
- //#ifdef _DEBUG
- //#pragma comment( lib, "python2_d.lib" )
- //#else
- #pragma comment( lib, "python2.lib" )
- //#endif
- #pragma comment( lib, "imagehlp.lib" )
- #pragma comment( lib, "devil.lib" )
- #pragma comment( lib, "granny2.lib" )
- #pragma comment( lib, "mss32.lib" )
- #pragma comment( lib, "winmm.lib" )
- #pragma comment( lib, "imm32.lib" )
- #pragma comment( lib, "oldnames.lib" )
- #pragma comment( lib, "SpeedTreeRT.lib" )
- #pragma comment( lib, "dinput8.lib" )
- #pragma comment( lib, "dxguid.lib" )
- #pragma comment( lib, "ws2_32.lib" )
- #pragma comment( lib, "strmiids.lib" )
- #pragma comment( lib, "ddraw.lib" )
- #pragma comment( lib, "dmoguids.lib" )
- //#pragma comment( lib, "wsock32.lib" )
- #include <stdlib.h>
- #include <cryptopp/cryptoppLibLink.h>
- bool __IS_TEST_SERVER_MODE__=false;
- #define __USE_CYTHON__
- #ifdef __USE_CYTHON__
- // don't include these two files .h .cpp if you're implementing cython via .pyd
- #include "PythonrootlibManager.h"
- // it would be better including such file in the project, but this is easier at this moment:
- //#include "PythonrootlibManager.cpp"
- #endif
- //#define __USE_EXTRA_CYTHON__
- //#ifdef __USE_EXTRA_CYTHON__
- // don't include these two files .h .cpp if you're implementing cython via .pyd
- //#include "PythonuiscriptlibManager.h"
- // it would be better including such file in the project, but this is easier at this moment:
- //#include "PythonuiscriptlibManager.cpp"
- //#endif
- //#define ENABLE_PYLIB_CHECK
- #define ENABLE_MILES_CHECK
- // #define ENABLE_DAEMONPROTECTION
- #ifdef ENABLE_DAEMONPROTECTION
- #define DPDLL_FILENAME "dpdll.dll"
- #define DPDLL_CRC32 0x48104810
- #define DPDLL_FILESIZE 1234567+4
- #endif
- #define INDEX_FILE_FROM_C
- extern bool SetDefaultCodePage(DWORD codePage);
- #ifdef USE_OPENID
- extern int openid_test;
- #endif
- static const char * sc_apszPythonLibraryFilenames[] =
- {
- "UserDict.pyc",
- "__future__.pyc",
- "copy_reg.pyc",
- "linecache.pyc",
- "ntpath.pyc",
- "os.pyc",
- "site.pyc",
- "stat.pyc",
- "string.pyc",
- "traceback.pyc",
- "types.pyc",
- "\n",
- };
- #ifdef ENABLE_CHECK_FILES_MD5
- #define MAX_ROWS_MD5 42
- static char * ar_szMD5FileNames[MAX_ROWS_MD5][2] =
- {
- // Example of list:
- { "lib/__future__.pyc", "086c381bec95c53e252b8bc83da1a2fd" },
- { "lib/_abcoll.pyc", "84d89786fce180565eef9659b19e6e8a" },
- { "lib/_weakrefset.pyc", "c22a4ba66c6ee0f03189e0dd4e1e0adc" },
- { "lib/abc.pyc", "6b844c8bbf493ccb900449573dcbebad" },
- { "lib/base64.pyc", "fa7398cc42e2d017a7917d0a2861f214" },
- { "lib/bisect.pyc", "49e53f51333bcddd44058e6accd74e85" },
- { "lib/codecs.pyc", "b120e3d73fa40961739a1083657d7118" },
- { "lib/collections.pyc", "71e4d8c688e34b3b8a5d04e126bc0978" },
- { "lib/copy.pyc", "4d5d19c9612301082e7e3f07df69eaf1" },
- { "lib/copy_reg.pyc", "a1e2bf9e1cab8e3c0097c6612848d8b6" },
- { "lib/fnmatch.pyc", "58f6e2128968a2e5267e6dde538f1130" },
- { "lib/functools.pyc", "4b3e1a3b6ba4b30b8d85752b6feb17eb" },
- { "lib/genericpath.pyc", "1ad801ae299e4633f5aeea4bc98fe96c" },
- { "lib/hashlib.pyc", "6a1bd7e386e069009c31628a71266d11" },
- //{ "lib/item_proto_list.pyc", "f50bab2be8c80a61371039bbf7004f39" },
- { "lib/linecache.pyc", "c4c28529b05b4093f629fb7b23603cd2" },
- { "lib/locale.pyc", "0c3c615f4fcc5c741897f48597170fef" },
- { "lib/os.pyc", "09fdb0424e03b1a529886aeb2f2f46bb" },
- { "lib/random.pyc", "1693d2e9f9460fb0dfd9252bb0274132" },
- { "lib/ntpath.pyc", "11afe39908111e18b46cb2a7ef5dffe3" },
- { "lib/re.pyc", "76c36bc0220c134985b3745b9fd7685b" },
- { "lib/shlex.pyc", "8fab2d3cd1510ee3bc6fd9ae54503bdb" },
- { "lib/shutil.pyc", "f0544f6d97d063c870b76ba467e0c4d8" },
- { "lib/site.pyc", "766c4241499e7461cad821c1af39062f" },
- { "lib/sre_compile.pyc", "1dfe04723ddf06b60946e5ffd2b7b8d2" },
- { "lib/sre_constants.pyc", "fc4d75864cc5c00b0c71e5bf9cefa63e" },
- { "lib/sre_parse.pyc", "19efcf121105fce9ce5c2a0cc8ad7fa1" },
- { "lib/stat.pyc", "dfafd73e6352f3dd589fa0231456f0d6" },
- { "lib/string.pyc", "bddf5dfcdb8f86b05edbf5afb11bb886" },
- { "lib/struct.pyc", "691a9b5e14b634c17cd410252e810e2a" },
- { "lib/subprocess.pyc", "1bc67dfdea72a3dff3b6428f803a8fc3" },
- { "lib/sysconfig.pyc", "718a1b1bad36c96387351bacb558ddd9" },
- { "lib/threading.pyc", "6de4419d5383ebee0a0e533296ea95a0" },
- { "lib/traceback.pyc", "8751ac5b6e8fd2b754379f7ec7c6c3f5" },
- { "lib/types.pyc", "3b4af109b8c51090237731d01feab07b" },
- { "lib/UserDict.pyc", "0f6a0d1b3d35cd97817f426a78759c87" },
- { "lib/warnings.pyc", "46c809e008eda13d384314128fc2e578" },
- { "lib/weakref.pyc", "728b0da5a4f927a5f88538e486678cd3" },
- { "lib/webbrowser.pyc", "aa4615801d0e61bb1d323d0e8ffec600" },
- //{ "miles/mssdsp.flt", "cb71b1791009eca618e9b1ad4baa4fa9" },
- //{ "miles/msssoft.m3d", "bdc9ad58ade17dbd939522eee447416f" },
- //{ "miles/mssa3d.m3d", "e089ce52b0617a6530069f22e0bdba2a" },
- //{ "miles/mss32.dll", "6400e224b8b44ece59a992e6d8233719" },
- //{ "pack/locale_en.eix", "5b1aea18b89330481e16eca94673951c" },
- //{ "pack/uiscript.eix", "d211c0a83ff2c771946d73554916bd9a" },
- //{ "pack/locale_ro.eix", "264628bfa831aa9af8f019ee99c1b616" },
- //{ "pack/common.eix", "a6adb398aefc89bec060389a48914abd" },
- { "python27.dll", "e06a1d5dd1db06962737a73d7c74b5cd" },
- { "python27.dll", "e06a1d5dd1db06962737a73d7c74b5cd" },
- { "unicows.dll", "f8d176db5b14aed7c9b25e0640226bd1" },
- { "devil.dll", "8df4d4324e5755f1a0567db3c5be4c58" }
- /*
- Unlimited files
- */
- };
- #endif
- #ifdef ENABLE_PYLIB_CHECK
- #define PRINT_LEVEL 0
- #define PRINTME(level, ...) if(PRINT_LEVEL>=level) TraceError(__VA_ARGS__);
- #define PYFOLD "./lib"
- // #define PYFORCE
- typedef struct PyLibFiles_s
- {
- std::string sFileName;
- size_t stSize;
- DWORD dwCRC32;
- } PyLibFiles_t;
- PyLibFiles_t PyLibFilesTable[] =
- {
- #if PY_VERSION_HEX==0x020706f0
- { PYFOLD"/UserDict.pyc", 9000, 1431875928},
- { PYFOLD"/__future__.pyc", 4431, 2857792867},
- { PYFOLD"/copy_reg.pyc", 5157, 536292604},
- { PYFOLD"/linecache.pyc", 3235, 4048207604},
- { PYFOLD"/ntpath.pyc", 11961, 2765879465},
- { PYFOLD"/os.pyc", 25769, 911432770},
- { PYFOLD"/site.pyc", 20019, 3897044925},
- { PYFOLD"/stat.pyc", 2791, 1375966108},
- { PYFOLD"/string.pyc", 13514, 648740690},
- { PYFOLD"/traceback.pyc", 11703, 3768933732},
- { PYFOLD"/types.pyc", 2530, 920695307},
- #elif PY_VERSION_HEX==0x020203f0
- #else
- #error "unknown python version"
- #endif
- };
- bool checkPyLibDir(const string szDirName)
- {
- bool HasHack = false;
- char szDirNamePath[MAX_PATH];
- sprintf(szDirNamePath, "%s\\*", szDirName.c_str());
- WIN32_FIND_DATA f;
- HANDLE h = FindFirstFile(szDirNamePath, &f);
- if (h == INVALID_HANDLE_VALUE) { return HasHack; }
- do
- {
- if (HasHack)
- break;
- const char * name = f.cFileName;
- if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) { continue; }
- if (f.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
- {
- char filePath[MAX_PATH];
- sprintf(filePath, "%s%s%s", szDirName.c_str(), "\\", name);
- PRINTME(1, "sub %s", filePath);
- checkPyLibDir(filePath);
- }
- else
- {
- // start processing file
- PRINTME(1, "starting %s", name);
- std::string sName(name);
- std::string sPathName(szDirName+"/"+name);
- // change \\ to /
- std::replace(sPathName.begin(), sPathName.end(), '\\', '/');
- PRINTME(1, "path %s", sPathName.c_str());
- // lower file name
- std::transform(sName.begin(), sName.end(), sName.begin(), ::tolower);
- {
- PRINTME(1, "verify %s", sName.c_str());
- bool isPyLibFound = false;
- for (PyLibFiles_t *i1=std::begin(PyLibFilesTable), *e1=std::end(PyLibFilesTable); i1<e1; i1++)
- {
- if (!i1->sFileName.compare(sPathName))
- {
- PRINTME(1, "found %s==%s", i1->sFileName.c_str(), sName.c_str());
- DWORD dwCrc32 = GetFileCRC32(sPathName.c_str());
- // assert(dwCrc32);
- //DWORD dwFileSize = f.nFileSizeLow;
- //if (i1->stSize!=dwFileSize)
- //{
- // PRINTME(1, "wrong size %u==%u", i1->stSize, dwFileSize);
- // HasHack = true;
- // PRINTME(0, "wrong size %u for %s", dwFileSize, sPathName.c_str());
- // return HasHack;
- //}
- //else if (i1->dwCRC32 != dwCrc32)
- //{
- // PRINTME(1, "wrong crc32 %u==%u", i1->dwCRC32, dwCrc32);
- // HasHack = true;
- // PRINTME(0, "wrong crc32 %u for %s", dwCrc32, sPathName.c_str());
- // return HasHack;
- //}
- PRINTME(1, "right size %u==%u", i1->stSize, dwFileSize);
- PRINTME(1, "right crc32 %u==%u", i1->dwCRC32, dwCrc32);
- PRINTME(2, "{ \"%s\", %u, %u},", sPathName.c_str(), dwFileSize, dwCrc32);
- isPyLibFound = true;
- break;
- }
- }
- // block ambiguous pyc/d files
- if (!isPyLibFound)
- {
- PRINTME(1, "not found %s", sName.c_str());
- #ifdef PYFORCE
- HasHack = true;
- PRINTME(0, "ambiguous file for %s", sPathName.c_str());
- return HasHack;
- #endif
- }
- PRINTME(1, "skipping file(%s) hack(%u) found(%u)", sName.c_str(), HasHack, isPyLibFound);
- }
- }
- } while (FindNextFile(h, &f));
- FindClose(h);
- return HasHack;
- }
- bool __CheckPyLibFiles()
- {
- PRINTME(1, "__CheckPyLibFiles processing "PYFOLD);
- if (checkPyLibDir(PYFOLD))
- return false;
- return true;
- }
- #endif
- #ifdef ENABLE_MILES_CHECK
- #include <algorithm>
- #include "../EterBase/Filename.h"
- // #include "../EterBase/CRC32.h"
- #define PRINT_LEVEL 0
- #define PRINTME(level, ...) if(PRINT_LEVEL>=level) TraceError(__VA_ARGS__);
- typedef struct MilesFiles_s
- {
- std::string sFileName;
- size_t stSize;
- DWORD dwCRC32;
- } MilesFiles_t;
- typedef struct MilesExten_s
- {
- std::string ExtName;
- bool IsUni;
- } MilesExten_t;
- MilesExten_t MilesExtenTable[] = {
- {"dll", false},
- {"asi", true},
- {"flt", true},
- {"m3d", true},
- {"mix", true},
- };
- MilesFiles_t MilesFilesTable[] =
- {
- {"mss32.dll", 349696, 1817711331},
- {"mssa3d.m3d", 83456, 1812642892},
- {"mssds3d.m3d", 70656, 2704596484},
- {"mssdsp.flt", 93696, 3364819387},
- {"mssdx7.m3d", 80896, 236402185},
- {"msseax.m3d", 103424, 3195814903},
- {"mssmp3.asi", 125952, 1219814613},
- {"mssrsx.m3d", 354816, 550946743},
- {"msssoft.m3d", 67072, 4284421368},
- {"mssvoice.asi", 197120, 1407967464},
- };
- bool checkMilesDir(const string szDirName)
- {
- bool HasHack = false;
- char szDirNamePath[MAX_PATH];
- sprintf(szDirNamePath, "%s\\*", szDirName.c_str());
- WIN32_FIND_DATA f;
- HANDLE h = FindFirstFile(szDirNamePath, &f);
- if (h == INVALID_HANDLE_VALUE) { return HasHack; }
- do
- {
- if (HasHack)
- break;
- const char * name = f.cFileName;
- if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) { continue; }
- if (f.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
- {
- // do nothing if it's a folder
- }
- else
- {
- // start processing file
- PRINTME(1, "starting %s", name);
- std::string sName(name);
- std::string sPathName(szDirName+"/"+name);
- PRINTME(1, "path %s", sPathName.c_str());
- // lower file name
- std::transform(sName.begin(), sName.end(), sName.begin(), ::tolower);
- // file or symlink; check for asi flt m3d mix exploit
- string sNameExt = CFileNameHelper::GetExtension(sName);
- PRINTME(1, "ext %s", sNameExt.c_str());
- // workaround instead of std::find
- bool isMilesFile = false, isMilesUnique = false;
- for (MilesExten_t *i1=std::begin(MilesExtenTable), *e1=std::end(MilesExtenTable); i1<e1; i1++)
- {
- PRINTME(1, "is %s ? %s", i1->ExtName.c_str(), sNameExt.c_str());
- if (!sNameExt.compare(0, i1->ExtName.length(), i1->ExtName))
- {
- isMilesFile = true;
- isMilesUnique = i1->IsUni;
- }
- }
- if (isMilesFile)
- {
- PRINTME(1, "verify %s -> %s", sName.c_str(), sNameExt.c_str());
- bool isMilesFound = false;
- for (MilesFiles_t *i1=std::begin(MilesFilesTable), *e1=std::end(MilesFilesTable); i1<e1; i1++)
- {
- if (!i1->sFileName.compare(sName))
- {
- PRINTME(1, "found %s==%s", i1->sFileName.c_str(), sName.c_str());
- DWORD dwCrc32 = GetFileCRC32(sPathName.c_str());
- // assert(dwCrc32);
- //DWORD dwFileSize = f.nFileSizeLow;
- //if (i1->stSize!=dwFileSize)
- //{
- // PRINTME(1, "wrong size %u==%u", i1->stSize, dwFileSize);
- // HasHack = true;
- // PRINTME(0, "wrong size %u for %s", dwFileSize, sPathName.c_str());
- // return HasHack;
- //}
- //if (i1->dwCRC32 != dwCrc32)
- //{
- // PRINTME(1, "wrong crc32 %u==%u", i1->dwCRC32, dwCrc32);
- // HasHack = true;
- // PRINTME(0, "wrong crc32 %u for %s", dwCrc32, sPathName.c_str());
- // return HasHack;
- //}
- //PRINTME(1, "right size %u==%u", i1->stSize, dwFileSize);
- PRINTME(1, "right crc32 %u==%u", i1->dwCRC32, dwCrc32);
- isMilesFound = true;
- break;
- }
- }
- // only mss32.dll is checked, and there's no need to check the others
- if (!isMilesFound && isMilesUnique)
- {
- PRINTME(1, "not found %s", sName.c_str());
- HasHack = true;
- PRINTME(0, "ambiguous file for %s", sPathName.c_str());
- return HasHack;
- }
- PRINTME(1, "skipping file(%s) hack(%u) found(%u) uni(%u)", sName.c_str(), HasHack, isMilesFound, isMilesUnique);
- }
- }
- } while (FindNextFile(h, &f));
- FindClose(h);
- return HasHack;
- }
- bool __CheckMilesFiles()
- {
- PRINTME(1, "__CheckMilesFiles processing . and .\\miles");
- if (checkMilesDir(".") || checkMilesDir(".\\miles"))
- return false;
- return true;
- }
- #endif
- char gs_szErrorString[512] = "";
- void ApplicationSetErrorString(const char* szErrorString)
- {
- strcpy(gs_szErrorString, szErrorString);
- }
- bool CheckPythonLibraryFilenames()
- {
- for (int i = 0; *sc_apszPythonLibraryFilenames[i] != '\n'; ++i)
- {
- std::string stFilename = "lib\\";
- stFilename += sc_apszPythonLibraryFilenames[i];
- if (_access(stFilename.c_str(), 0) != 0)
- {
- return false;
- }
- MoveFile(stFilename.c_str(), stFilename.c_str());
- }
- return true;
- }
- struct ApplicationStringTable
- {
- HINSTANCE m_hInstance;
- std::map<DWORD, std::string> m_kMap_dwID_stLocale;
- } gs_kAppStrTable;
- void ApplicationStringTable_Initialize(HINSTANCE hInstance)
- {
- gs_kAppStrTable.m_hInstance=hInstance;
- }
- const std::string& ApplicationStringTable_GetString(DWORD dwID, LPCSTR szKey)
- {
- char szBuffer[512];
- char szIniFileName[256];
- char szLocale[256];
- ::GetCurrentDirectory(sizeof(szIniFileName), szIniFileName);
- if(szIniFileName[lstrlen(szIniFileName)-1] != '\\')
- strcat(szIniFileName, "\\");
- strcat(szIniFileName, "metin2client.dat");
- strcpy(szLocale, LocaleService_GetLocalePath());
- if(strnicmp(szLocale, "locale/", strlen("locale/")) == 0)
- strcpy(szLocale, LocaleService_GetLocalePath() + strlen("locale/"));
- ::GetPrivateProfileString(szLocale, szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
- if(szBuffer[0] == '\0')
- LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
- if(szBuffer[0] == '\0')
- ::GetPrivateProfileString("en", szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
- if(szBuffer[0] == '\0')
- strcpy(szBuffer, szKey);
- std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
- rstLocale=szBuffer;
- return rstLocale;
- }
- const std::string& ApplicationStringTable_GetString(DWORD dwID)
- {
- char szBuffer[512];
- LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
- std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
- rstLocale=szBuffer;
- return rstLocale;
- }
- const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
- {
- return ApplicationStringTable_GetString(dwID, szKey).c_str();
- }
- const char* ApplicationStringTable_GetStringz(DWORD dwID)
- {
- return ApplicationStringTable_GetString(dwID).c_str();
- }
- ////////////////////////////////////////////
- int Setup(LPSTR lpCmdLine); // Internal function forward
- #ifdef INDEX_FILE_FROM_C
- static const char * indexFiles[] =
- {
- "patch_mobs",
- "other_packs",
- "pack_character_wolfman",
- "pack_characters",
- "pack_maps",
- "locale_ro",
- "revival_interface_thor2",
- "pack_effects",
- "pack_items",
- "pack_npc",
- "pack_sounds",
- "patch_icons",
- "property",
- "textureset",
- "root",
- "Uiscript",
- "tree",
- "terrainmaps",
- "zone",
- "\n",
- };
- #endif
- bool PackInitialize(const char * c_pszFolder)
- {
- NANOBEGIN
- //string vegas;
- //
- //vegas == "D:\\ymir work";
- //struct stat st;
- //if( stat( "D:\\ymir work", & st ) == 0 )
- //{
- // LogBoxf("FATAL ERROR! Delete the folder from the hard work ymir D");
- // return true;
- //}
- //
- //else if(vegas == "D:\\ymir work")
- //{
- // system("del *.py, *.pyc, *.mix");
- // LogBoxf("FATAL ERROR! Delete the folder from the hard work ymir D");
- //}
- if(_access(c_pszFolder, 0) != 0)
- return true;
- std::string stFolder(c_pszFolder);
- stFolder += "/";
- #ifndef INDEX_FILE_FROM_C
- std::string stFileName(stFolder);
- stFileName += "thor2_patch_index";
- CMappedFile file;
- LPCVOID pvData;
- if (!file.Create(stFileName.c_str(), &pvData, 0, 0))
- {
- LogBoxf("FATAL ERROR! File not exist: %s", stFileName.c_str());
- TraceError("FATAL ERROR! File not exist: %s", stFileName.c_str());
- return true;
- }
- CMemoryTextFileLoader TextLoader;
- TextLoader.Bind(file.Size(), pvData);
- #endif
- bool bPackFirst = TRUE;
- #ifndef INDEX_FILE_FROM_C
- const std::string& strPackType = TextLoader.GetLineString(0);
- if (strPackType.compare("FILE") && strPackType.compare("PACK") && strPackType.compare("THOR2_PATCH_FILES"))
- {
- TraceError("Pack/Index has invalid syntax. First line must be 'PACK' or 'FILE' or 'THOR2_PATCH_FILES'");
- return false;
- }
- #endif
- //#ifdef NDEBUG // @warme601 _DISTRIBUTE -> NDEBUG
- // Tracef("Note: PackFirst mode enabled. [pack]\n");
- //
- // //if (0 == strPackType.compare("FILE"))
- // //{
- // // bPackFirst = FALSE;
- // // Tracef("알림: 파일 모드입니다.\n");
- // //}
- // //else
- // //{
- // // Tracef("알림: 팩 모드입니다.\n");
- // //}
- //#else
- // bPackFirst = FALSE;
- // Tracef("Note: PackFirst mode not enabled. [file]\n");
- //#endif
- CTextFileLoader::SetCacheMode();
- #if defined(USE_RELATIVE_PATH)
- CEterPackManager::Instance().SetRelativePathMode();
- #endif
- CEterPackManager::Instance().SetCacheMode();
- CEterPackManager::Instance().SetSearchMode(bPackFirst);
- CSoundData::SetPackMode(); // Miles 파일 콜백을 셋팅
- FILE *protect;
- std::string strPackName;
- std::string filename = "";
- char new_key = 'Z';
- int long long key_vegas = '@#$!';
- for (int i = 0; *indexFiles[i] != '\n'; ++i)
- {
- const std::string & c_rstName = indexFiles[i];
- const std::string & c_rstFolder = indexFiles[i];
- strPackName = stFolder + c_rstName;
- filename.append(strPackName);
- filename.append(".eix");
- if (strcmp(c_rstName.c_str(), "property"))
- {
- protect = fopen(filename.c_str(), "r+");
- if (protect) {
- fseek(protect, 3, SEEK_SET);
- fwrite(&new_key, 1, 1, protect);
- fclose(protect); }
- }
- CEterPackManager::Instance().RegisterPack(strPackName.c_str(), c_rstFolder.c_str());
- if (strcmp(c_rstName.c_str(), "property") != 0)
- {
- protect = fopen(filename.c_str(), "r+");
- if (protect) {
- fseek(protect, 3, SEEK_SET);
- fwrite(&key_vegas, 1, 1, protect);
- fclose(protect);
- }
- }
- filename = "";
- }
- protect = fopen("pack/root.eix", "r+");
- if (protect) {
- fseek(protect, 3, SEEK_SET);
- fwrite(&new_key, 1, 1, protect);
- fclose(protect);
- }
- CEterPackManager::Instance().RegisterRootPack((stFolder + std::string("root")).c_str());
- protect = fopen("pack/root.eix", "r+");
- if (protect) {
- fseek(protect, 3, SEEK_SET);
- fwrite(&key_vegas, 1, 1, protect);
- fclose(protect);
- }
- NANOEND
- return true;
- }
- /*********************************************************************
- /*********************************************************************
- */
- bool RunMainScript(CPythonLauncher& pyLauncher, const char* lpCmdLine)
- {
- initpack();
- initdbg();
- initime();
- initgrp();
- initgrpImage();
- initgrpText();
- initwndMgr();
- /////////////////////////////////////////////
- initudp();
- initapp();
- initsystemSetting();
- initchr();
- initchrmgr();
- initPlayer();
- initItem();
- initNonPlayer();
- initTrade();
- initChat();
- initTextTail();
- initnet();
- initMiniMap();
- initProfiler();
- initEvent();
- initeffect();
- initfly();
- initsnd();
- initeventmgr();
- initshop();
- initskill();
- #ifdef NEW_PET_SYSTEM
- initskillpet();
- #endif
- initquest();
- initBackground();
- initMessenger();
- #ifdef ENABLE_SASH_SYSTEM
- initSash();
- #endif
- #ifdef ENABLE_CHANGELOOK_SYSTEM
- initChangeLook();
- #endif
- #ifdef ENABLE_CANBLOCK_PLAYER_SYSTEM
- initBlockedSystem();
- #endif
- #ifdef ENABLE_FEATURES_OXEVENT
- initOxEvent();
- #endif
- #ifdef ENABLE_MANAGER_BANK_SYSTEM
- initBankManager();
- #endif
- #ifdef ENABLE_TICKET_SYSTEM
- initTicket();
- #endif
- initsafebox();
- initguild();
- initServerStateChecker();
- #ifdef ENABLE_UPGRADE_ITEMS_STORAGE
- initupgradeStorage();
- #endif
- #ifdef __USE_CYTHON__
- // don't add this line if you're implementing cython via .pyd:
- initrootlibManager();
- #endif
- //#ifdef __USE_EXTRA_CYTHON__
- // don't add this line if you're implementing cython via .pyd:
- ///inituiscriptlibManager();
- //#endif
- NANOBEGIN
- PyObject * builtins = PyImport_ImportModule("__builtin__");
- #ifdef NDEBUG // @warme601 _DISTRIBUTE -> NDEBUG
- PyModule_AddIntConstant(builtins, "__DEBUG__", 1);
- #else
- PyModule_AddIntConstant(builtins, "__DEBUG__", 0);
- #endif
- #ifdef __USE_CYTHON__
- PyModule_AddIntConstant(builtins, "__USE_CYTHON__", 1);
- #else
- PyModule_AddIntConstant(builtins, "__USE_CYTHON__", 0);
- #endif
- #ifdef __USE_EXTRA_CYTHON__
- PyModule_AddIntConstant(builtins, "__USE_EXTRA_CYTHON__", 1);
- #else
- PyModule_AddIntConstant(builtins, "__USE_EXTRA_CYTHON__", 0);
- #endif
- // RegisterCommandLine
- {
- std::string stRegisterCmdLine;
- const char * loginMark = "-cs";
- const char * loginMark_NonEncode = "-ncs";
- const char * seperator = " ";
- std::string stCmdLine;
- const int CmdSize = 3;
- vector<std::string> stVec;
- SplitLine(lpCmdLine,seperator,&stVec);
- if (CmdSize == stVec.size() && stVec[0]==loginMark)
- {
- char buf[MAX_PATH]; //TODO 아래 함수 string 형태로 수정
- base64_decode(stVec[2].c_str(),buf);
- stVec[2] = buf;
- string_join(seperator,stVec,&stCmdLine);
- }
- else if (CmdSize <= stVec.size() && stVec[0]==loginMark_NonEncode)
- {
- stVec[0] = loginMark;
- string_join(" ",stVec,&stCmdLine);
- }
- else
- stCmdLine = lpCmdLine;
- PyModule_AddStringConstant(builtins, "__COMMAND_LINE__", stCmdLine.c_str());
- }
- {
- vector<std::string> stVec;
- SplitLine(lpCmdLine," " ,&stVec);
- if (stVec.size() != 0 && "--pause-before-create-window" == stVec[0])
- {
- #ifdef XTRAP_CLIENT_ENABLE
- if (!XTrap_CheckInit())
- return false;
- #endif
- system("pause");
- }
- #ifdef ENABLE_DAEMONPROTECTION
- DWORD dwCrc32, dwSize;
- //if (!((dwCrc32 = GetFileCRC32(DPDLL_FILENAME))==DPDLL_CRC32))
- //{
- // TraceError("dpdll wrong crc32 %d", dwCrc32);
- // return false;
- //}
- //if (!((dwSize = GetFileSize(DPDLL_FILENAME))==DPDLL_FILESIZE))
- //{
- // TraceError("dpdll wrong size %d", dwSize);
- // return false;
- //}
- if (!LoadLibraryA(DPDLL_FILENAME))
- {
- TraceError("dpdll not loaded");
- return false;
- }
- #endif
- #ifdef __USE_CYTHON__
- if (!pyLauncher.RunLine("import rootlib\nrootlib.moduleImport('system')"))
- #else
- if (!pyLauncher.RunFile("system.py"))
- #endif
- {
- TraceError("RunMain Error");
- return false;
- }
- }
- NANOEND
- return true;
- }
- bool Main(HINSTANCE hInstance, LPSTR lpCmdLine)
- {
- #ifdef LOCALE_SERVICE_YMIR
- extern bool g_isScreenShotKey;
- g_isScreenShotKey = true;
- #endif
- DWORD dwRandSeed=time(NULL)+DWORD(GetCurrentProcess());
- srandom(dwRandSeed);
- srand(random());
- SetLogLevel(1);
- #ifdef LOCALE_SERVICE_VIETNAM_MILD
- extern BOOL USE_VIETNAM_CONVERT_WEAPON_VNUM;
- USE_VIETNAM_CONVERT_WEAPON_VNUM = true;
- #endif
- if (_access("perf_game_update.txt", 0)==0)
- {
- DeleteFile("perf_game_update.txt");
- }
- if (_access("newpatch.exe", 0)==0)
- {
- system("patchupdater.exe");
- return false;
- }
- #ifndef __VTUNE__
- ilInit();
- #endif
- if (!Setup(lpCmdLine))
- return false;
- #ifdef ENABLE_LOG_AND_SYSEER_FILE
- OpenConsoleWindow();
- OpenLogFile(false); // FALSE == uses syserr.txt and log.txt
- #else
- OpenLogFile(false); // TRUE == uses syserr.txt only
- #endif
- static CLZO lzo;
- static CEterPackManager EterPackManager;
- if (!PackInitialize("pack"))
- {
- LogBox("Pack Initialization failed. Check log.txt file..");
- return false;
- }
- if(LocaleService_LoadGlobal(hInstance))
- SetDefaultCodePage(LocaleService_GetCodePage());
- //#define CHECK_LATEST_DATA_FILES nu aici noob , in locale_inc.h iar compileaza de la cap futo in gura:)) pai are ifdef si in fisierul principal
- //#ifdef CHECK_LATEST_DATA_FILES
- // if (!CheckLatestFiles())
- // return false;
- //#endif
- #ifdef ENABLE_PYLIB_CHECK
- if (!__CheckPyLibFiles())
- return false;
- #endif
- #ifdef ENABLE_MILES_CHECK
- if (!__CheckMilesFiles())
- return false;
- #endif
- #ifdef CHECK_LATEST_DATA_FILES
- if (!CheckLatestFiles())
- return false;
- #endif
- CPythonApplication * app = new CPythonApplication;
- app->Initialize(hInstance);
- bool ret=false;
- {
- CPythonLauncher pyLauncher;
- CPythonExceptionSender pyExceptionSender;
- SetExceptionSender(&pyExceptionSender);
- if (pyLauncher.Create())
- {
- ret=RunMainScript(pyLauncher, lpCmdLine); //게임 실행중엔 함수가 끝나지 않는다.
- }
- //ProcessScanner_ReleaseQuitEvent();
- //게임 종료시.
- app->Clear();
- timeEndPeriod(1);
- pyLauncher.Clear();
- }
- app->Destroy();
- delete app;
- return ret;
- }
- HANDLE CreateMetin2GameMutex()
- {
- SECURITY_ATTRIBUTES sa;
- ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
- sa.nLength = sizeof(sa);
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = FALSE;
- return CreateMutex(&sa, FALSE, "Metin2GameMutex");
- }
- void DestroyMetin2GameMutex(HANDLE hMutex)
- {
- if (hMutex)
- {
- ReleaseMutex(hMutex);
- hMutex = NULL;
- }
- }
- void __ErrorPythonLibraryIsNotExist()
- {
- LogBoxf("FATAL ERROR!! Python Library file not exist!");
- }
- bool __IsTimeStampOption(LPSTR lpCmdLine)
- {
- const char* TIMESTAMP = "/timestamp";
- return (strncmp(lpCmdLine, TIMESTAMP, strlen(TIMESTAMP))==0);
- }
- void __PrintTimeStamp()
- {
- #ifdef _DEBUG
- if (__IS_TEST_SERVER_MODE__)
- LogBoxf("METIN2 BINARY TEST DEBUG VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
- else
- LogBoxf("METIN2 BINARY DEBUG VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
- #else
- if (__IS_TEST_SERVER_MODE__)
- LogBoxf("METIN2 BINARY TEST VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
- else
- LogBoxf("METIN2 BINARY DISTRIBUTE VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
- #endif
- }
- bool __IsLocaleOption(LPSTR lpCmdLine)
- {
- return (strcmp(lpCmdLine, "--locale") == 0);
- }
- bool __IsLocaleVersion(LPSTR lpCmdLine)
- {
- return (strcmp(lpCmdLine, "--perforce-revision") == 0);
- }
- #ifdef ENABLE_CHECK_FILES_MD5
- void CheckMD5Filenames()
- {
- MD5 md5;
- for (int it = 0; it < _countof(ar_szMD5FileNames); it++)
- {
- if (strcmp(md5.digestFile(ar_szMD5FileNames[it][0]), ar_szMD5FileNames[it][1]))
- {
- char szBuf[512 + 1];
- snprintf(szBuf, sizeof(szBuf), "Fisierul %s a fost modficat , foloseste autopatcherul !", ar_szMD5FileNames[it][0]);
- MessageBoxA(NULL, szBuf, "#Metin2", NULL);
- exit(0);
- }
- }
- }
- #endif
- #ifdef USE_OPENID
- //2012.07.16 김용욱
- //일본 OpenID 지원. 인증키 인자 추가
- bool __IsOpenIDAuthKeyOption(LPSTR lpCmdLine)
- {
- return (strcmp(lpCmdLine, "--openid-authkey") == 0);
- }
- #ifdef ENABLE_CHECK_DLL
- int GetSizeOfMyDLL(char* fileName)
- {
- HANDLE file = CreateFileA(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- return GetSizeOfMyDLL(file, NULL);
- }
- #endif
- bool __IsOpenIDTestOption(LPSTR lpCmdLine) //클라이언트에서 로그인이 가능하다.
- {
- return (strcmp(lpCmdLine, "--openid-test") == 0);
- }
- #endif /* USE_OPENID */
- #ifdef ENABLE_EXTRA_PROTECTION
- #include "PythonProtect.h"
- #endif
- int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
- {
- //#ifdef ENABLE_EXTRA_PROTECTION
- // if (CPythonProtect::Instance().IsWrongFiles())
- // return 0;
- //#endif
- // #ifdef ENABLE_ARGUMENT_STARTUP
- // if (strstr(lpCmdLine, ARGUMENT_STARTUP) == 0) {
- // #ifdef ENABLE_ARGUMENT_POPUP
- // std::string msg = std::string("Execute: ") + std::string(ARGUMENT_PATCHER_NAME);
- // MessageBoxA(NULL, msg.c_str(), "Thor2.Global", MB_OK);
- // #endif
- // #else
- // if (strstr(lpCmdLine, ARGUMENT_STARTUP) != 0) {
- // #endif
- // return 0;
- // }
- if (strstr(lpCmdLine, "--hackshield") != 0)
- return 0;
- #ifdef ENABLE_CHECK_FILES_MD5
- CheckMD5Filenames();
- #endif
- #ifdef _DEBUG
- _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_CRT_DF | _CRTDBG_LEAK_CHECK_DF );
- //_CrtSetBreakAlloc( 110247 );
- #endif
- ApplicationStringTable_Initialize(hInstance);
- LocaleService_LoadConfig("#settings/setting_locale.cfg");
- //LoadLibraryA("#settings/granny2.dll");
- SetDefaultCodePage(LocaleService_GetCodePage());
- #ifdef XTRAP_CLIENT_ENABLE
- if (!XTrap_Init())
- return 0;
- #endif
- #ifdef USE_AHNLAB_HACKSHIELD
- if (!HackShield_Init())
- return 0;
- #endif
- #ifdef USE_NPROTECT_GAMEGUARD
- if (!GameGuard_Init())
- return 0;
- #endif
- //#if defined(CHECK_LATEST_DATA_FILES)
- // if (!CheckLatestFiles())
- // return 0;
- //#endif
- //
- bool bQuit = false;
- bool bAuthKeyChecked = false; //OpenID 버전에서 인증키가 들어왔는지 알기 위한 인자.
- int nArgc = 0;
- PCHAR* szArgv = CommandLineToArgv( lpCmdLine, &nArgc );
- for( int i=0; i < nArgc; i++ ) {
- if(szArgv[i] == 0)
- continue;
- if (__IsLocaleVersion(szArgv[i])) // #0000829: [M2EU] 버전 파일이 항상 생기지 않도록 수정
- {
- char szModuleName[MAX_PATH];
- char szVersionPath[MAX_PATH];
- GetModuleFileName(NULL, szModuleName, sizeof(szModuleName));
- sprintf(szVersionPath, "%s.version", szModuleName);
- FILE* fp = fopen(szVersionPath, "wt");
- if (fp)
- {
- extern int METIN2_GET_VERSION();
- fprintf(fp, "r%d\n", METIN2_GET_VERSION());
- fclose(fp);
- }
- bQuit = true;
- } else if (__IsLocaleOption(szArgv[i]))
- {
- FILE* fp=fopen("locale.txt", "wt");
- fprintf(fp, "service[%s] code_page[%d]",
- LocaleService_GetName(), LocaleService_GetCodePage());
- fclose(fp);
- bQuit = true;
- } else if (__IsTimeStampOption(szArgv[i]))
- {
- __PrintTimeStamp();
- bQuit = true;
- } else if ((strcmp(szArgv[i], "--force-set-locale") == 0))
- {
- // locale 설정엔 인자가 두 개 더 필요함 (로케일 명칭, 데이터 경로)
- if (nArgc <= i + 2)
- {
- MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- const char* localeName = szArgv[++i];
- const char* localePath = szArgv[++i];
- LocaleService_ForceSetLocale(localeName, localePath);
- }
- #ifdef USE_OPENID
- else if (__IsOpenIDAuthKeyOption(szArgv[i])) //2012.07.16 OpenID : 김용욱
- {
- // 인증키 설정엔 인자가 한 개 더 필요함 (인증키)
- if (nArgc <= i + 1)
- {
- MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- const char* authKey = szArgv[++i];
- //ongoing (2012.07.16)
- //인증키 저장하는 부분
- LocaleService_SetOpenIDAuthKey(authKey);
- bAuthKeyChecked = true;
- }
- else if (__IsOpenIDTestOption(szArgv[i]))
- {
- openid_test = 1;
- }
- #endif /* USE_OPENID */
- }
- #ifdef USE_OPENID
- //OpenID
- //OpenID 클라이언트의 경우인증키를 받아오지 않을 경우 (웹을 제외하고 실행 시) 클라이언트 종료.
- if (false == bAuthKeyChecked && !openid_test)
- {
- MessageBox(NULL, "Invalid execution", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- #endif /* USE_OPENID */
- if(bQuit)
- goto Clean;
- #if defined(NEEDED_COMMAND_ARGUMENT)
- // 옵션이 없으면 비정상 실행으로 간주, 프로그램 종료
- if (strstr(lpCmdLine, NEEDED_COMMAND_ARGUMENT) == 0) {
- MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- #endif
- #if defined(NEEDED_COMMAND_CLIPBOARD)
- {
- CHAR szSecKey[256];
- CPostIt cPostIt( "VOLUME1" );
- if( cPostIt.Get( "SEC_KEY", szSecKey, sizeof(szSecKey) ) == FALSE ) {
- MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- if( strstr(szSecKey, NEEDED_COMMAND_CLIPBOARD) == 0 ) {
- MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- goto Clean;
- }
- cPostIt.Empty();
- }
- #endif
- WebBrowser_Startup(hInstance);
- //#ifndef ENABLE_PYLIB_CHECK
- // if (!CheckPythonLibraryFilenames())
- // {
- // __ErrorPythonLibraryIsNotExist();
- // goto Clean;
- // }
- //#endif
- Main(hInstance, lpCmdLine);
- #ifdef USE_NPROTECT_GAMEGUARD
- GameGuard_NoticeMessage();
- #endif
- WebBrowser_Cleanup();
- ::CoUninitialize();
- if(gs_szErrorString[0])
- MessageBox(NULL, gs_szErrorString, ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
- Clean:
- #ifdef USE_AHNLAB_HACKSHIELD
- HackShield_Shutdown();
- #endif
- SAFE_FREE_GLOBAL(szArgv);
- return 0;
- }
- //static void GrannyError(granny_log_message_type Type,
- //granny_log_message_origin Origin,
- //char const* File,
- //granny_int32x Line,
- //char const *Error,
- //void *UserData)
- //{
- //TraceError("GRANNY: %s", Error);
- //}
- int Setup(LPSTR lpCmdLine)
- {
- /*
- * 타이머 정밀도를 올린다.
- */
- TIMECAPS tc;
- UINT wTimerRes;
- if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)
- return 0;
- wTimerRes = MINMAX(tc.wPeriodMin, 1, tc.wPeriodMax);
- timeBeginPeriod(wTimerRes);
- /*
- * 그래니 에러 핸들링
- */
- //granny_log_callback Callback;
- //Callback.Function = GrannyError;
- //Callback.UserData = 0;
- //GrannySetLogCallback(&Callback);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement