From 857834bc8210121d8e631c26aaace459bc3132d9 Mon Sep 17 00:00:00 2001 From: ChaosMarc Date: Mon, 19 Jun 2017 15:01:03 +0200 Subject: [PATCH] updated to v11.02 by Yohann --- Commons/VersionInfo.cpp | 15 +- Commons/VersionInfo.h | 4 +- Commons/updatingConst.h | 1 + PlugY/Commands.cpp | 26 +- PlugY/D2functions.cpp | 3 +- PlugY/D2wrapper.cpp | 484 ++++++------- PlugY/Error.cpp | 2 +- PlugY/ExtendedSaveFile.cpp | 12 +- PlugY/ExtraOptions.cpp | 6 +- PlugY/InfinityStash.cpp | 60 +- PlugY/Parameters.cpp | 6 +- PlugY/PlayerCustomData.cpp | 8 +- PlugY/PlugY.rc | Bin 5084 -> 5084 bytes PlugY/PlugY.suo | Bin 11776 -> 44032 bytes PlugY/PlugY.vcproj | 2 +- PlugY/UpdateClient.cpp | 2 +- PlugY/UpdateServer.cpp | 11 +- PlugY/d2functions.h | 2 +- PlugY/d2wrapper.h | 64 +- PlugY/extraOptions.h | 1 + PlugY/infinityStash.h | 4 +- PlugY/parameters.h | 4 +- PlugY/playerCustomData.h | 1 + PlugYInstall/PlugYInstall.cpp | 668 ++++++++++-------- PlugYInstall/PlugYInstall.rc | 2 +- PlugYInstall/PlugYInstall.suo | Bin 12800 -> 14336 bytes PlugYInstall/PlugYInstall.vcproj | 4 +- PlugYInstaller/PlugY.ini | 8 +- PlugYInstaller/PlugY.nsi | 26 +- PlugYInstaller/PlugY/LocalizedStrings.ini | Bin 40474 -> 40474 bytes PlugYInstaller/PlugY/PlugYDefault.ini | 4 +- PlugYInstaller/PlugY/PlugYFixed.ini | 2 +- .../PlugY_The_Survival_Kit_-_Liesmich.txt | 10 +- .../PlugY_The_Survival_Kit_-_LisezMoi.txt | 8 +- .../PlugY_The_Survival_Kit_-_Readme.txt | 10 +- PlugYRun/PlugYRun.cpp | 151 ++-- PlugYRun/PlugYRun.rc | Bin 6264 -> 6264 bytes PlugYRun/PlugYRun.suo | Bin 15360 -> 32256 bytes PlugYRun/PlugYRun.vcproj | 2 +- 39 files changed, 840 insertions(+), 773 deletions(-) diff --git a/Commons/VersionInfo.cpp b/Commons/VersionInfo.cpp index 256cb70..5c02ac0 100644 --- a/Commons/VersionInfo.cpp +++ b/Commons/VersionInfo.cpp @@ -7,7 +7,6 @@ //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include "VersionInfo.h" -#include #pragma comment(lib, "Version.Lib") @@ -15,11 +14,15 @@ const char* VersionStrings[16] = { "1.00","1.07","1.08","1.09","1.09b","1.09d"," const char* GetVersionString(int version) { + if (version < 0 || version >= sizeof(VersionStrings)) + return "UNKNOW"; return VersionStrings[version]; } eGameVersion GetD2Version(LPCVOID pVersionResource) { + if (!pVersionResource) return UNKNOW; + UINT uLen; VS_FIXEDFILEINFO* ptFixedFileInfo; if (!VerQueryValue(pVersionResource, "\\", (LPVOID*)&ptFixedFileInfo, &uLen)) @@ -67,19 +70,15 @@ eGameVersion GetD2Version(char* gameExe) return version; } -eGameVersion GetD2Version() +eGameVersion GetD2Version(HMODULE hModule) { - HMODULE hModule = GetModuleHandle(NULL); HRSRC hResInfo = FindResource(hModule, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION); + if (!hResInfo) return UNKNOW; HGLOBAL hResData = LoadResource(hModule, hResInfo); + if (!hResData) return UNKNOW; LPVOID pVersionResource = LockResource(hResData); - //DWORD dwSize = SizeofResource(hInst, hResInfo); - //LPVOID pVersionResource = LocalAlloc(LMEM_FIXED, dwSize); - //CopyMemory(pVersionResource, pRes, dwSize); - eGameVersion version = GetD2Version(pVersionResource); FreeResource(hResData); - //LocalFree(pVersionResource); return version; } diff --git a/Commons/VersionInfo.h b/Commons/VersionInfo.h index 11f900d..9033da6 100644 --- a/Commons/VersionInfo.h +++ b/Commons/VersionInfo.h @@ -6,6 +6,8 @@ =================================================================*/ #pragma once +#include + enum eGameVersion { UNKNOW = -1, @@ -29,6 +31,6 @@ enum eGameVersion const char* GetVersionString(int version); eGameVersion GetD2Version(char* gamePath); -eGameVersion GetD2Version(); +eGameVersion GetD2Version(HMODULE hModule); ///////////////////////// END OF FILE /////////////////////// \ No newline at end of file diff --git a/Commons/updatingConst.h b/Commons/updatingConst.h index c13d83b..9275616 100644 --- a/Commons/updatingConst.h +++ b/Commons/updatingConst.h @@ -48,6 +48,7 @@ enum UpdateServerConst US_RENAME, US_PAGENAME, US_SET_INDEX, + US_SET_MAIN_INDEX, US_RESET_INDEX, US_INSERT_PAGE, US_DELETE_PAGE, diff --git a/PlugY/Commands.cpp b/PlugY/Commands.cpp index 826b745..840e028 100644 --- a/PlugY/Commands.cpp +++ b/PlugY/Commands.cpp @@ -22,6 +22,8 @@ bool active_savegame=false; #define MAX_CMD_SIZE 200 +const char * CMD_PLAYERS="players set to"; + const char * CMD_SAVE="/save"; const char * CMD_SELECTPAGE="/page"; @@ -34,6 +36,7 @@ const char * CMD_RENAME_CHAR="/renamechar"; const char * CMD_REPAGE_NAME = "/renamepage"; const char * CMD_SET_INDEX = "/setindex"; +const char * CMD_SET_MAIN_INDEX = "/setmainindex"; const char * CMD_RESET_INDEX = "/resetindex"; const char * CMD_INSERT_PAGE = "/insertpage"; const char * CMD_DELETE_PAGE = "/deletepage"; @@ -334,6 +337,14 @@ int STDCALL commands (char* ptText) strncpy(command,ptText,MAX_CMD_SIZE-1); _strlwr(command); + if (!strncmp(command, CMD_PLAYERS, strlen(CMD_PLAYERS))) + { + int nb = atoi(&command[strlen(CMD_PLAYERS)]); + if (nb > 0 && nb <= 64) + nbPlayersCommand = nb; + return 1; + } + if (!strcmp(command, CMD_SAVE)) { if (onRealm) return 1; @@ -364,7 +375,7 @@ int STDCALL commands (char* ptText) if (!strncmp(command, CMD_RENAME_CHAR, strlen(CMD_RENAME_CHAR))) { - const char* param = &command[strlen(CMD_RENAME_CHAR)]; + const char* param = &ptText[strlen(CMD_RENAME_CHAR)]; if (param[0] != ' ') return 1; param++; @@ -374,7 +385,7 @@ int STDCALL commands (char* ptText) if (!strncmp(command, CMD_REPAGE_NAME,strlen(CMD_REPAGE_NAME))) { if (!active_multiPageStash) return 1; - char* param = &command[strlen(CMD_REPAGE_NAME)]; + char* param = &ptText[strlen(CMD_REPAGE_NAME)]; Stash* ptStash = PCPY->currentStash; if (!ptStash) return 0; @@ -408,6 +419,13 @@ int STDCALL commands (char* ptText) return 0; } + if (!strcmp(command, CMD_SET_MAIN_INDEX)) + { + if (!active_multiPageStash) return 1; + updateServer(US_SET_MAIN_INDEX); + return 0; + } + if (!strcmp(command, CMD_RESET_INDEX)) { if (!active_multiPageStash) return 1; @@ -426,7 +444,7 @@ int STDCALL commands (char* ptText) if (!strcmp(command, CMD_DELETE_PAGE)) { if (!active_multiPageStash) return 1; - if (deleteStash(ptChar)) + if (deleteStash(ptChar, true)) updateServer(US_DELETE_PAGE); return 0; } @@ -435,6 +453,8 @@ int STDCALL commands (char* ptText) { if (!active_multiPageStash) return 1; int page = atoi(&command[strlen(CMD_SWAP)]) - 1; + if (page < 0 && PCPY->currentStash->nextStash) + page = PCPY->currentStash->nextStash->id; if (page < 0) return 1; updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16)); diff --git a/PlugY/D2functions.cpp b/PlugY/D2functions.cpp index afe1bce..2fef0ef 100644 --- a/PlugY/D2functions.cpp +++ b/PlugY/D2functions.cpp @@ -607,7 +607,7 @@ void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index) *addr = NULL; } -bool initD2functions() +void initD2functions() { // #define D2S(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I); // #define D2F(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I); @@ -956,7 +956,6 @@ bool initD2functions() shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8,A8); shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34,34); shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00,00); - return true; } /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/D2wrapper.cpp b/PlugY/D2wrapper.cpp index 2cb08ab..242f539 100644 --- a/PlugY/D2wrapper.cpp +++ b/PlugY/D2wrapper.cpp @@ -30,100 +30,78 @@ #include "common.h" -int version_SmackW32 = UNKNOW; -int version_D2Common = UNKNOW; -int version_ijl11 = UNKNOW; -int version_D2Gdi = UNKNOW; -int version_D2Win = UNKNOW; -int version_D2sound = UNKNOW; -int version_D2MCPCLI = UNKNOW; -int version_D2Launch = UNKNOW; -int version_D2gfx = UNKNOW; +int version_Game = UNKNOW; +//int version_binkw32 = UNKNOW; +//int version_Bnclient = UNKNOW; int version_D2Client = UNKNOW; -int version_D2Net = UNKNOW; -int version_D2Lang = UNKNOW; -int version_D2Game = UNKNOW; int version_D2CMP = UNKNOW; -int version_Bnclient = UNKNOW; +int version_D2Common = UNKNOW; +//int version_D2DDraw = UNKNOW; +//int version_D2Direct3D = UNKNOW; +int version_D2Game = UNKNOW; +//int version_D2Gdi = UNKNOW; +int version_D2gfx = UNKNOW; +//int version_D2Glide = UNKNOW; +int version_D2Lang = UNKNOW; +int version_D2Launch = UNKNOW; +//int version_D2MCPClient = UNKNOW; +//int version_D2Multi = UNKNOW; +int version_D2Net = UNKNOW; +//int version_D2sound = UNKNOW; +int version_D2Win = UNKNOW; int version_Fog = UNKNOW; +//int version_ijl11 = UNKNOW; +//int version_SmackW32 = UNKNOW; int version_Storm = UNKNOW; - -DWORD offset_SmackW32 = NULL; -DWORD offset_D2Common = NULL; -DWORD offset_ijl11 = NULL; -DWORD offset_D2Gdi = NULL; -DWORD offset_D2Win = NULL; -DWORD offset_D2sound = NULL; -DWORD offset_D2Multi = NULL; -DWORD offset_D2MCPCLI = NULL; -DWORD offset_D2Launch = NULL; -DWORD offset_D2gfx = NULL; -DWORD offset_D2Game = NULL; +DWORD offset_Game = NULL; +//DWORD offset_binkw32 = NULL; +//DWORD offset_Bnclient = NULL; DWORD offset_D2Client = NULL; -DWORD offset_D2Net = NULL; -DWORD offset_D2Lang = NULL; DWORD offset_D2CMP = NULL; -DWORD offset_Bnclient = NULL; +DWORD offset_D2Common = NULL; +//DWORD offset_D2DDraw = NULL; +//DWORD offset_D2Direct3D = NULL; +DWORD offset_D2Game = NULL; +//DWORD offset_D2Gdi = NULL; +DWORD offset_D2gfx = NULL; +//DWORD offset_D2Glide = NULL; +DWORD offset_D2Lang = NULL; +DWORD offset_D2Launch = NULL; +//DWORD offset_D2MCPClient = NULL; +//DWORD offset_D2Multi = NULL; +DWORD offset_D2Net = NULL; +//DWORD offset_D2sound = NULL; +DWORD offset_D2Win = NULL; DWORD offset_Fog = NULL; +//DWORD offset_ijl11 = NULL; +//DWORD offset_SmackW32 = NULL; DWORD offset_Storm = NULL; -// manque : Game.exe D2DDraw.dll D2Direct3D.dll D2Glide.dll -const char* S_SmackW32 = "SmackW32.dll"; -const char* S_D2Common = "D2Common.dll"; -const char* S_ijl11 = "ijl11.dll"; -const char* S_D2Gdi = "D2Gdi.dll"; -const char* S_D2Win = "D2Win.dll"; -const char* S_D2sound = "D2sound.dll"; -const char* S_D2Multi = "D2Multi.dll"; -const char* S_D2MCPCLI = "D2MCPClient.dll"; -const char* S_D2Launch = "D2Launch.dll"; -const char* S_D2gfx = "D2gfx.dll"; -const char* S_D2Game = "D2Game.dll"; +const char* S_Game = "Game.exe"; +//const char* S_binkw32 = "binkw32.dll"; +//const char* S_Bnclient = "Bnclient.dll"; const char* S_D2Client = "D2Client.dll"; -const char* S_D2Net = "D2Net.dll"; -const char* S_D2Lang = "D2Lang.dll"; const char* S_D2CMP = "D2CMP.dll"; -const char* S_Bnclient = "Bnclient.dll"; +const char* S_D2Common = "D2Common.dll"; +//const char* S_D2DDraw = "D2DDraw.dll"; +//const char* S_D2Direct3D = "D2Direct3D.dll"; +const char* S_D2Game = "D2Game.dll"; +//const char* S_D2Gdi = "D2Gdi.dll"; +const char* S_D2gfx = "D2gfx.dll"; +//const char* S_D2Glide = "D2Glide.dll"; +const char* S_D2Lang = "D2Lang.dll"; +const char* S_D2Launch = "D2Launch.dll"; +//const char* S_D2MCPClient = "D2MCPClient.dll"; +//const char* S_D2Multi = "D2Multi.dll"; +const char* S_D2Net = "D2Net.dll"; +//const char* S_D2sound = "D2sound.dll"; +const char* S_D2Win = "D2Win.dll"; const char* S_Fog = "Fog.dll"; +//const char* S_ijl11 = "ijl11.dll"; +//const char* S_SmackW32 = "SmackW32.dll"; const char* S_Storm = "Storm.dll"; -DWORD loadLibrary( const char* libraryName) -{ - DWORD offset; -/* char currentpath[MAX_PATH]; - - if (!strcmp(libraryName,"D2Common.dll") || !strcmp(libraryName,"D2Game.dll") || !strcmp(libraryName,"D2Client.dll")) - { - GetCurrentDirectory(MAX_PATH,currentpath); - strncat(currentpath,"\\",MAX_PATH); - strncat(currentpath,libraryName,MAX_PATH); - log_msg("Load = %s : ",currentpath); - offset = (DWORD)LoadLibrary(currentpath); - log_msg("offset = %08X\n",offset); - if (offset) - { - log_msg("%s loaded successfully at: %08X\n", libraryName, offset); - return offset; - } - }*/ - offset = (DWORD)LoadLibrary(libraryName); - if (!offset) - { - log_msg("Failed to load library : %s\n", libraryName); - exit(-1); - } - log_msg("%s loaded successfully at: %08X\n", libraryName, offset); - - return offset; -} - -void freeLibrary( DWORD library ) -{ - if (library) - FreeLibrary((HINSTANCE__ *)library); -} - // Change the protection scheme of a loaded // DLL called libraryName in memory space at address addr+size to allow us to customize it. void hookLibrary(const char* libraryName, DWORD addr) @@ -152,55 +130,40 @@ void unhookLibrary(const char* libraryName, DWORD addr) log_msg("%s successfully unhooked. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode); } - -void loadD2Libraries () +void freeLibrary( DWORD library ) { - log_msg("***** Load D2 Libraries *****\n"); - - offset_SmackW32 = loadLibrary( S_SmackW32); //0xD000 0x03B90000 Already Loaded - - offset_D2Common = loadLibrary( S_D2Common); //0x8D000 0x037A0000 0x7C000 - offset_ijl11 = loadLibrary( S_ijl11); //0x24000 0x60000000 Already Loaded - - offset_D2Gdi = loadLibrary( S_D2Gdi); //0x7000 0x6F830000 Already Loaded - - offset_D2Win = loadLibrary( S_D2Win); //0x19000 0x6F8A0000 Already Loaded 0x1C000 - offset_D2sound = loadLibrary( S_D2sound); //0xC000 0x6F980000 Already Loaded 0xD000 -// offset_D2Multi = loadLibrary( S_D2Multi); //0x1000 0x6F9A0000 ? -// offset_D2MCPCLI = loadLibrary( S_D2MCPCLI); //0x6000 0x6F9F0000 Already Loaded - - offset_D2Launch = loadLibrary( S_D2Launch); //0x20000 0x6FA10000 Already Loaded 0x1E000 - offset_D2gfx = loadLibrary( S_D2gfx); //0xB000 0x6FA70000 Already Loaded - - offset_D2Game = loadLibrary( S_D2Game); //0xF6000 0x6FC30000 0xCF000 - offset_D2Client = loadLibrary( S_D2Client); //0xCC000 0x6FAA0000 0xCA000 - offset_D2Net = loadLibrary( S_D2Net); //0x6000 0x6FC00000 Already Loaded - - offset_D2Lang = loadLibrary( S_D2Lang); //0x0A000 0x6FC10000 Already Loaded - - offset_D2CMP = loadLibrary( S_D2CMP); //0x18000 0x6FDF0000 Already Loaded 0x19000 - offset_Bnclient = loadLibrary( S_Bnclient); //0x15000 0x6FF00000 Already Loaded - - offset_Fog = loadLibrary( S_Fog); //0x20000 0x6FF50000 Already Loaded 0x1F000 - offset_Storm = loadLibrary( S_Storm); //0x30000 0x6FFB0000 Already Loaded - - - log_msg("\n\n"); + if (library && library != offset_Game) + FreeLibrary((HMODULE)library); } - void freeD2Libraries() { + if (version_Game >= V114a) + return; + log_msg("***** Free Libraries *****\n"); - freeLibrary( offset_SmackW32 ); - freeLibrary( offset_D2Common ); - freeLibrary( offset_ijl11 ); - freeLibrary( offset_D2Gdi ); - freeLibrary( offset_D2Win ); - freeLibrary( offset_D2sound ); -// freeLibrary( offset_D2Multi ); -// freeLibrary( offset_D2MCPCLI ); - freeLibrary( offset_D2Launch ); - freeLibrary( offset_D2gfx ); - freeLibrary( offset_D2Game ); +// freeLibrary( offset_binkw32 ); +// freeLibrary( offset_Bnclient ); freeLibrary( offset_D2Client ); - freeLibrary( offset_D2Net ); - freeLibrary( offset_D2Lang ); freeLibrary( offset_D2CMP ); - freeLibrary( offset_Bnclient ); - freeLibrary( offset_Fog ); + freeLibrary( offset_D2Common ); +// freeLibrary( offset_D2DDraw ); +// freeLibrary( offset_D2Direct3D ); + freeLibrary( offset_D2Game ); +// freeLibrary( offset_D2Gdi ); + freeLibrary( offset_D2gfx ); +// freeLibrary( offset_D2Glide ); + freeLibrary( offset_D2Lang ); + freeLibrary( offset_D2Launch ); +// freeLibrary( offset_D2MCPClient ); +// freeLibrary( offset_D2Multi ); + freeLibrary( offset_D2Net ); +// freeLibrary( offset_D2sound ); + freeLibrary( offset_D2Win ); + freeLibrary( offset_Fog ); +// freeLibrary( offset_ijl11 ); +// freeLibrary( offset_SmackW32 ); freeLibrary( offset_Storm ); log_msg("\n\n"); @@ -210,16 +173,17 @@ void hookLibraries() { log_msg("***** Unprotect Libraries *****\n"); - hookLibrary(S_D2Common, offset_D2Common); hookLibrary(S_D2Client, offset_D2Client); - hookLibrary(S_D2Lang, offset_D2Lang); +// hookLibrary(S_D2CMP, offset_D2CMP); + hookLibrary(S_D2Common, offset_D2Common); hookLibrary(S_D2Game, offset_D2Game); + hookLibrary(S_D2gfx, offset_D2gfx); + hookLibrary(S_D2Lang, offset_D2Lang); + hookLibrary(S_D2Launch, offset_D2Launch); +// hookLibrary(S_D2Net, offset_D2Net); +// hookLibrary(S_D2Win, offset_D2Win); hookLibrary(S_Fog, offset_Fog); hookLibrary(S_Storm, offset_Storm); -// hookLibrary(S_D2Win, offset_D2Win); - hookLibrary(S_D2Launch, offset_D2Launch); - hookLibrary(S_D2gfx, offset_D2gfx); -// hookLibrary(S_D2Gdi, offset_D2Gdi); log_msg("\n\n"); } @@ -228,22 +192,26 @@ void unhookLibraries() { log_msg("***** Reprotect Libraries *****\n"); - unhookLibrary(S_D2Common, offset_D2Common); unhookLibrary(S_D2Client, offset_D2Client); - unhookLibrary(S_D2Lang, offset_D2Lang); +// unhookLibrary(S_D2CMP, offset_D2CMP); + unhookLibrary(S_D2Common, offset_D2Common); unhookLibrary(S_D2Game, offset_D2Game); + unhookLibrary(S_D2gfx, offset_D2gfx); + unhookLibrary(S_D2Lang, offset_D2Lang); + unhookLibrary(S_D2Launch, offset_D2Launch); +// unhookLibrary(S_D2Net, offset_D2Net); +// unhookLibrary(S_D2Win, offset_D2Win); unhookLibrary(S_Fog, offset_Fog); unhookLibrary(S_Storm, offset_Storm); -// unhookLibrary(S_D2Win, offset_D2Win); - unhookLibrary(S_D2Launch, offset_D2Launch); - unhookLibrary(S_D2gfx, offset_D2gfx); -// unhookLibrary(S_D2Gdi, offset_D2Gdi); log_msg("\n\n"); } void freeCustomLibraries() { + if (!customDlls) + return; + log_msg("***** Free custom libraries *****\n"); TCustomDll* dll=customDlls; @@ -290,14 +258,16 @@ void loadCustomLibraries() { if (curString[0]) { - offset_currentDll = loadLibrary(curString); - if (offset_currentDll) + offset_currentDll = (DWORD)LoadLibrary(curString); + if (!offset_currentDll) { - nextDll = customDlls; - customDlls = new(TCustomDll); - customDlls->nextDll = nextDll; - customDlls->initialize(offset_currentDll); + log_msg("Load library %s failed:\n", curString); + exit(0); } + nextDll = customDlls; + customDlls = new(TCustomDll); + customDlls->nextDll = nextDll; + customDlls->initialize(offset_currentDll); } curString=strtok(NULL,"|"); } @@ -308,150 +278,131 @@ void loadCustomLibraries() log_msg("\n\n"); } - -/* -void getVersion(DWORD addr, DWORD addr111, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111a, DWORD v111b, DWORD v112, DWORD v113c, DWORD v113d, const char * filename) +void loadLibrary(LPCSTR libName, int* libVersion, DWORD* libOffset, int shift, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113c) { - log_msg("version of %s\t",filename); - - if (addr==v109b) { - *ver = V109b; - log_msg("1.09b\n"); - } else if (addr==v109d) { - *ver = V109d; - log_msg("1.09d\n"); - } else if (addr==v110) { - *ver = V110; - log_msg("1.10\n"); - } else if ((addr==v111) && (addr111==v111a)) { - *ver = V111; - log_msg("1.11\n"); - } else if ((addr==v111) && (addr111==v111b)) { - *ver = V111b; - log_msg("1.11b\n"); - } else if (addr==v112) { - *ver = V112; - log_msg("1.12\n"); - } else if (addr==v113c) { - *ver = V113c; - log_msg("1.13c\n"); - } else if (addr==v113d) { - *ver = V113d; - log_msg("1.13d\n"); - } else { - *ver = V113d; - log_msg("unknow, try with 1.13d\n"); + *libOffset = (DWORD)LoadLibrary(libName); + if (*libOffset == NULL) + { + log_msg("Failed to load library : %s\n", libName); + exit(-1); } + log_msg("%s loaded at:\t%08X (", libName, *libOffset); + + DWORD addr = *(DWORD*)(*libOffset + shift); + if (version_Game != UNKNOW && (version_Game <= V108 || version_Game >= V113d)) + *libVersion = version_Game; + else if (addr==v109b) + *libVersion = V109b; + else if (addr==v109d) + *libVersion = V109d; + else if (addr==v110) + *libVersion = V110; + else if (addr==v111) + *libVersion = V111; + else if (addr==v111b) + *libVersion = V111b; + else if (addr==v112) + *libVersion = V112; + else if (addr==v113c) + *libVersion = V113c; + else { + *libVersion = version_Game != UNKNOW ? version_Game : V113d; + log_msg("unknow, try with "); + } + log_msg("%s)\n", GetVersionString(*libVersion)); } -#define GET_VERSION(F,X,Y,A,B,C,D,E,G,H,I) getVersion(*(DWORD*)(offset_##F + 0x##X), *(DWORD*)(offset_##F + 0x##Y), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, 0x##I, S_##F) -bool initD2version() + +#define GET_VERSION(F,S,A,B,C,D,E,G,H) loadLibrary(S_##F, &version_##F, &offset_##F, 0x##S, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H) +void initD2modules() { - log_msg("***** Get dll versions *****\n"); + log_msg("***** Get D2 Modules address and version *****\n"); + offset_Game = (DWORD)GetModuleHandle(NULL); + version_Game = GetD2Version((HMODULE)offset_Game); + log_msg("Game.exe loaded at:\t%08X (%s)\n", offset_Game, GetVersionString(version_Game)); - -//GET_VERSION(SmackW32 - GET_VERSION(D2Common, 80, 108, B03A26A0, 9E3DE7CC, 0355C185, 8402CA7A, 42E6C2E5, 43028BA5, E58C71DA, 00000000); -//GET_VERSION(ijl11 - GET_VERSION(D2Gdi, 80, 108, 90CFD95A, 86CE337B, A8CCC67B, 06059D7D, 42E6C248, 43028B2F, 5D6490A2, 00000000); - GET_VERSION(D2Win, 80, 108, B595A0CD, 1995DAD2, A8F5E2FD, B6DAB75A, 42E6C266, 43028B44, 6AA01FF5, 00000000); -//GET_VERSION(D2sound -//GET_VERSION(D2MCPCLI - GET_VERSION(D2Launch, 80, 100, A66532FF, 66678CC5, 686223E5, 80B0E2C6, 42E6C275, 43028B50, 205A4C0F, 00000000); - GET_VERSION(D2gfx, 80, 110, 00949FA8, 018866A8, 401526B2, 575C8A5E, 42E6C22A, 43028B19, ACBE1B9E, 00000000); - GET_VERSION(D2Client, 80, 108, 03522F39, 6730B639, C9817825, 37EC6E13, 42E6C43F, 43028CA5, 61A3B3D5, 00000000); - GET_VERSION(D2Net, 80, 0F0, E60F4DEA, 940E178B, 890FCC0B, C293A9D5, 42E6C20D, 43028B05, 19FA9F76, 00000000); - GET_VERSION(D2Lang, 80, 0F8, 111DCCB7, 13978953, DF917353, B91BAEA2, 42E6C213, 43028B09, B7B3978E, 00000000); - GET_VERSION(D2Game, 80, 108, B0805792, 8BB2C392, 92FA18E6, 00B6F7B7, 42E6C375, 43028C0D, BD8DD8E5, 00000000); - GET_VERSION(D2CMP, 80, 0F8, BA755486, 9A77DFEE, 38F44382, 4059B13F, 42E6C203, 43028AFE, 33A9427B, 00000000); -//GET_VERSION(Bnclient - GET_VERSION(Fog, 80, 100, 6F16123B, 75990846, 7E7ED3C7, D333B997, 42E6C1F0, 43028AF2, D3BD4F1B, 00000000); - GET_VERSION(Storm, E0, 110, 3B4B41D8, 3B8AB1CE, 00004550, 9C2BECC4, 42E6C1CA, 43028AD9, E4FA2944, 00000000); + if (version_Game >= V114a) + { +// offset_Bnclient = offset_Game; version_Bnclient = version_Game; + offset_D2Client = offset_Game; version_D2Client = version_Game; + offset_D2CMP = offset_Game; version_D2CMP = version_Game; + offset_D2Common = offset_Game; version_D2Common = version_Game; +// offset_D2DDraw = offset_Game; version_D2DDraw = version_Game; +// offset_D2Direct3D = offset_Game; version_D2Direct3D = version_Game; + offset_D2Game = offset_Game; version_D2Game = version_Game; +// offset_D2Gdi = offset_Game; version_D2Gdi = version_Game; + offset_D2gfx = offset_Game; version_D2gfx = version_Game; +// offset_D2Glide = offset_Game; version_D2Glide = version_Game; + offset_D2Lang = offset_Game; version_D2Lang = version_Game; + offset_D2Launch = offset_Game; version_D2Launch = version_Game; +// offset_D2MCPClient = offset_Game; version_D2MCPClient = version_Game; +// offset_D2Multi = offset_Game; version_D2Multi = version_Game; + offset_D2Net = offset_Game; version_D2Net = version_Game; +// offset_D2sound = offset_Game; version_D2sound = version_Game; + offset_D2Win = offset_Game; version_D2Win = version_Game; + offset_Fog = offset_Game; version_Fog = version_Game; + offset_Storm = offset_Game; version_Storm = version_Game; + } + else + { +// GET_VERSION(Bnclient //0x15000 0x6FF00000 Already Loaded - + GET_VERSION(D2Client, 17F, 00000000, 14500000, 12500000, 0D814800, 0D812800, 0DA01000, 0DA03000); //0xCC000 0x6FAA0000 0xCA000 + GET_VERSION(D2CMP, 1359, 3C686FE0, 38686FE0, 8BF78B56, 4C880424, 07C71824, CCCCCCCC, C7000005); //0x18000 0x6FDF0000 Already Loaded 0x19000 + GET_VERSION(D2Common, 10CA, A1E86FDC, B1E86FDC, 72D03B42, F883057E, 16746AC6, 00FE81C3, 74FE85DB); //0x8D000 0x037A0000 0x7C000 +// GET_VERSION(D2DDraw 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); // +// GET_VERSION(D2Direct3D 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); // +// GET_VERSION(D2Game, 1010, D22A78A1, D22910A1, D43FB0A1, 03E8506F, 53E8506F, 89E8506F, 63E8506F); //0xF6000 0x6FC30000 0xCF000 + GET_VERSION(D2Game, 1092, 18968BF1, 38968BF1, 28968BF1, F6335608, C690C5B9, 895FD713, 56535700); //0xF6000 0x6FC30000 0xCF000 +// GET_VERSION(D2Gdi, 105, B4000000, 0B210E00, E4000000, 48000401, 2F000401, 00000000, B7000401); //0x7000 0x6F830000 Already Loaded - + GET_VERSION(D2gfx, 10D, EB000000, 006FA700, 00000010, 2A000401, 19000401, 0B210E00, 00000000); //0xB000 0x6FA70000 Already Loaded - +// GET_VERSION(D2Glide 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); // + GET_VERSION(D2Lang, 126D, FC45048B, F445048B, 02C18313, C4830000, 00C6E045, 8B48408B, 0C75FF0C); //0x0A000 0x6FC10000 Already Loaded - + GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045); //0x20000 0x6FA10000 Already Loaded 0x1E000 +// GET_VERSION(D2MCPClient 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x6000 0x6F9F0000 Already Loaded - +// GET_VERSION(D2Multi 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x1000 0x6F9A0000 ? + GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded - +// GET_VERSION(D2sound 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xC000 0x6F980000 Already Loaded 0xD000 + GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8); //0x19000 0x6F8A0000 Already Loaded 0x1C000 + GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95); //0x20000 0x6FF50000 Already Loaded 0x1F000 + GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404); //0x30000 0x6FFB0000 Already Loaded - + if (version_Game == UNKNOW) + version_Game = version_D2gfx; + } +// GET_VERSION(binkw32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); // +// GET_VERSION(ijl11 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x24000 0x60000000 Already Loaded - +// GET_VERSION(SmackW32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xD000 0x03B90000 Already Loaded - log_msg("\n\n"); - return true; -} -*/ - -void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113c, int version, const char * filename) -{ - log_msg("version of %s\t", filename); - - if (version >= V113d) { - *ver = version; - log_msg("%s\n", GetVersionString(version)); - } else if (addr==v109b) { - *ver = V109b; - log_msg("1.09b\n"); - } else if (addr==v109d) { - *ver = V109d; - log_msg("1.09d\n"); - } else if (addr==v110) { - *ver = V110; - log_msg("1.10\n"); - } else if (addr==v111) { - *ver = V111; - log_msg("1.11\n"); - } else if (addr==v111b) { - *ver = V111b; - log_msg("1.11b\n"); - } else if (addr==v112) { - *ver = V112; - log_msg("1.12\n"); - } else if (addr==v113c) { - *ver = V113c; - log_msg("1.13c\n"); - } else { - *ver = V113d; - log_msg("unknow, try with 1.13d\n"); - } -} -#define GET_VERSION(F,X,A,B,C,D,E,G,H,V) getVersion(*(DWORD*)(offset_##F + 0x##X), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, V, S_##F) -bool initD2version() -{ - log_msg("***** Get Game.exe version *****\n"); - int version = GetD2Version(); - log_msg("Game.exe version : %i (%s)\n", version, GetVersionString(version)); - - log_msg("***** Get dll versions *****\n"); - -//GET_VERSION(SmackW32 - GET_VERSION(D2Common, 10CA, A1E86FDC, B1E86FDC, 72D03B42, F883057E, 16746AC6, 00FE81C3, 74FE85DB, version); -//GET_VERSION(ijl11 - GET_VERSION(D2Gdi, 105, B4000000, 0B210E00, E4000000, 48000401, 2F000401, 00000000, B7000401, version); - GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8, version); -//GET_VERSION(D2sound -//GET_VERSION(D2MCPCLI - GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045, version); - GET_VERSION(D2gfx, 10D, EB000000, 006FA700, 00000010, 2A000401, 19000401, 0B210E00, 00000000, version); - GET_VERSION(D2Client, 17F, 00000000, 14500000, 12500000, 0D814800, 0D812800, 0DA01000, 0DA03000, version); - GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808, version); - GET_VERSION(D2Lang, 126D, FC45048B, F445048B, 02C18313, C4830000, 00C6E045, 8B48408B, 0C75FF0C, version); -// GET_VERSION(D2Game, 1010, D22A78A1, D22910A1, D43FB0A1, 03E8506F, 53E8506F, 89E8506F, 63E8506F, version); - GET_VERSION(D2Game, 1092, 18968BF1, 38968BF1, 28968BF1, F6335608, C690C5B9, 895FD713, 56535700, version); - GET_VERSION(D2CMP, 1359, 3C686FE0, 38686FE0, 8BF78B56, 4C880424, 07C71824, CCCCCCCC, C7000005, version); -//GET_VERSION(Bnclient - GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95, version); - GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404, version); - - log_msg("\n\n"); - return true; } //////////////////////////////////// EXPORTS FUNCTIONS //////////////////////////////////// + +extern "C" __declspec(dllexport) bool __stdcall Release() +{ + log_msg("\n***** ENDING DIABLO II *****\n\n" ); + + freeCustomLibraries(); + freeD2Libraries(); + return true; +} + extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) { if (IniName) log_msg("* PlugY is called from D2mod.dll\n\n"); - else log_msg("* PlugY is called from D2gfx.dll\n\n"); static int isInstalled = false; if (isInstalled) return NULL; isInstalled=true; - loadD2Libraries(); + initD2modules(); - if (!initD2version()) return NULL; + if (version_Game < V109 || version_Game > V113d) + { + log_box("PlugY isn't compatible with this version : %s", GetVersionString(version_Game)); + Release(); + exit(0); + } - if (!initD2functions()) return NULL; + initD2functions(); loadParameters(); @@ -554,15 +505,4 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) return NULL; } - - -extern "C" __declspec(dllexport) bool __stdcall Release() -{ - log_msg("\n***** ENDING DIABLO II *****\n\n" ); - - freeCustomLibraries(); - freeD2Libraries(); - return true; -} - /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/Error.cpp b/PlugY/Error.cpp index 3f3b18b..163c93f 100644 --- a/PlugY/Error.cpp +++ b/PlugY/Error.cpp @@ -26,7 +26,7 @@ void log_initfile() _getcwd( log_file, MAX_PATH ); if( log_file[strlen(log_file)] != '\\') strcat(log_file, "\\"); - strcat(log_file, LOG_FILE); + strcat(log_file, "PlugY.log"); FILE* lLog = fopen( log_file, "w" ); diff --git a/PlugY/ExtendedSaveFile.cpp b/PlugY/ExtendedSaveFile.cpp index e3fb570..b0bdfa2 100644 --- a/PlugY/ExtendedSaveFile.cpp +++ b/PlugY/ExtendedSaveFile.cpp @@ -8,6 +8,7 @@ #include "extendedSaveFile.h" #include "infinityStash.h" #include "customLibraries.h" +#include "extraOptions.h" #include "common.h" #include @@ -44,7 +45,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS *size = 14; *((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM" *((WORD *)&data[4]) = FILE_VERSION; - *((DWORD*)&data[6]) = 0;// not used + *((DWORD*)&data[6]) = nbPlayersCommandByDefault - 1; *((DWORD*)&data[10]) = 0;// number of stash TCustomDll* currentDll = customDlls; @@ -58,8 +59,6 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS } - - int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS { if (!ptChar || !PCPY || !data) return 0; @@ -81,7 +80,9 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS return 9; } curSize += 2; - curSize += 4; + nbPlayersCommand = (*(BYTE*)&data[curSize]) + 1; + curSize += 1; + curSize += 3; int ret = loadStashList(ptChar, data, maxSize, &curSize, false); @@ -92,6 +93,7 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS currentDll=currentDll->nextDll; } + PCPY->selfStashIsOpened = true; return ret; } @@ -149,7 +151,7 @@ void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curS *curSize += 4; *(WORD *)(*data + *curSize) = FILE_VERSION; *curSize += 2; - *(DWORD *)(*data + *curSize) = 0; + *(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand - 1); *curSize += 4; saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize); diff --git a/PlugY/ExtraOptions.cpp b/PlugY/ExtraOptions.cpp index 9dc0dc7..8896f67 100644 --- a/PlugY/ExtraOptions.cpp +++ b/PlugY/ExtraOptions.cpp @@ -11,6 +11,7 @@ int active_DisplayItemLevel = false; DWORD nbPlayersCommandByDefault = 0; +DWORD nbPlayersCommand = 0; int active_alwaysRegenMapInSP = false; int active_RunLODs = false; int active_AlwaysDisplayLifeMana = false; @@ -185,15 +186,16 @@ void SendPlayersCommand() DWORD info = *infoEnabledSendPlayersCommand; if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return; + log_msg("SendPlayersCommand %u\n", nbPlayersCommand); - D2SetNbPlayers(nbPlayersCommandByDefault); + D2SetNbPlayers(nbPlayersCommand); memset(&data,0,sizeof(data)); data.displayType=0x15; data.un=1; data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10 data.null=NULL; - sprintf(data.string, msgNBPlayersString, nbPlayersCommandByDefault); + sprintf(data.string, msgNBPlayersString, nbPlayersCommand); D2SendMsgToAll((BYTE*)&data); } diff --git a/PlugY/InfinityStash.cpp b/PlugY/InfinityStash.cpp index 2573e9f..ad5838d 100644 --- a/PlugY/InfinityStash.cpp +++ b/PlugY/InfinityStash.cpp @@ -396,9 +396,10 @@ void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DW void updateSelectedStashClient(Unit* ptChar)//WORKS { Stash* newStash = PCPY->currentStash; + if (!newStash) + return; updateClient(ptChar, UC_SELECT_STASH, newStash->id, newStash->flags, PCPY->flags); updateClient(ptChar, UC_PAGE_NAME, newStash->name); - } void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)//WORKS @@ -415,8 +416,10 @@ void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool b } -void selectStash(Unit* ptChar, Stash* newStash)//WORKS +void selectStash(Unit* ptChar, Stash* newStash) { + if (!newStash) + return; changeToSelectedStash(ptChar, newStash, 0, 0); updateSelectedStashClient(ptChar); } @@ -449,7 +452,7 @@ void swapStash(Unit* ptChar, Stash* curStash, Stash* swpStash) if (!ptChar || !curStash || !swpStash || curStash == swpStash) return; changeToSelectedStash(ptChar, swpStash, 1, 0); - updateClient(ptChar, UC_SELECT_STASH, swpStash->id, swpStash->flags | 4, PCPY->flags); + updateClient(ptChar, UC_SELECT_STASH, swpStash->id, swpStash->flags | 8, PCPY->flags); } void toggleStash(Unit* ptChar, DWORD page) @@ -478,20 +481,20 @@ void insertStash(Unit* ptChar) { Stash* curStash = PCPY->currentStash; Stash* stash = addStash(ptChar, curStash->isShared); - do + while (stash->previousStash != curStash) { stash->flags = stash->previousStash->flags; stash->name = stash->previousStash->name; stash->ptListItem = stash->previousStash->ptListItem; stash = stash->previousStash; - } while (stash != curStash); + } stash->isIndex = 0; + stash->isMainIndex = 0; stash->name = NULL; stash->ptListItem = NULL; - selectNextStash(ptChar); } -bool deleteStash(Unit* ptChar) +bool deleteStash(Unit* ptChar, bool isClient) { if (firstClassicStashItem(ptChar) != NULL) return false; @@ -500,21 +503,24 @@ bool deleteStash(Unit* ptChar) if (stash->nextStash == NULL) { stash->isIndex = 0; + stash->isMainIndex = 0; stash->name = NULL; return true; } stash->flags = stash->nextStash->flags; stash->name = stash->nextStash->name; if (stash->nextStash->ptListItem != NULL) - swapStash(ptChar, stash, stash->nextStash); + changeToSelectedStash(ptChar, stash->nextStash, 1, isClient); stash = stash->nextStash; - do { + while (stash->nextStash) + { stash->flags = stash->nextStash->flags; stash->name = stash->nextStash->name; stash->ptListItem = stash->nextStash->ptListItem; stash = stash->nextStash; - } while (stash->nextStash); + } stash->isIndex = 0; + stash->isMainIndex = 0; stash->name = NULL; stash->ptListItem = NULL; return true; @@ -543,10 +549,12 @@ void renameCurrentStash(Unit* ptChar, char* name) } -void setCurrentStashIndex(Unit* ptChar, bool isIndex) +void setCurrentStashIndex(Unit* ptChar, int index) { - if (PCPY->currentStash) - PCPY->currentStash->isIndex = isIndex; + if (!PCPY->currentStash) + return; + PCPY->currentStash->isIndex = index >= 1; + PCPY->currentStash->isMainIndex = index == 2; updateSelectedStashClient(ptChar); } @@ -571,7 +579,7 @@ void selectNextStash(Unit* ptChar) Stash* selStash = PCPY->currentStash; if (!selStash->isShared && (selStash->id >= maxSelfPages)) return; if (selStash->isShared && (selStash->id >= maxSharedPages)) return; - + selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash); if (selStash && (selStash != PCPY->currentStash)) @@ -617,9 +625,16 @@ void selectPreviousIndex2Stash(Unit* ptChar) { selectPreviousStash(ptChar); Stash* selStash = PCPY->currentStash; - while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex2 != 0)) + while (selStash && !selStash->isMainIndex) selStash = selStash->previousStash; + if (selStash == NULL) + { + selStash = PCPY->currentStash; + while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex2 != 0)) + selStash = selStash->previousStash; + } + if (selStash && (selStash != PCPY->currentStash)) selectStash(ptChar, selStash); } @@ -649,11 +664,18 @@ void selectNextIndex2Stash(Unit* ptChar) { selectNextStash(ptChar); Stash* selStash = PCPY->currentStash; - while ((selStash->id+1) % nbPagesPerIndex2 != 0) + while (selStash && !selStash->isMainIndex) + selStash = selStash->nextStash; + + if (selStash == NULL) { - if (!selStash->isShared && (selStash->id >= maxSelfPages)) break; - if (selStash->isShared && (selStash->id >= maxSharedPages)) break; - selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);; + selStash = PCPY->currentStash; + while ((selStash->id+1) % nbPagesPerIndex2 != 0) + { + if (!selStash->isShared && (selStash->id >= maxSelfPages)) break; + if (selStash->isShared && (selStash->id >= maxSharedPages)) break; + selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);; + } } if (selStash && (selStash != PCPY->currentStash)) selectStash(ptChar, selStash); diff --git a/PlugY/Parameters.cpp b/PlugY/Parameters.cpp index 30557d8..1a3aa5f 100644 --- a/PlugY/Parameters.cpp +++ b/PlugY/Parameters.cpp @@ -783,9 +783,9 @@ void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0"); nbPlayersCommandByDefault = atoi(buffer); - if (version_D2Common == V110) - {if (nbPlayersCommandByDefault > 8) nbPlayersCommandByDefault=8;} - else if (nbPlayersCommandByDefault > 64) nbPlayersCommandByDefault=64; + if (version_D2Common == V109 || version_D2Common == V109b) + {if (nbPlayersCommandByDefault > 64) nbPlayersCommandByDefault=64;} + else if (nbPlayersCommandByDefault > 8) nbPlayersCommandByDefault=8; log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0"); diff --git a/PlugY/PlayerCustomData.cpp b/PlugY/PlayerCustomData.cpp index 1a51d92..e419795 100644 --- a/PlugY/PlayerCustomData.cpp +++ b/PlugY/PlayerCustomData.cpp @@ -72,11 +72,9 @@ void STDCALL updateClientPlayerOnLoading(Unit* ptChar) log_msg("--- Start updateClientPlayerOnLoading ---\n"); if (PCGame->isLODGame) { - //selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash); - if (openSharedStashOnLoading) - toggleToSharedStash(ptChar); - else - toggleToSelfStash(ptChar); + PCPY->showSharedStash = openSharedStashOnLoading; + selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash); + log_msg("End update client on loading.\n\n"); } updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0); diff --git a/PlugY/PlugY.rc b/PlugY/PlugY.rc index 33e0eea2cc1d436ad7f1bef5da95856c4dd0972a..b7b57cc1fd0a166e995b9f65103ecf07ac6bc8c3 100644 GIT binary patch delta 46 zcmcbken)-72QEgV$sf6l8I3lpa=&F_HDb_XFqj<3tGn5SuZ|HY7sxBV`4&GD3jl3x B4ZZ*X delta 46 zcmcbken)-72QEg#$sf6l84Wk9a=&F_HDu6ZFqj<3tGn5SuZ|HY7sxBV`4&GD3jl2d B4Y~jT diff --git a/PlugY/PlugY.suo b/PlugY/PlugY.suo index efae88e5abfd819e1b41886426cfc3232ff5c76a..76ea626db13f222a0f1c801fda39eece5d35ce1e 100644 GIT binary patch literal 44032 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 delta 1174 zcma)+T}YEr7{||f_rC8woNn6OJ3ngE%$6;gWR@S(IhS88ofQ>qHH%21%^-(l;us`1YHI}-4tY?>wlbfAw(Yb<2>ho-sha>dCtT1kCNU! z9prqr@fDX>Q>heLC4broN)B=u?6bZ1ctVbFD;3G^EdTSnC85|7H!#L@7sch*staZ| zqk3N%1x+#yD-l(KWJ*iAO{QN;nA<5JX+8U}(E@}|9>@m;pb%^aJAfN_fQUx06LtyM z1xmqgAoRWKv#@=z_tUJZnQLKHf>wI3x}yPD^`HR+K_du(CJ+XPK{MF6s||KLI07Q; zdI#ptb(@05R&p7vcX}^9Hifw|06k2+=O|6Pi|LWsM04hAMwSEFp3XmJ=`?agn9|bg zIWy{EiKu3LlC>r&3d~U&$yk)sH6a(R~j37N$<*P zsQTpTi(9*nrLR+&%tWvT5CZtIHxDXvzOQ~u3B3xDGy&r#T@20pc%c)VzHTN+O8(@9xGEHf@B58W4X>?x`O-R4B4#|-& ze9RS9Wo$dsMK6ZgP0Ox!n$HZ7o)=a{AKKF2{>al+FP0&R;`wpDhkoW?1CC^2)L^a}@R#ocU#FJs%*)ACG62_))i6QLzzMG;QTJ{x@)eS#3m4Fl{P z>BDEdR^^uT{|>@swuuEeRwBw1$fcU(5xZR#nPO}_EB*=!skq07bb|D>znOwPS!kX* qF4Nd#6P@jfio3128%{5lZcpJU>U~v-nrJfW^~*FpS@};s%Z@*bxF}fw diff --git a/PlugY/PlugY.vcproj b/PlugY/PlugY.vcproj index 2fceb0d..c5730ec 100644 --- a/PlugY/PlugY.vcproj +++ b/PlugY/PlugY.vcproj @@ -159,7 +159,7 @@ /> diff --git a/PlugY/UpdateClient.cpp b/PlugY/UpdateClient.cpp index 0c4a6d8..dfb5316 100644 --- a/PlugY/UpdateClient.cpp +++ b/PlugY/UpdateClient.cpp @@ -59,7 +59,7 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet) log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3); switch (packet->mFunc) { - case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 4) == 4); return 1; + case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1; case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1; case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1; default : return 0; diff --git a/PlugY/UpdateServer.cpp b/PlugY/UpdateServer.cpp index 3263e40..5977a38 100644 --- a/PlugY/UpdateServer.cpp +++ b/PlugY/UpdateServer.cpp @@ -34,8 +34,9 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param) case US_UNASSIGN_VIT_POINTS : UnassignVitPoints( ptChar ); return 1; case US_UNASSIGN_SKILLS : UnassignAllSkillsPoints( ptChar ); return 1; - case US_SET_INDEX: setCurrentStashIndex(ptChar, true); return 1; - case US_RESET_INDEX: setCurrentStashIndex(ptChar, false); return 1; + case US_SET_INDEX: setCurrentStashIndex(ptChar, 1); return 1; + case US_SET_MAIN_INDEX: setCurrentStashIndex(ptChar, 2); return 1; + case US_RESET_INDEX: setCurrentStashIndex(ptChar, 0); return 1; case US_SELECT_PREVIOUS : selectPreviousStash( ptChar ); return 1; case US_SELECT_NEXT : selectNextStash( ptChar ); return 1; case US_SELECT_SELF : if (active_sharedStash) toggleToSelfStash( ptChar ); return 1; @@ -46,10 +47,10 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param) case US_SELECT_NEXT2 : selectNext2Stash( ptChar ); return 1; case US_SELECT_PREVIOUS_INDEX2: selectPreviousIndex2Stash( ptChar ); return 1; case US_SELECT_NEXT_INDEX2 : selectNextIndex2Stash( ptChar ); return 1; - case US_INSERT_PAGE: insertStash(ptChar); return 1; - case US_DELETE_PAGE: deleteStash(ptChar); return 1; + case US_INSERT_PAGE: insertStash(ptChar); selectNextStash(ptChar); return 1; + case US_DELETE_PAGE: deleteStash(ptChar, false); return 1; - case US_SAVE : savePlayers( ptChar ); return 1; + case US_SAVE : savePlayers( ptChar ); return 1; case US_MAXGOLD : maxGold(ptChar); return 1; case US_PUTGOLD : putGold(ptChar, 0); return 1; diff --git a/PlugY/d2functions.h b/PlugY/d2functions.h index 88228cb..b2de3b3 100644 --- a/PlugY/d2functions.h +++ b/PlugY/d2functions.h @@ -109,6 +109,6 @@ void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, #define ptClientChar (*ptptClientChar) //#define CurrentNPCNum (*ptCurrentNPCNum) -bool initD2functions(); +void initD2functions(); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/d2wrapper.h b/PlugY/d2wrapper.h index bec1a83..aaf494a 100644 --- a/PlugY/d2wrapper.h +++ b/PlugY/d2wrapper.h @@ -15,41 +15,53 @@ COPYRIGHT #include -extern int version_SmackW32; -extern int version_D2Common; -extern int version_ijl11; -extern int version_D2Gdi; -extern int version_D2Win; -extern int version_D2sound; -extern int version_D2MCPCLI; -extern int version_D2Launch; -extern int version_D2gfx; +extern int version_Game; +//extern int version_binkw32; +//extern int version_Bnclient; extern int version_D2Client; -extern int version_D2Net; -extern int version_D2Lang; -extern int version_D2Game; extern int version_D2CMP; -extern int version_Bnclient; +extern int version_D2Common; +//extern int version_D2DDraw; +//extern int version_D2Direct3D; +extern int version_D2Game; +//extern int version_D2Gdi; +extern int version_D2gfx; +//extern int version_D2Glide; +extern int version_D2Lang; +extern int version_D2Launch; +//extern int version_D2MCPClient; +//extern int version_D2Multi; +extern int version_D2Net; +//extern int version_D2sound; +extern int version_D2Win; extern int version_Fog; +//extern int version_ijl11; +//extern int version_SmackW32; extern int version_Storm; // Address in memory of external DLL -extern DWORD offset_SmackW32; -extern DWORD offset_D2Common; -extern DWORD offset_ijl11; -extern DWORD offset_D2Gdi; -extern DWORD offset_D2Win; -extern DWORD offset_D2sound; -extern DWORD offset_D2MCPCLI; -extern DWORD offset_D2Launch; -extern DWORD offset_D2gfx; +extern DWORD offset_Game; +//extern DWORD offset_binkw32; +//extern DWORD offset_Bnclient; extern DWORD offset_D2Client; -extern DWORD offset_D2Net; -extern DWORD offset_D2Lang; -extern DWORD offset_D2Game; extern DWORD offset_D2CMP; -extern DWORD offset_Bnclient; +extern DWORD offset_D2Common; +//extern DWORD offset_D2DDraw; +//extern DWORD offset_D2Direct3D; +extern DWORD offset_D2Game; +//extern DWORD offset_D2Gdi; +extern DWORD offset_D2gfx; +//extern DWORD offset_D2Glide; +extern DWORD offset_D2Lang; +extern DWORD offset_D2Launch; +//extern DWORD offset_D2MCPClient; +//extern DWORD offset_D2Multi; +extern DWORD offset_D2Net; +//extern DWORD offset_D2sound; +extern DWORD offset_D2Win; extern DWORD offset_Fog; +//extern DWORD offset_ijl11; +//extern DWORD offset_SmackW32; extern DWORD offset_Storm; /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/extraOptions.h b/PlugY/extraOptions.h index 52531e1..3036e20 100644 --- a/PlugY/extraOptions.h +++ b/PlugY/extraOptions.h @@ -10,6 +10,7 @@ extern int active_DisplayItemLevel; extern DWORD nbPlayersCommandByDefault; +extern DWORD nbPlayersCommand; extern int active_alwaysRegenMapInSP; extern int active_RunLODs; extern int active_AlwaysDisplayLifeMana; diff --git a/PlugY/infinityStash.h b/PlugY/infinityStash.h index df4de52..af306e7 100644 --- a/PlugY/infinityStash.h +++ b/PlugY/infinityStash.h @@ -23,7 +23,7 @@ extern int posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn void toggleToSharedStash(Unit* ptChar); void toggleToSelfStash(Unit* ptChar); -void setCurrentStashIndex(Unit* ptChar, bool isIndex); +void setCurrentStashIndex(Unit* ptChar, int index); void selectPreviousStash(Unit* ptChar); void selectNextStash(Unit* ptChar); void selectPreviousIndexStash(Unit* ptChar); @@ -35,7 +35,7 @@ void selectNextIndex2Stash(Unit* ptChar); void swapStash(Unit* ptChar, DWORD page, bool toggle); void renameCurrentStash(Unit* ptChar, char* name); void insertStash(Unit* ptChar); -bool deleteStash(Unit* ptChar); +bool deleteStash(Unit* ptChar, bool isClient); void selectStash(Unit* ptChar, Stash* newStash); void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems); diff --git a/PlugY/parameters.h b/PlugY/parameters.h index 3f3d6db..8441038 100644 --- a/PlugY/parameters.h +++ b/PlugY/parameters.h @@ -6,9 +6,7 @@ =================================================================*/ #pragma once -#define PLUGY_VERSION "11.01" - -#define LOG_FILE "PlugY.log" +#define PLUGY_VERSION "11.02" enum TargetMod { diff --git a/PlugY/playerCustomData.h b/PlugY/playerCustomData.h index bd92782..e0a053a 100644 --- a/PlugY/playerCustomData.h +++ b/PlugY/playerCustomData.h @@ -21,6 +21,7 @@ struct Stash struct { DWORD isShared:1; // DWORD isIndex:1; // + DWORD isMainIndex:1; // DWORD isReserved:1; // For swap items comand }; }; diff --git a/PlugYInstall/PlugYInstall.cpp b/PlugYInstall/PlugYInstall.cpp index bd9fe35..9fc2555 100644 --- a/PlugYInstall/PlugYInstall.cpp +++ b/PlugYInstall/PlugYInstall.cpp @@ -1,4 +1,3 @@ - /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. @@ -9,50 +8,21 @@ #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") #include "../Commons/VersionInfo.h" -#include #include -const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation"; -const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit "; +DWORD loadCallerAddr; +DWORD loadCallerLen; +BYTE loadCallerNew[6] = { 0x90,0xE8,0x00,0x00,0x00,0x00 }; // Call load PlugY library +BYTE loadCallerOld[6] = { 0xFF,0x15,0x00,0x00,0x00,0x00 }; // CALL DWORD PTR DS:[<&KERNEL32.LoadLibrary>] -int CALL_LOAD[8] = { 0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423,0xAA03 }; -BYTE callNewLoad[8][6] = { { 0xE8,0x60,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA738A0 ;install loadlibrary - { 0xE8,0x60,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA738A0 ;install loadlibrary - { 0xE8,0x8B,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA73875 ;install loadlibrary - { 0xE8,0xD8,0x42,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA88B28 ;install loadlibrary - { 0xE8,0xD8,0x19,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA8B428 ;install loadlibrary - { 0xE8,0x98,0x3E,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA88F68 ;install loadlibrary - { 0xE8,0xD8,0x19,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA8B428 ;install loadlibrary - { 0xE8,0xF8,0x23,0x00,0x00,0x90 }};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary -BYTE callOldLoad[8][6] = { { 0xFF,0x15,0x3C,0xC0,0xA7,0x6F }, - { 0xFF,0x15,0x3C,0xC0,0xA7,0x6F }, - { 0xFF,0x15,0x40,0xC0,0xA7,0x6F }, - { 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }, - { 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }, - { 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }, - { 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }, - { 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }}; +DWORD freeCallerAddr; +DWORD freeCallerLen; +BYTE freeCallerNew[6] = { 0x90,0xE8,0x00,0x00,0x00,0x00 }; // Call free PlugY library +BYTE freeCallerOld[6] = { 0xFF,0x15,0x00,0x00,0x00,0x00 }; // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] -int CALL_FREE[8] = { 0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA,0xA9AA }; -BYTE callNewFree[8][6] = { { 0xE8,0xAF,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE40-6FA73A91 ;install freelibrary - { 0xE8,0xAF,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE40-6FA73A91 ;install freelibrary - { 0xE8,0xD2,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE44-6FA73A72 ;install freelibrary - { 0xE8,0x75,0x43,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA88ACF ;install freelibrary - { 0xE8,0x75,0x1A,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary - { 0xE8,0x35,0x3F,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA88F0F ;install freelibrary - { 0xE8,0x75,0x1A,0x00,0x00,0x90 },// JMP 6FA8CE44-6FA8B3CF ;install freelibrary - { 0xE8,0x95,0x24,0x00,0x00,0x90 }};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary -BYTE callOldFree[8][6] = { { 0xFF,0x15,0x44,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x44,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x48,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x2C,0xD1,0xA8,0x6F },// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - { 0xFF,0x15,0x24,0xD1,0xA8,0x6F }};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - -int CALLER_LOADPLUGY = 0xBE00;//6FA7BE00-6FA70000 -BYTE caller_LoadPlugY[] = { +DWORD loadDllAddr; +DWORD loadDllLen; +BYTE loadDll[] = { 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0x50, //PUSH EAX @@ -60,35 +30,45 @@ BYTE caller_LoadPlugY[] = { 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX 0x85,0xC0, //TEST EAX,EAX - 0x74,0x18, //JE SHORT d2gfx.6FA7BE37 - 0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init ID + 0x74,0x2B, //JE SHORT d2gfx.6FA7BE33 + 0x50, //PUSH EAX + 0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init String 0x50, //PUSH EAX 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX 0x74,0x04, //JE SHORT d2gfx.6FA7BDC1 0x6A,0x00, //PUSH 0 + 0xEB,0x13, //JMP SHORT d2gfx.6FA7BDC1 + 0x68,0x10,0x27,0x00,0x00, //PUSH 2710 ;Init Ordinal(10000) + 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] + 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress + 0x85,0xC0, //TEST EAX,EAX + 0x74,0x02, //JE SHORT d2gfx.6FA7BDC1 0xFF,0xD0, //CALL EAX 0x58, //POP EAX + 0x58, //POP EAX 0xC2,0x04,0x00, //RETN 4 - 0x59, //POP ECX - 0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll" - 0x83,0x04,0x24,0x11, //ADD DWORD PTR SS:[ESP],11 - 0xC2,0x04,0x00 }; //RETN 4 + 0x00,0x00,0x00,0x00 }; //HANDLE var; - -int CALLER_FREEPLUGY = 0xBE44;//6FA7BE44-6FA70000 -BYTE caller_FreePlugY[] = { +DWORD freeDllAddr; +DWORD freeDllLen; +BYTE freeDll[] = { 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary 0x50, //PUSH EAX 0xA1,0xFC,0xEF,0xA8,0x6F, //MOV EAX,DWORD PTR DS:[6FA8EFFC] 0x85,0xC0, //TEST EAX,EAX - 0x74,0x20, //JE SHORT d2gfx.6FA7BE74 + 0x74,0x2D, //JE SHORT d2gfx.6FA7BE74 0x50, //PUSH EAX - 0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;release + 0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;Release String 0x50, //PUSH EAX - 0x33,0xC0, //XOR EAX,EAX - 0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX + //0x33,0xC0, //XOR EAX,EAX + //0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX + 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress + 0x85,0xC0, //TEST EAX,EAX + 0x75,0x13, //JNZ SHORT d2gfx.6FA7BDEF + 0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001) + 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX 0x74,0x02, //JE SHORT d2gfx.6FA7BDEF @@ -97,328 +77,392 @@ BYTE caller_FreePlugY[] = { 0x58, //POP EAX 0xC2,0x04,0x00 }; //RETN 4 +DWORD libraryNameAddr; +DWORD libraryNameLen; +LPCSTR libraryName = "PlugY.dll"; -int S_DLLNAME = 0xBE80;//6FA7BE30-6FA70000 -BYTE sDllName[] = { 'P','l','u','g','Y','.','d','l','l',0 };// Dll filename to load. +DWORD initNameAddr; +DWORD initNameLen; +LPCSTR initName = "_Init@4"; -int S_INIT = 0xBE90;//6FA7BE10-6FA70000 -BYTE sInit[] = { '_','I','n','i','t','@','4',0 }; +DWORD releaseNameAddr; +DWORD releaseNameLen; +LPCSTR releaseName = "_Release@0"; -int S_RELEASE = 0xBEA0;//6FA7BE20-6FA70000 -BYTE sRelease[] = { '_','R','e','l','e','a','s','e','@','0',0 }; - -void updateData(int version) +int msgBox(LPCSTR boxName, UINT uType, LPCSTR pFormat, ...) { - switch (version) - { - case V109b: - case V109d: - caller_LoadPlugY[6] -= 4; - caller_LoadPlugY[18] -= 4; - caller_LoadPlugY[39] -= 4; - caller_FreePlugY[6] -= 4; - caller_FreePlugY[36] -= 4; - caller_FreePlugY[48] -= 4; - break; - case V110: - break; - case V111: - case V111b: - case V112: - case V113c: - case V113d: - CALLER_LOADPLUGY += 0x1000; - CALLER_FREEPLUGY += 0x1000; - S_INIT += 0x1000; - S_RELEASE += 0x1000; - S_DLLNAME += 0x1000; - *(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C; - *(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C; - *(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[6]) = (version == V113d) ? 0x6FA8D124 : 0x6FA8D12C; - *(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[48]) = (version == V113d) ? 0x6FA8D124 : 0x6FA8D12C; - caller_LoadPlugY[13] += 0x10; - caller_LoadPlugY[14]++; - caller_LoadPlugY[25]++; - caller_LoadPlugY[33] += 0x10; - caller_LoadPlugY[34]++; - caller_LoadPlugY[58] += 0x10; - caller_LoadPlugY[59]++; - caller_FreePlugY[23] += 0x10; - caller_FreePlugY[24]++; - caller_FreePlugY[14]++; - caller_FreePlugY[32]++; - break; - } + char buffer[300]; + va_list lArgs; + va_start( lArgs, pFormat ); + vsprintf_s( buffer, sizeof(buffer), pFormat, lArgs ); + va_end(lArgs); + + return MessageBox(NULL, buffer, boxName, uType); } + +int Align(int v) +{ + return v % 16 ? v + 16 - v % 16 : v; +} + ////////////////////////////// EXPORTED FUNCTIONS ////////////////////////////// -void Patch() +int Patch(FILE *targetFile) { - if (MessageBox(0, "This programm will modify the D2gfx.dll file of the current directory.\n" - "Before continue, don't forgot to backup D2gfx.dll if you want\n" - "Do you want patch D2gfx.dll for the launch of PlugY ?", - boxNameInstall, MB_YESNO | MB_ICONQUESTION) == IDNO) - { - MessageBox(0, "D2gfx.dll isn't patched.\n", - boxNameInstall, MB_OK | MB_ICONASTERISK); - exit(0); - } - - FILE *dll; - - if (fopen_s(&dll, "d2gfx.dll", "rb+")) - { - MessageBox(0, "Can't open D2gfx.dll in read/write mode.\n" - "If Diablo II is running you can\'t install PlugY, The Survival Kit.\n" - "Quit Diablo II and try again.", - boxNameInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - - int version = GetD2Version("Game.exe"); - - if (version < V109 || version > V113d) - { - MessageBox(0, "Bad version of D2gfx.dll.\n" - "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" - "Or re-install a clean version (between 1.09 and 1.13d) of LOD.", - boxNameInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - - updateData(version); - bool error = false; int ident = 0; BYTE buffer[100]; BYTE zeros[100]; memset(zeros, 0, sizeof(zeros)); - version -= V109b; + fseek(targetFile, loadCallerAddr, SEEK_SET); + fread(buffer, sizeof(loadCallerNew), 1, targetFile); + if (memcmp(buffer, loadCallerOld, sizeof(loadCallerNew)) != 0) error = true; + if (memcmp(buffer, loadCallerNew, sizeof(loadCallerNew)) == 0) ident++; - fseek(dll, CALL_LOAD[version], SEEK_SET); - fread(buffer, 6, 1, dll); - if (memcmp(buffer, callOldLoad[version], 6) != 0) error = true; - if (memcmp(buffer, callNewLoad[version], 6) == 0) ident++; + fseek(targetFile, freeCallerAddr, SEEK_SET); + fread(buffer, sizeof(freeCallerNew), 1, targetFile); + if (memcmp(buffer, freeCallerOld, sizeof(freeCallerNew)) != 0) error = true; + if (memcmp(buffer, freeCallerNew, sizeof(freeCallerNew)) == 0) ident++; - fseek(dll, CALL_FREE[version], SEEK_SET); - fread(buffer, 6, 1, dll); - if (memcmp(buffer, callOldFree[version], 6) != 0) error = true; - if (memcmp(buffer, callNewFree[version], 6) == 0) ident++; + fseek(targetFile, loadDllAddr, SEEK_SET); + fread(buffer, sizeof(loadDll), 1, targetFile); + if (memcmp(buffer, zeros, sizeof(loadDll)) != 0) error = true; + if (memcmp(buffer, loadDll, sizeof(loadDll)) == 0) ident++; - fseek(dll, CALLER_LOADPLUGY, SEEK_SET); - fread(buffer, sizeof(caller_LoadPlugY), 1, dll); - if (memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) != 0) error = true; - if (memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) == 0) ident++; + fseek(targetFile, freeDllAddr, SEEK_SET); + fread(buffer, sizeof(freeDll), 1, targetFile); + if (memcmp(buffer, zeros, sizeof(freeDll)) != 0) error = true; + if (memcmp(buffer, freeDll, sizeof(freeDll)) == 0) ident++; - fseek(dll, CALLER_FREEPLUGY, SEEK_SET); - fread(buffer, sizeof(caller_FreePlugY), 1, dll); - if (memcmp(buffer, zeros, sizeof(caller_FreePlugY)) != 0) error = true; - if (memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) == 0) ident++; + fseek(targetFile, initNameAddr, SEEK_SET); + fread(buffer, initNameLen, 1, targetFile); + if (memcmp(buffer, zeros, initNameLen) != 0) error = true; + if (memcmp(buffer, initName, initNameLen) == 0) ident++; - fseek(dll, S_INIT, SEEK_SET); - fread(buffer, sizeof(sInit), 1, dll); - if (memcmp(buffer, zeros, sizeof(sInit)) != 0) error = true; - if (memcmp(buffer, sInit, sizeof(sInit)) == 0) ident++; + fseek(targetFile, releaseNameAddr, SEEK_SET); + fread(buffer, releaseNameLen, 1, targetFile); + if (memcmp(buffer, zeros, releaseNameLen) != 0) error = true; + if (memcmp(buffer, releaseName, releaseNameLen) == 0) ident++; - fseek(dll, S_RELEASE, SEEK_SET); - fread(buffer, sizeof(sRelease), 1, dll); - if (memcmp(buffer, zeros, sizeof(sRelease)) != 0) error = true; - if (memcmp(buffer, sRelease, sizeof(sRelease)) == 0) ident++; - - fseek(dll, S_DLLNAME, SEEK_SET); - fread(buffer, sizeof(sDllName), 1, dll); - if (memcmp(buffer, zeros, sizeof(sDllName)) != 0) error = true; - if (memcmp(buffer, sDllName, sizeof(sDllName)) == 0) ident++; + fseek(targetFile, libraryNameAddr, SEEK_SET); + fread(buffer, libraryNameLen, 1, targetFile); + if (memcmp(buffer, zeros, libraryNameLen) != 0) error = true; + if (memcmp(buffer, libraryName, libraryNameLen) == 0) ident++; if (error) - { - if (ident == 7) - { - MessageBox(0, "PlugY, The Survival Kit already installed.", - boxNameInstall, MB_OK | MB_ICONASTERISK); - exit(0); - } - else - { - MessageBox(0, "Bad version of D2gfx.dll.\n" - "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" - "Or re-install a clean version (between 1.09 and 1.13d) of LOD.", - boxNameInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - } + return ident == 7 ? 1 : 2; - fseek(dll, CALL_LOAD[version], SEEK_SET); - fwrite(callNewLoad[version], 6, 1, dll); + fseek(targetFile, loadCallerAddr, SEEK_SET); + fwrite(loadCallerNew, 6, 1, targetFile); - fseek(dll, CALL_FREE[version], SEEK_SET); - fwrite(callNewFree[version], 6, 1, dll); + fseek(targetFile, freeCallerAddr, SEEK_SET); + fwrite(freeCallerNew, 6, 1, targetFile); - fseek(dll, CALLER_LOADPLUGY, SEEK_SET); - fwrite(caller_LoadPlugY, sizeof(caller_LoadPlugY), 1, dll); + fseek(targetFile, loadDllAddr, SEEK_SET); + fwrite(loadDll, sizeof(loadDll), 1, targetFile); - fseek(dll, CALLER_FREEPLUGY, SEEK_SET); - fwrite(caller_FreePlugY, sizeof(caller_FreePlugY), 1, dll); + fseek(targetFile, freeDllAddr, SEEK_SET); + fwrite(freeDll, sizeof(freeDll), 1, targetFile); - fseek(dll, S_INIT, SEEK_SET); - fwrite(sInit, sizeof(sInit), 1, dll); + fseek(targetFile, initNameAddr, SEEK_SET); + fwrite(initName, initNameLen, 1, targetFile); - fseek(dll, S_RELEASE, SEEK_SET); - fwrite(sRelease, sizeof(sRelease), 1, dll); + fseek(targetFile, releaseNameAddr, SEEK_SET); + fwrite(releaseName, releaseNameLen, 1, targetFile); - fseek(dll, S_DLLNAME, SEEK_SET); - fwrite(sDllName, sizeof(sDllName), 1, dll); + fseek(targetFile, libraryNameAddr, SEEK_SET); + fwrite(libraryName, libraryNameLen, 1, targetFile); - fclose(dll); - - MessageBox(0, "D2gfx.dll patched successfully.\n" - "PlugY, The Survival Kit installed successfully.", - boxNameInstall, MB_OK | MB_ICONASTERISK); - - exit(0); + return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////// -void Unpatch() +int Unpatch(FILE *targetFile) { - if (MessageBox(0, "This programm will modify the D2gfx.dll file of the current directory.\n" - "Before continue, don't forgot to backup D2gfx.dll if you want\n" - "Do you want patch D2gfx.dll for remove the launch of PlugY ?", - boxNameUnInstall, MB_YESNO | MB_ICONQUESTION) == IDNO) - { - MessageBox(0, "D2gfx.dll isn't patched.\n", - boxNameUnInstall, MB_OK | MB_ICONASTERISK); - exit(0); - } - - FILE *dll; - - if (fopen_s(&dll, "d2gfx.dll", "rb+")) - { - MessageBox(0, "Can't open D2gfx.dll in read/write mode.\n" - "If Diablo II is running you can\'t install PlugY, The Survival Kit.\n" - "Quit Diablo II and try again.", - boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - - int version = GetD2Version("Game.exe"); - - if (version < V109 || version > V113d) - { - MessageBox(0, "Bad version of D2gfx.dll.\n" - "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" - "Or re-install a clean version (between 1.09 and 1.13d) of LOD.", - boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - - updateData(version); - bool error = false; int ident = 0; BYTE buffer[100]; BYTE zeros[100]; memset(zeros, 0, sizeof(zeros)); - version -= V109b; + fseek(targetFile, loadCallerAddr, SEEK_SET); + fread(buffer, 6, 1, targetFile); + if (memcmp(buffer, loadCallerNew, 6) != 0) error = true; + if (memcmp(buffer, loadCallerOld, 6) == 0) ident++; - fseek(dll, CALL_LOAD[version], SEEK_SET); - fread(buffer, 6, 1, dll); - if (memcmp(buffer, callNewLoad[version], 6) != 0) error = true; - if (memcmp(buffer, callOldLoad[version], 6) == 0) ident++; + fseek(targetFile, freeCallerAddr, SEEK_SET); + fread(buffer, 6, 1, targetFile); + if (memcmp(buffer, freeCallerNew, 6) != 0) error = true; + if (memcmp(buffer, freeCallerOld, 6) == 0) ident++; - fseek(dll, CALL_FREE[version], SEEK_SET); - fread(buffer, 6, 1, dll); - if (memcmp(buffer, callNewFree[version], 6) != 0) error = true; - if (memcmp(buffer, callOldFree[version], 6) == 0) ident++; + fseek(targetFile, loadDllAddr, SEEK_SET); + fread(buffer, sizeof(loadDll), 1, targetFile); + if (memcmp(buffer, loadDll, sizeof(loadDll)) != 0) error = true; + if (memcmp(buffer, zeros, sizeof(loadDll)) == 0) ident++; - fseek(dll, CALLER_LOADPLUGY, SEEK_SET); - fread(buffer, sizeof(caller_LoadPlugY), 1, dll); - if (memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) != 0) error = true; - if (memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) == 0) ident++; + fseek(targetFile, freeDllAddr, SEEK_SET); + fread(buffer, sizeof(freeDll), 1, targetFile); + if (memcmp(buffer, freeDll, sizeof(freeDll)) != 0) error = true; + if (memcmp(buffer, zeros, sizeof(freeDll)) == 0) ident++; - fseek(dll, CALLER_FREEPLUGY, SEEK_SET); - fread(buffer, sizeof(caller_FreePlugY), 1, dll); - if (memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) != 0) error = true; - if (memcmp(buffer, zeros, sizeof(caller_FreePlugY)) == 0) ident++; + fseek(targetFile, initNameAddr, SEEK_SET); + fread(buffer, initNameLen, 1, targetFile); + if (memcmp(buffer, initName, initNameLen) != 0) error = true; + if (memcmp(buffer, zeros, initNameLen) == 0) ident++; - fseek(dll, S_INIT, SEEK_SET); - fread(buffer, sizeof(sInit), 1, dll); - if (memcmp(buffer, sInit, sizeof(sInit)) != 0) error = true; - if (memcmp(buffer, zeros, sizeof(sInit)) == 0) ident++; + fseek(targetFile, releaseNameAddr, SEEK_SET); + fread(buffer, releaseNameLen, 1, targetFile); + if (memcmp(buffer, releaseName, releaseNameLen) != 0) error = true; + if (memcmp(buffer, zeros, releaseNameLen) == 0) ident++; - fseek(dll, S_RELEASE, SEEK_SET); - fread(buffer, sizeof(sRelease), 1, dll); - if (memcmp(buffer, sRelease, sizeof(sRelease)) != 0) error = true; - if (memcmp(buffer, zeros, sizeof(sRelease)) == 0) ident++; - - fseek(dll, S_DLLNAME, SEEK_SET); - fread(buffer, sizeof(sDllName), 1, dll); - if (memcmp(buffer, sDllName, sizeof(sDllName)) != 0) error = true; - if (memcmp(buffer, zeros, sizeof(sDllName)) == 0) ident++; + fseek(targetFile, libraryNameAddr, SEEK_SET); + fread(buffer, libraryNameLen, 1, targetFile); + if (memcmp(buffer, libraryName, libraryNameLen) != 0) error = true; + if (memcmp(buffer, zeros, libraryNameLen) == 0) ident++; if (error) - { - if (ident == 7) - { - MessageBox(0, "PlugY, The Survival Kit already uninstalled.", - boxNameUnInstall, MB_OK | MB_ICONASTERISK); - exit(0); - } - else - { - MessageBox(0, "Bad version of D2gfx.dll.\n" - "Unable to uninstall PlugY, The Survival Kit.", - boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION); - exit(0); - } - } + return ident == 7 ? 1 : 2; - fseek(dll, CALL_LOAD[version], SEEK_SET); - fwrite(callOldLoad[version], 6, 1, dll); + fseek(targetFile, loadCallerAddr, SEEK_SET); + fwrite(loadCallerOld, 6, 1, targetFile); - fseek(dll, CALL_FREE[version], SEEK_SET); - fwrite(callOldFree[version], 6, 1, dll); + fseek(targetFile, freeCallerAddr, SEEK_SET); + fwrite(freeCallerOld, 6, 1, targetFile); - fseek(dll, CALLER_LOADPLUGY, SEEK_SET); - fwrite(zeros, sizeof(caller_LoadPlugY), 1, dll); + fseek(targetFile, loadDllAddr, SEEK_SET); + fwrite(zeros, sizeof(loadDll), 1, targetFile); - fseek(dll, CALLER_FREEPLUGY, SEEK_SET); - fwrite(zeros, sizeof(caller_FreePlugY), 1, dll); + fseek(targetFile, freeDllAddr, SEEK_SET); + fwrite(zeros, sizeof(freeDll), 1, targetFile); - fseek(dll, S_INIT, SEEK_SET); - fwrite(zeros, sizeof(sInit), 1, dll); + fseek(targetFile, initNameAddr, SEEK_SET); + fwrite(zeros, initNameLen, 1, targetFile); - fseek(dll, S_RELEASE, SEEK_SET); - fwrite(zeros, sizeof(sRelease), 1, dll); + fseek(targetFile, releaseNameAddr, SEEK_SET); + fwrite(zeros, releaseNameLen, 1, targetFile); - fseek(dll, S_DLLNAME, SEEK_SET); - fwrite(zeros, sizeof(sDllName), 1, dll); + fseek(targetFile, libraryNameAddr, SEEK_SET); + fwrite(zeros, libraryNameLen, 1, targetFile); - fclose(dll); - - MessageBox(0, "D2gfx.dll patched successfully.\n" - "PlugY, The Survival Kit uninstalled successfully.", - boxNameUnInstall, MB_OK | MB_ICONASTERISK); - exit(0); + return 0; } int main(int argc, char * argv[]) { - // if ((argc>1) && !strcmp(argv[1],"-u")) #ifdef RESTORE - Unpatch(); + bool unpatch = true; #else - if ((argc>1) && !strcmp(argv[1], "-u")) - Unpatch(); - else - Patch(); + bool unpatch = argc > 1 && strcmp(argv[1], "-u") == 0; #endif + int version = GetD2Version("Game.exe"); + LPCSTR boxName = unpatch ? "Uninstall PlugY, The Survival Kit" : "Install PlugY, The Survival Kit"; + LPCSTR targetFilename = version > V113d ? "Game.exe" : "D2gfx.dll"; + + if (version < V107 || version > V114d) + { + msgBox(boxName, MB_OK | MB_ICONEXCLAMATION, + "Current version of LoD (%s) isn't compatible with PlugY.\n\n" + "Please, install a patch between 1.09 and 1.13d.", + GetVersionString(version)); + exit(0); + } + + if (msgBox(boxName, MB_YESNO | MB_ICONQUESTION, + "This programm will modify %s file in current directory.\n" + "Before continue, you should backup it.\n\n" + "Do you want to modify %s to %s PlugY ?", + targetFilename, targetFilename, unpatch ? "remove": "install") == IDNO) + { + msgBox(boxName, MB_OK | MB_ICONASTERISK, "No changes made."); + exit(0); + } + + FILE *targetFile; + if (fopen_s(&targetFile, targetFilename, "rb+")) + { + msgBox(boxName, MB_OK | MB_ICONEXCLAMATION, + "Can't open %s in read/write mode.\n" + "If Diablo II is running, can you close it and try again ?", + targetFilename, unpatch ? "remove": "install"); + exit(0); + } + + // Get size + loadCallerLen = sizeof(loadCallerNew); + freeCallerLen = sizeof(freeCallerNew); + loadDllLen = sizeof(loadDll); + freeDllLen = sizeof(freeDll); + libraryNameLen = strlen(libraryName) + 1; + initNameLen = strlen(initName) + 1; + releaseNameLen = strlen(releaseName) + 1; + + // Get Addr + DWORD offsetPESignature; + fseek(targetFile, 0x3C, SEEK_SET); + fread(&offsetPESignature, sizeof(offsetPESignature), 1, targetFile); + DWORD sizeOfCode; + fseek(targetFile, offsetPESignature + 0x1C, SEEK_SET); + fread(&sizeOfCode, sizeof(sizeOfCode), 1, targetFile); + DWORD baseOfCode; + fseek(targetFile, offsetPESignature + 0x2C, SEEK_SET); + fread(&baseOfCode, sizeof(baseOfCode), 1, targetFile); + DWORD imageBase; + fseek(targetFile, offsetPESignature + 0x34, SEEK_SET); + fread(&imageBase, sizeof(imageBase), 1, targetFile); + DWORD sizeOfData; + fseek(targetFile, offsetPESignature + 0x150, SEEK_SET); + fread(&sizeOfData, sizeof(sizeOfData), 1, targetFile); + DWORD baseOfData; + fseek(targetFile, offsetPESignature + 0x154, SEEK_SET); + fread(&baseOfData, sizeof(baseOfData), 1, targetFile); + + // Set Addr + DWORD loadLibraryAddr = imageBase; + DWORD freeLibraryAddr = imageBase; + DWORD getProcAddressAddr = imageBase; + DWORD handleAddr = imageBase + baseOfData + sizeOfData; + + loadCallerAddr = 0; + freeCallerAddr = 0; + loadDllAddr = Align(baseOfCode + sizeOfCode - 0x100); + freeDllAddr = Align(loadDllAddr + sizeof(loadDll)); + libraryNameAddr = Align(freeDllAddr + sizeof(freeDll)); + initNameAddr = Align(libraryNameAddr + libraryNameLen); + releaseNameAddr = Align(initNameAddr + initNameLen); + + switch (version) + { + case V107: + loadCallerAddr += 0x3882; + freeCallerAddr += 0x3A6C; + loadLibraryAddr += 0xC038; + freeLibraryAddr += 0xC040; + getProcAddressAddr += 0xC034; + break; + case V108: + case V109: + case V109b: + case V109d: + loadCallerAddr += 0x389B; + freeCallerAddr += 0x3A8C; + loadLibraryAddr += 0xC03C; + freeLibraryAddr += 0xC044; + getProcAddressAddr += 0xC038; + break; + case V110: + loadCallerAddr += 0x3870; + freeCallerAddr += 0x3A6D; + loadLibraryAddr += 0xC040; + freeLibraryAddr += 0xC048; + getProcAddressAddr += 0xC03C; + break; + case V111: + loadCallerAddr += 0x8B23; + freeCallerAddr += 0x8ACA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case V111b: + loadCallerAddr += 0xB423; + freeCallerAddr += 0xB3CA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case V112: + loadCallerAddr += 0x8F63; + freeCallerAddr += 0x8F0A; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case V113c: + loadCallerAddr += 0xB423; + freeCallerAddr += 0xB3CA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case V113d: + loadCallerAddr += 0xAA03; + freeCallerAddr += 0xA9AA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD124; + getProcAddressAddr += 0xD120; + break; + case V114a: + loadCallerAddr += 0x1BCB;// Load advapi.dll + freeCallerAddr += 0xF375;// Free dbghelp.dll + loadLibraryAddr += 0x2CD118; + freeLibraryAddr += 0x2CD120; + getProcAddressAddr += 0x2CD11C; + break; + case V114b: + case V114c: + loadCallerAddr += 0x1BCB;// Load advapi.dll + freeCallerAddr += 0x6F75;// Free dbghelp.dll + loadLibraryAddr += 0x2CD11C; + freeLibraryAddr += 0x2CD124; + getProcAddressAddr += 0x2CD120; + break; + case V114d: + loadCallerAddr += 0x621C;// Load advapi.dll + freeCallerAddr += 0xB514;// Free dbghelp.dll + loadLibraryAddr += 0x2CC144; + freeLibraryAddr += 0x2CC14C; + getProcAddressAddr += 0x2CC148; + break; + default: + return false; + } + + *(DWORD*)&loadCallerNew[2] = loadDllAddr - (loadCallerAddr + sizeof(loadCallerNew)); + *(DWORD*)&loadCallerOld[2] = loadLibraryAddr; + *(DWORD*)&freeCallerNew[2] = freeDllAddr - (freeCallerAddr + sizeof(freeCallerNew)); + *(DWORD*)&freeCallerOld[2] = freeLibraryAddr; + *(DWORD*)&loadDll[6] = loadLibraryAddr; + *(DWORD*)&loadDll[12] = imageBase + libraryNameAddr; + *(DWORD*)&loadDll[18] = loadLibraryAddr; + *(DWORD*)&loadDll[23] = handleAddr; + *(DWORD*)&loadDll[33] = imageBase + initNameAddr; + *(DWORD*)&loadDll[40] = getProcAddressAddr; + *(DWORD*)&loadDll[63] = getProcAddressAddr; + *(DWORD*)&freeDll[6] = freeLibraryAddr; + *(DWORD*)&freeDll[12] = handleAddr; + *(DWORD*)&freeDll[22] = imageBase + releaseNameAddr; + *(DWORD*)&freeDll[29] = getProcAddressAddr; + *(DWORD*)&freeDll[48] = getProcAddressAddr; + *(DWORD*)&freeDll[60] = freeLibraryAddr; + + // Patch / Unpatch + int res; + if (unpatch) + res = Unpatch(targetFile); + else + res = Patch(targetFile); + + fclose(targetFile); + + if (res == 0) + msgBox(boxName, MB_OK | MB_ICONASTERISK, + "%s was modified.\n" + "PlugY, The Survival Kit %s.", + targetFilename, unpatch ? "is removed" : "is installed"); + else if (res == 1) + msgBox(boxName, MB_OK | MB_ICONASTERISK, + "PlugY, The Survival Kit already %s.", + unpatch ? "uninstalled" : "installed"); + else if (res == 2) + msgBox(boxName, MB_OK | MB_ICONASTERISK, + "File contents in %s isn't correct.\n" + "Unable to %s PlugY, The Survival Kit.", + targetFilename, unpatch ? "uninstall" : "install"); + return 1; } + +///////////////////////// END OF FILE /////////////////////// \ No newline at end of file diff --git a/PlugYInstall/PlugYInstall.rc b/PlugYInstall/PlugYInstall.rc index 68f4efd..07a9422 100644 --- a/PlugYInstall/PlugYInstall.rc +++ b/PlugYInstall/PlugYInstall.rc @@ -50,7 +50,7 @@ BEGIN VALUE "LegalCopyright", "Copyright (C) 2017" VALUE "OriginalFilename", "PlugYInstall.exe" VALUE "ProductName", "PlugY, The Survival Kit" - VALUE "ProductVersion", "11.01" + VALUE "ProductVersion", "11.02" END END BLOCK "VarFileInfo" diff --git a/PlugYInstall/PlugYInstall.suo b/PlugYInstall/PlugYInstall.suo index a5f1a4ad7a139fefe3f0dd92e4ccf854fed53da0..8595ff5a4a0a9cb62eddff6545e70b5c83b135b5 100644 GIT binary patch literal 14336 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 F;J-HD><$0` delta 2001 zcmcgtO>7%g5T3W$U9V%uaef>-IEn2fHED}e|4}H2{3kRaYSIdj2x-)mgg>=)l^Btl zptyo#5X93%QGu2V7bFDDg$q(ZNQg=Z0TL&WI06T_L;@mO^Ud0cnx8`tz*~*?d*94^ zZ|2R+I)6St^G1(SAN78r^jpPZk=@$p>Wuc5S~=w|=%dQb5k2Htd-0FgyRzS^3c_gO zoc^Urjet6AYZ!E7P8>Rq6bv5h(3eZ-(8nZ8ePT?R&Ii@vSKJYG^SBk45RE((1H2N<@Q2O@9z z%6?PTg7w;gXDi3JzcFFzVCsoCDue8F?WB)Rsg(izp`JkS_7yTP1Myiq-3R06t0X?lU!DG|OZ~`qjQS`A zd;};BO&YowW_{4bfl_!5+xjFWu_B3;f?mc^iDW8Gw8K%8^imkNdGyu$>DrFpZ~a!Z z*^9VIqSw{^q494bgM-6g`XIS(>AH3eyZKeU{E4<}CdRnJw8P`a7|m#NA}* zES?PZm@lvG+;i=$h2!RMz&u~|`<$(1Ba=V%cNc<~KS>s&OG4AWUhu53z;^%Dhm`PF^K?!_yy?I#`d|kcB6Ou2f8$y!r zvr{dJ?z3?UD1k?cBL=Hdfy6M2V-`nfN4OXoG^B_%*_X57M^&AT*28v3tY#yln%Znn z$<JORnzpRg${ diff --git a/PlugYInstaller/PlugY.ini b/PlugYInstaller/PlugY.ini index 26f1421..be9f943 100644 --- a/PlugYInstaller/PlugY.ini +++ b/PlugYInstaller/PlugY.ini @@ -5,7 +5,7 @@ ; ; ; by Yohann Nicolas ; ; ; -; version 11.01 ; +; version 11.02 ; ; ; ;--------------------------------------------------------------------------------------; @@ -30,7 +30,7 @@ ActiveCheckMemory=1 [WINDOWED] ActiveWindowed=0 -RemoveBorder=1 +RemoveBorder=0 WindowOnTop=0 Maximized=0 SetWindowPos=0 @@ -72,7 +72,7 @@ MaxPersonnalPages=0 ActiveSharedStash=1 SeparateHardcoreStash=1 OpenSharedStashOnLoading=0 -displaySharedSetItemNameInGreen=1 +DisplaySharedSetItemNameInGreen=1 MaxSharedPages=0 ActiveSharedGold=1 @@ -117,7 +117,7 @@ SelectMainPageOnOpenning=1 [EXTRA] ActiveLaunchAnyNumberOfLOD=1 AlwaysRegenMapInSP=0 -NBPlayersByDefault=0 +NBPlayersByDefault=1 ActiveDisplayItemLevel=1 AlwaysDisplayLifeAndManaValues=0 EnabledTXTFilesWhenMSExcelOpenIt=0 diff --git a/PlugYInstaller/PlugY.nsi b/PlugYInstaller/PlugY.nsi index 90c0274..9b4a93e 100644 --- a/PlugYInstaller/PlugY.nsi +++ b/PlugYInstaller/PlugY.nsi @@ -2,7 +2,7 @@ ; Modified by L'Autour. !include "MUI2.nsh" -!define VERSION "11.01" +!define VERSION "11.02" !define D2FILES "." !define NAME "PlugY, The Survival Kit" !define MOD_DIR "Mod PlugY" @@ -61,9 +61,9 @@ LangString DESC_MENU_SHORTCUTS ${LANG_RUSSIAN} " LangString DESC_UNINSTALLER ${LANG_ENGLISH} "Create a Windows uninstall program.$\nAdding registry keys in Windows." LangString DESC_UNINSTALLER ${LANG_FRENCH} "Crée un programme Windows de désinstallation.$\nAjoute des clés de registres dans Windows." LangString DESC_UNINSTALLER ${LANG_RUSSIAN} "Ñîçäàòü â Windows äåèíñòëëÿòîð ïðîãðàììû.$\nÄîáàâëÿåò êëþ÷è ðååñòðà â Windows." -LangString DESC_PATCH_D2GFX ${LANG_ENGLISH} "D2gfx.dll patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme." -LangString DESC_PATCH_D2GFX ${LANG_FRENCH} "D2gfx.dll patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI." -LangString DESC_PATCH_D2GFX ${LANG_RUSSIAN} "Ïðèìåíèòü ïàò÷ ê D2gfx.dll äëÿ çàïóñêà PlugY áåç PlugY.exe. Ïîäðîáíåå ñìîòðåòü â ôàéëå Readme." +LangString DESC_PATCH_FILE ${LANG_ENGLISH} "Patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme." +LangString DESC_PATCH_FILE ${LANG_FRENCH} "Patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI." +LangString DESC_PATCH_FILE ${LANG_RUSSIAN} "Ïðèìåíèòü ïàò÷ äëÿ çàïóñêà PlugY áåç PlugY.exe. Ïîäðîáíåå ñìîòðåòü â ôàéëå Readme." LangString SECTION_NAME_CORE ${LANG_ENGLISH} "${NAME} (required)" LangString SECTION_NAME_CORE ${LANG_FRENCH} "${NAME} (nécessaire)" LangString SECTION_NAME_CORE ${LANG_RUSSIAN} "${NAME} (òðåáóåòñÿ)" @@ -76,9 +76,9 @@ LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_RUSSIAN} " LangString SECTION_NAME_UNINSTALLER ${LANG_ENGLISH} "Uninstaller (add keys registers)" LangString SECTION_NAME_UNINSTALLER ${LANG_FRENCH} "Dé-installeur (ajoute clés de registre)" LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "Äåèíñòàëëÿòîð (äîáàâëÿåò êëþ÷è ðååñòðà)" -LangString SECTION_PATCH_D2GFX ${LANG_ENGLISH} "D2gfx.dll Patcher (advanced user only)" -LangString SECTION_PATCH_D2GFX ${LANG_FRENCH} "Patcheur de D2gfx.dll (utilisateur avancé uniquement)" -LangString SECTION_PATCH_D2GFX ${LANG_RUSSIAN} "Ïàò÷ äëÿ D2gfx.dll Patcher (äëÿ îïûòíûõ ïîëüçîâàòåëåé)" +LangString SECTION_PATCH_FILE ${LANG_ENGLISH} "File Patcher (advanced user only)" +LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de fichier (utilisateur avancé uniquement)" +LangString SECTION_PATCH_FILE ${LANG_RUSSIAN} "Ïàò÷ äëÿ Patcher (äëÿ îïûòíûõ ïîëüçîâàòåëåé)" LangString README_FILENAME ${LANG_ENGLISH} "PlugY_The_Survival_Kit_-_Readme.txt" LangString README_FILENAME ${LANG_FRENCH} "PlugY_The_Survival_Kit_-_LisezMoi.txt" @@ -222,10 +222,10 @@ Section $(SECTION_NAME_UNINSTALLER) Uninstaller WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "NoRepair" 1 SectionEnd -Section $(SECTION_PATCH_D2GFX) PatchD2gfx +Section $(SECTION_PATCH_FILE) PatchFile SetOutPath $D2Path - File "${D2FILES}\PatchD2gfxDll.exe" - File "${D2FILES}\RestoreD2gfxDll.exe" + File "${D2FILES}\PatchD2File.exe" + File "${D2FILES}\RestoreD2File.exe" SectionEnd ;-------------------------------- @@ -242,8 +242,8 @@ Section "Uninstall" Uninstall ; Remove files and uninstaller Delete "$D2Path\PlugY.dll" - Delete "$D2Path\PatchD2gfxDll.exe" - Delete "$D2Path\RestoreD2gfxDll.exe" + Delete "$D2Path\PatchD2File.exe" + Delete "$D2Path\RestoreD2File.exe" Delete "$INSTDIR\PlugY.exe" Delete "$INSTDIR\PlugY.log" Delete "$INSTDIR\BnetLog.txt" @@ -273,7 +273,7 @@ SectionEnd !insertmacro MUI_DESCRIPTION_TEXT "${Core}" $(DESC_CORE) !insertmacro MUI_DESCRIPTION_TEXT "${DesktopShortcuts}" $(DESC_DESKTOP_SHORTCUTS) !insertmacro MUI_DESCRIPTION_TEXT "${MenuShortcuts}" $(DESC_MENU_SHORTCUTS) - !insertmacro MUI_DESCRIPTION_TEXT "${PatchD2gfx}" $(DESC_PATCH_D2GFX) + !insertmacro MUI_DESCRIPTION_TEXT "${PatchFile}" $(DESC_PATCH_FILE) !insertmacro MUI_DESCRIPTION_TEXT "${Uninstaller}" $(DESC_UNINSTALLER) !insertmacro MUI_FUNCTION_DESCRIPTION_END diff --git a/PlugYInstaller/PlugY/LocalizedStrings.ini b/PlugYInstaller/PlugY/LocalizedStrings.ini index 86afc7d70239428609226f817e854c09d26a3502..1673a8bc689060cc1f24619e698ee8d2dcea89a0 100644 GIT binary patch delta 16 YcmbQWhiTRxrVR -#include -#include #include "../Commons/VersionInfo.h" #include "PlugYRun.h" -/* -0012C458 00000000 |ModuleFileName = NULL -0012C45C 0012C908 |CommandLine = ""C:\Jeux\Diablo II\Game.exe"" -0012C460 00000000 |pProcessSecurity = NULL -0012C464 00000000 |pThreadSecurity = NULL -0012C468 00000000 |InheritHandles = FALSE -0012C46C 04000022 |CreationFlags = DEBUG_ONLY_THIS_PROCESS|NORMAL_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE -0012C470 00000000 |pEnvironment = NULL -0012C474 0012DF94 |CurrentDir = "C:\Jeux\Diablo II\" -0012C478 0012C6BC |pStartupInfo = 0012C6BC -0012C47C 0012C5CC \pProcessInfo = 0012C5CC -*/ +#include +#include + #define MAX_LOADSTRING 100 #define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" @@ -44,7 +31,7 @@ BYTE loadDll[] = { 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX 0x85,0xC0, //TEST EAX,EAX - 0x74,0x2F, //JE SHORT d2gfx.6FA7BE37 + 0x74,0x2B, //JE SHORT d2gfx.6FA7BE33 0x50, //PUSH EAX 0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init String 0x50, //PUSH EAX @@ -62,13 +49,8 @@ BYTE loadDll[] = { 0x58, //POP EAX 0x58, //POP EAX 0xC2,0x04,0x00, //RETN 4 - 0x59, //POP ECX - 0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll" - 0x83,0x04,0x24,0x10, //ADD DWORD PTR SS:[ESP],10 - 0xC2,0x04,0x00, //RETN 4 0x00,0x00,0x00,0x00 }; //HANDLE var; - BYTE freeDll[] = { 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary @@ -94,11 +76,9 @@ BYTE freeDll[] = { 0x58, //POP EAX 0xC2,0x04,0x00 }; //RETN 4 - - //LPCSTR dllName = "PlugY.dll"; +//LPCSTR dllName = "PlugY.dll"; LPCSTR initFctName = "_Init@4"; LPCSTR releaseFctName = "_Release@0"; -static bool versionXP; typedef int(__stdcall* tDebugActiveProcessStop)(DWORD); tDebugActiveProcessStop debugActiveProcessStop; @@ -124,12 +104,17 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version LPBYTE loadLibraryAddr = addr; LPBYTE freeLibraryAddr = addr; LPBYTE getProcAddressAddr = addr; + switch (version) { case V107: + loadCallerAddr += 0x3882; + freeCallerAddr += 0x3A6C; + loadLibraryAddr += 0xC038; + freeLibraryAddr += 0xC040; + getProcAddressAddr += 0xC034; + break; case V108: - //TODO - return false; case V109: case V109b: case V109d: @@ -182,11 +167,27 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version getProcAddressAddr += 0xD120; break; case V114a: + loadCallerAddr += 0x1BCB;// Load advapi.dll + freeCallerAddr += 0xF375;// Free dbghelp.dll + loadLibraryAddr += 0x2CD118; + freeLibraryAddr += 0x2CD120; + getProcAddressAddr += 0x2CD11C; + break; case V114b: case V114c: + loadCallerAddr += 0x1BCB;// Load advapi.dll + freeCallerAddr += 0x6F75;// Free dbghelp.dll + loadLibraryAddr += 0x2CD11C; + freeLibraryAddr += 0x2CD124; + getProcAddressAddr += 0x2CD120; + break; case V114d: - //TODO - return false; + loadCallerAddr += 0x621C;// Load advapi.dll + freeCallerAddr += 0xB514;// Free dbghelp.dll + loadLibraryAddr += 0x2CC144; + freeLibraryAddr += 0x2CC14C; + getProcAddressAddr += 0x2CC148; + break; default: return false; } @@ -230,7 +231,6 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version DWORD baseOfCode = *(DWORD*)(buf + 0x2C); //MessageBox(0, "no memory", "RunPlugY.\n", MB_OK|MB_ICONASTERISK); - //memory = addr + 0xBE00 + isAdd * 0x1000; memory = addr + baseOfCode + sizeOfCode - 200; if (!VirtualProtectEx(h, memory, 200, PAGE_EXECUTE_READWRITE, &oldProtect)) assertion("PlugY : Failed to get memory pool in game thread"); @@ -271,7 +271,6 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version *(LPBYTE*)&loadDll[33] = initNameAddr; *(LPBYTE*)&loadDll[40] = getProcAddressAddr; *(LPBYTE*)&loadDll[63] = getProcAddressAddr; - *(LPBYTE*)&loadDll[80] = dllNameAddr; len = sizeof(loadDll); res = WriteProcessMemory(h, loadDllAddr, loadDll, len, &nb); if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed"); @@ -282,16 +281,14 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version *(LPBYTE*)&freeDll[6] = freeLibraryAddr; *(LPBYTE*)&freeDll[12] = handleAddr; *(LPBYTE*)&freeDll[22] = releaseNameAddr; - // *(LPBYTE*)&freeDll[30] = handleAddr; - *(LPBYTE*)&freeDll[36 - 7] = getProcAddressAddr; - *(LPBYTE*)&freeDll[55 - 7] = getProcAddressAddr; - *(LPBYTE*)&freeDll[67 - 7] = freeLibraryAddr; + *(LPBYTE*)&freeDll[29] = getProcAddressAddr; + *(LPBYTE*)&freeDll[48] = getProcAddressAddr; + *(LPBYTE*)&freeDll[60] = freeLibraryAddr; len = sizeof(freeDll); res = WriteProcessMemory(h, freeDllAddr, freeDll, len, &nb); if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed"); pos += pos % 16 ? len + 16 - pos % 16 : len; - // Patch load library buf[0] = 0x90; buf[1] = 0xE8; @@ -305,17 +302,14 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version res = WriteProcessMemory(h, freeCallerAddr, buf, len, &nb); if (!res || (nb != len)) assertion("PlugY: Write free library in memory failed"); - // if (oldProtect != -1) - // VirtualProtectEx(h,(LPVOID)memory, 200, oldProtect, &oldProtect); +// if (oldProtect != -1) +// VirtualProtectEx(h,(LPVOID)memory, 200, oldProtect, &oldProtect); return true; } - - //###########################################################################################// - /*bool copyLodVersionFiles() { BYTE folder[MAX_PATH]; @@ -337,32 +331,43 @@ return true; #define BUF_SIZE 0x300 -bool isD2gfx(HANDLE hProcess, LPVOID dllAdr) +bool isD2gfxLoaded(HANDLE hProcess, LPVOID addr) { SIZE_T nbRead; BYTE buf[BUF_SIZE]; - ReadProcessMemory(hProcess, dllAdr, buf, BUF_SIZE, &nbRead); - if (nbRead < 0x40) return false; - int offsetPESignature = *(DWORD*)(buf + 0x3C); - if (offsetPESignature + 38 >= BUF_SIZE) return false; - DWORD baseOfCode = *(DWORD*)(buf + offsetPESignature + 0x34); - if ((baseOfCode != 0x6FA80000) && (baseOfCode != 0x6FA70000)) return false; - - return true; -} - -bool isGameLoaded(HANDLE hProcess, LPVOID baseAdr) -{ - SIZE_T nbRead; - BYTE buf[BUF_SIZE]; - ReadProcessMemory(hProcess, baseAdr, buf, BUF_SIZE, &nbRead); - if (nbRead < 0x40) return false; + ReadProcessMemory(hProcess, addr, buf, BUF_SIZE, &nbRead); + if (nbRead < 0x60) return false; int offsetPESignature = *(DWORD*)(buf + 0x3C); if (offsetPESignature + 0x5C >= BUF_SIZE) return false; - DWORD baseOfCode = *(DWORD*)(buf + offsetPESignature + 0x34); + DWORD ImageBase = *(DWORD*)(buf + offsetPESignature + 0x34); DWORD SizeOfImage = *(DWORD*)(buf + offsetPESignature + 0x50); DWORD CheckSum = *(DWORD*)(buf + offsetPESignature + 0x58); - if ((baseOfCode==0x00400000) && (SizeOfImage == 0x005A5000) && (CheckSum == 0x00374101)) return true;//1.14c + if (ImageBase == 0x6FAA0000 && SizeOfImage == 0x00021000 && CheckSum == 0x00000000) return true;// 1.07 - 1.08 + if (ImageBase == 0x6FA70000 && SizeOfImage == 0x00021000 && CheckSum == 0x00000000) return true;// 1.09 - 1.09b - 1.09d - 1.10 + if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001743E) return true;// 1.11 + if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001F6C4) return true;// 1.11b + if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001F0B2) return true;// 1.12 + if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001BE5C) return true;// 1.13c + if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x00018542) return true;// 1.13d + + return false; +} + +bool isGameLoaded(HANDLE hProcess, LPVOID addr) +{ + SIZE_T nbRead; + BYTE buf[BUF_SIZE]; + ReadProcessMemory(hProcess, addr, buf, BUF_SIZE, &nbRead); + if (nbRead < 0x60) return false; + int offsetPESignature = *(DWORD*)(buf + 0x3C); + if (offsetPESignature + 0x5C >= BUF_SIZE) return false; + DWORD ImageBase = *(DWORD*)(buf + offsetPESignature + 0x34); + DWORD SizeOfImage = *(DWORD*)(buf + offsetPESignature + 0x50); + DWORD CheckSum = *(DWORD*)(buf + offsetPESignature + 0x58); + if (ImageBase == 0x00400000 && SizeOfImage == 0x005A6000 && CheckSum == 0x00371D8F) return true;//1.14a + if (ImageBase == 0x00400000 && SizeOfImage == 0x005A6000 && CheckSum == 0x0037645F) return true;//1.14b + if (ImageBase == 0x00400000 && SizeOfImage == 0x005A5000 && CheckSum == 0x00374101) return true;//1.14c + if (ImageBase == 0x00400000 && SizeOfImage == 0x005BA000 && CheckSum == 0x0037CED2) return true;//1.14d return false; } @@ -431,20 +436,26 @@ bool launchGame98(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName, if (!GetExitCodeProcess(pi.hProcess, &ret) || (ret != STILL_ACTIVE)) exit(0); - if (isD2gfx(pi.hProcess, (LPVOID)0x6FA80000)) + if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FA80000)) { installPlugY(pi.hProcess, (LPBYTE)0x6FA80000, libraryName, version); ResumeThread(pi.hThread); return true; } - if (isD2gfx(pi.hProcess, (LPVOID)0x6FA70000)) + if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FA70000)) { installPlugY(pi.hProcess, (LPBYTE)0x6FA70000, libraryName, version); ResumeThread(pi.hThread); return true; } + if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FAA0000)) + { + installPlugY(pi.hProcess, (LPBYTE)0x6FAA0000, libraryName, version); + ResumeThread(pi.hThread); + return true; + } ResumeThread(pi.hThread); - // Sleep(10); + //Sleep(10); } return false; } @@ -469,9 +480,9 @@ bool launchGameXP(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName, CloseHandle(DebugEvent.u.CreateThread.hThread); break; case CREATE_PROCESS_DEBUG_EVENT: - if (version >= V114a && isGameLoaded(pi.hProcess, DebugEvent.u.CreateProcessInfo.lpBaseOfImage)) + if (version >= V114a)// && isGameLoaded(pi.hProcess, DebugEvent.u.CreateProcessInfo.lpBaseOfImage)) { - //installPlugYOnGame(pi.hProcess, (DWORD)DebugEvent.u.CreateProcessInfo.lpBaseOfImage, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000, version); + installPlugY(pi.hProcess, (LPBYTE)DebugEvent.u.CreateProcessInfo.lpBaseOfImage, libraryName, version); CloseHandle(DebugEvent.u.CreateProcessInfo.hFile); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); @@ -486,7 +497,7 @@ bool launchGameXP(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName, MessageBox(0, "EXCEPTION_ACCESS_VIOLATION", "PlugY", MB_OK | MB_ICONASTERISK); break; case LOAD_DLL_DEBUG_EVENT: - if (version <= V113d && isD2gfx(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll)) + if (version <= V113d && isD2gfxLoaded(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll)) { installPlugY(pi.hProcess, (LPBYTE)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, version); CloseHandle(DebugEvent.u.LoadDll.hFile); @@ -514,8 +525,6 @@ int APIENTRY WinMain ( __in int nShowCmd ) { - GetD2Version(); - char currrentDirectory[MAX_PATH]; char iniFileName[MAX_PATH + sizeof(INIFILE) - 1]; char command[MAX_PATH + sizeof(GAMEFILE) + 200]; @@ -592,10 +601,8 @@ int APIENTRY WinMain ( return !launchNormal(command, currrentDirectory); // Check version - if (version == UNKNOW) - assertion("This LoD version isn't supported by PlugY."); - else if (version < V109 || version > V113d) - assertion("The %s version of LoD isn't supported by PlugY.", GetVersionString(version)); + if (version < V107 || version > V114d) + assertion("PlugY isn't compatible with this version : %s", GetVersionString(version)); // Launch LoD and install PlugY HMODULE module = GetModuleHandle("Kernel32.dll"); diff --git a/PlugYRun/PlugYRun.rc b/PlugYRun/PlugYRun.rc index b8b53a1a72a3e0b634fd672119066c4116a497c8..696f56ed6e1726cac243826f2a847901fdccaaa3 100644 GIT binary patch delta 57 zcmexi@WWukI(|l@$?N%zS&bNU7z`#G3P^4exWokH=>d5gg>^Tx2uCpjm24CipWGoL Kw7Em%12X{nhY;-m delta 57 zcmexi@WWukI(|mO$?N%zSq&L<7z`#G3P^4exWokH=>d5gg>^Tx2uCpjm24CipWGoL Kw7Em%12X{n01)W_ diff --git a/PlugYRun/PlugYRun.suo b/PlugYRun/PlugYRun.suo index 1a776e30a6173059430c555456b3574bc11a7bf1..1a2d9e0f97b2633b5bd64852ed045cf86f9837fc 100644 GIT binary patch literal 32256 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 delta 1762 zcmbW1T}%{L6vyu!W@cv>c7a(~=t7m1RUiv?cWVhDHSP+2;Re=(CsPw6klI#@!eU|F zB5kcnTcYls$fNP0Z@yIa%?HJg7-J+FpMCJb2V<;FTTF~WrvEbwMvK(OGx^QjbMC$8 z-h0luGchkGMt?h?XbYBQEnL`jO6JsrETMq9+H>y7RB&_Zo-7iO0HxJiS{Yg@&1OOr zGgKPY5=Ip)m}=48Oe4*>ReG)k!v>7DLv$3QT>{*|vuI~G-2XYg#{ebta3dQ6P}YEY z5Cm(%I?wYPa}?o{{86u0(=R+0tdiB@HH3&hrnSl z1cpHhjDREH8!!sSKpGqc8SpI_2TRAAHjYb;2X@jOUmxxDn^KVF?9`<5oU+EY>5_3t7u|luvVzHZI_R1!BAqni>Crf_ z4xS)g^vu)EJ(Mb4^jm6sD#egq%DQVPX*3_xg_JNnvU6A|?rZZBi&|EhBG}GiY)sg_ zH(hb9U{P${ZtFs|J=8$sq_E7M-(dc+@YG_@e>>p~{M*jDLx}w4vLB^U4TTTRH6mMS z#O$H#uCQJXbG=S4%x>wnw{F7FPh;LLx~4|*bKcunf#MaL9J}g-n0giIAf51;MQ`dJ zE+dr6RwTYp?8kcm=^Ykzq94UGfYi4j&5ywV4}`S-ud$zr4wTG6JcIDT#lo_F`P}VT zXaLI%;XRCJ5EV6qt*};*HOnWxZ5&xuD546?3D`m50#azKdMC$>=Bkq#hq8$K^g8r? zs!;la6Y=Ofy}$h^@L-3{NmqPUK2~E$btzSps!eK~B-383iCb#^MePo$3m+7X&H2=- zk|Meq8K+Bu3c6Rno@T0IbR#q=CB0mirJMCX=Rzkn72{7+*1u(XZHLO~rBqX|RBR7( zO_Pc|Niy`4$q^G`GMD=upF+*_wgqV>63b7t#1#swx{{D|x;!B>blC58AHjq}2=pK> zdxl+9v5O3zqoPxU#TF3}aq)@hpqY<0wML@2nz#f$<=vM+yt)Kr1>)3FSxIM_&%;e@ z<9qnv@NO5Y71X9cC(cX0J+d!VA8jGYEoD~s*voU!!{gCfK~oITAC diff --git a/PlugYRun/PlugYRun.vcproj b/PlugYRun/PlugYRun.vcproj index 866a1de..a8ff84b 100644 --- a/PlugYRun/PlugYRun.vcproj +++ b/PlugYRun/PlugYRun.vcproj @@ -160,7 +160,7 @@ />