/*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. Add support 1.14d by haxifix. Adding custom data. Save and load infinity & shared Stash =================================================================*/ #include "plugYFiles.h" #include "common.h" #include //#include "newInterfaces.h" extern bool active_SkillsPoints, active_StatsPoints, active_newInterfaces, active_multiPageStash, active_sharedGold; void* unassignSkillsBtnImages = NULL; void* unassignStatsBtnImages = NULL; void* stashBtnsImages = NULL; void* newStatsInterfaceImages = NULL; void* statsBackgroundImages = NULL; void* sharedGoldBtnsImages = NULL; //void* lookupItemStatCost = NULL; DWORD STDCALL isModFile (char* filename) { if (strstr(filename, modDataDirectory) ) { char fileTemp[0x104]; log_msg("Load custom file : %s", filename); strcpy(fileTemp,filename); D2FogGetInstallPath(filename,0x104-strlen(filename)); strcat(filename,fileTemp); log_msg("-> %s\n", filename); if ((GetFileAttributesA(filename) & 0x10) == 0) return true; } return false; } FCT_ASM ( caller_isModFile ) TEST ESI,ESI JNZ ISNOTMODDATA MOV EBP, DWORD PTR SS:[ESP+0x140] PUSH EBP CALL isModFile TEST EAX,EAX JE ISNOTMODDATA MOV BL, BYTE PTR SS:[ESP+0x144] POP EAX POP EAX MOV EAX,D2StormMPQOpenFile ADD EAX,0x9A JMP EAX ISNOTMODDATA: JMP DWORD PTR CS:[LeaveCriticalSection] }} FCT_ASM ( caller_isModFile_111 ) TEST EDI,EDI JNZ ISNOTMODDATA MOV ESI, DWORD PTR SS:[ESP+0x130] PUSH ESI CALL isModFile TEST EAX,EAX JE ISNOTMODDATA MOV BL, BYTE PTR SS:[ESP+0x134] POP EAX POP EAX MOV EAX,D2StormMPQOpenFile ADD EAX,0xBD MOV EBP,GetFileAttributesA JMP EAX ISNOTMODDATA: JMP DWORD PTR CS:[LeaveCriticalSection] }} FCT_ASM( caller_isModFile_114 ) PUSH EBX CALL isModFile TEST EAX, EAX JE ISNOTMODDATA MOV EDX, 0x1 ISNOTMODDATA : LEA EAX, DWORD PTR SS : [EBP - 0x108] RETN }} void Install_PlugYFiles() { static int isInstalled = false; if (isInstalled) return; log_msg("Patch Storm to found custom file. (PlugYFiles)\n"); // Try in Diablo II\PlugY\ if file not found mem_seek R8(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79, 19369);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) ); memt_byte( version_D2Client == V114d ? 0x8D : 0xFF ,0x90); // NOP memt_byte( version_D2Client == V114d ? 0x85 : 0x15 ,0xE8); // CALL if (version_Storm == V114d) { MEMT_REF4(0xFFFFFEF8, caller_isModFile_114); } else { MEMD_REF4(LeaveCriticalSection, version_Storm == V114d ? caller_isModFile_114 : version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile); } //6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC1DA79 |. FF15 3C32C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection log_msg("\n" ); isInstalled = true; } //6FFC7EF0 >/$ 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10] /****************************************************************************************************/ void loadImagesFile(void** images, const char* name) { if(!images || !name) return; if(!*images) { char buffer[MAX_PATH]; sprintf(buffer, "%s\\%s", modDataDirectory, name); log_msg("Images file to load : %s\n",buffer); *images = D2LoadImage(buffer,0); if (!*images) { sprintf(buffer, "Don't find Buttons Images File : %s.dc6", name); d2_assert(!*images, buffer, __FILE__, __LINE__); } } } void STDCALL loadCustomImages() { if ( active_SkillsPoints ) loadImagesFile(&unassignSkillsBtnImages, "UnassignSkillsBtns"); if ( active_StatsPoints ) loadImagesFile(&unassignStatsBtnImages, "UnassignStatsBtns"); if ( active_multiPageStash || active_newInterfaces) loadImagesFile(&stashBtnsImages, "StashBtns"); if ( active_sharedGold) loadImagesFile(&sharedGoldBtnsImages, "SharedGoldBtns"); if ( active_newInterfaces ) loadImagesFile(&newStatsInterfaceImages, "EmptyPage"); if ( active_newInterfaces ) loadImagesFile(&statsBackgroundImages, "StatsBackground"); } #define freeImagesFile(I) if(I) {D2FreeImage(I);I=NULL;} void STDCALL freeCustomImages() { freeImagesFile(unassignSkillsBtnImages); freeImagesFile(unassignStatsBtnImages); freeImagesFile(stashBtnsImages); freeImagesFile(sharedGoldBtnsImages); freeImagesFile(newStatsInterfaceImages); freeImagesFile(statsBackgroundImages); } FCT_ASM( caller_loadCustomImages_114 ) CALL loadCustomImages POP EAX PUSH 0x6CC8B8 JMP EAX }} FCT_ASM ( caller_loadCustomImages ) CALL loadCustomImages MOV ECX,0x0C RETN }} FCT_ASM( caller_freeCustomImages_114 ) CALL freeCustomImages POP EAX PUSH 0x7BEF30 JMP EAX }} FCT_ASM ( caller_freeCustomImages ) CALL freeCustomImages MOV ECX,0x0C RETN }} void Install_PlugYImagesFiles() { static int isInstalled = false; if (isInstalled) return; Install_PlugYFiles(); log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n"); // Load custom images mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 96955); memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68), 0xE8); MEMT_REF4(version_D2Client == V114d ? 0x006CC8B8 : 0x0000000C, version_D2Client == V114d ? caller_loadCustomImages_114 : caller_loadCustomImages); //6FAFE4B1 |. B9 0C000000 MOV ECX,0C //6FADE101 |. B9 0C000000 MOV ECX,0C //6FB667E1 |. B9 0C000000 MOV ECX,0C //6FB32761 |. B9 0C000000 MOV ECX,0C //6FAD7EAE |. B9 0C000000 MOV ECX,0C //6FB1E0BE |. B9 0C000000 MOV ECX,0C // Free custom images mem_seek R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 96AFB); memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68),0xE8); MEMT_REF4(version_D2Client == V114d ? 0x007BEF30 : 0x0000000C, version_D2Client == V114d ? caller_freeCustomImages_114 : caller_freeCustomImages); //6FAFE639 |> B9 0C000000 MOV ECX,0C //6FADD12D |> B9 0C000000 MOV ECX,0C //6FB6580D |> B9 0C000000 MOV ECX,0C //6FB3158D |> B9 0C000000 MOV ECX,0C //6FAD6F8D |> B9 0C000000 MOV ECX,0C //6FB1D07D |> B9 0C000000 MOV ECX,0C log_msg("\n" ); isInstalled = true; } /****************************************************************************************************/ void loadStatsInterfaceDesc(DWORD mempool); void freeStatsInterfaceDesc(); void FASTCALL loadTxtFiles(DWORD mempool) { loadStatsInterfaceDesc(mempool); } void FASTCALL freeTxtFiles() { freeStatsInterfaceDesc(); } FCT_ASM ( caller_loadTxtFiles_111 ) MOV ECX,DWORD PTR SS:[ESP+4] CALL loadTxtFiles JMP D2LoadSuperuniques }} FCT_ASM ( caller_loadTxtFiles ) PUSH ECX CALL loadTxtFiles POP ECX JMP D2LoadSuperuniques }} FCT_ASM ( caller_freeTxtFiles ) CALL freeTxtFiles JMP D2Fog10212 }} void Install_PlugYTxtFiles() { static int isInstalled = false; if (isInstalled) return; Install_PlugYFiles(); log_msg("Patch D2Common to load/free custom txt files. (PlugYTxtFiles)\n"); // lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000); // Load custom txt files mem_seek R8(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4, 25A560); MEMC_REF4( D2LoadSuperuniques, version_D2Common == V114d ? caller_loadTxtFiles : version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); //6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500 //6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510 //01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0 //6FDC6853 |. E8 58B6FFFF CALL D2Common.6FDC1EB0 ; \D2Common.6FDC1EB0 //6FD87443 |. E8 58B6FFFF CALL D2Common.6FD82AA0 ; \D2Common.6FD82AA0 //6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0 //6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870 //6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40 // Free custom txt files mem_seek R8(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3, 25A1C8); if (version_D2Common == V114d) { MEMT_REF4(0x00062EE4, caller_freeTxtFiles); } else { MEMJ_REF4(D2Fog10212, caller_freeTxtFiles); } //6FD479EB . E8 C8C00600 CALL //6FD479EB . E8 C8C00600 CALL //01B50185 |. E8 F8410700 CALL //6FD832B2 |. E8 755FFDFF CALL //6FD65AB2 |. E8 B537FFFF CALL //6FD94E12 |. E8 1744FCFF CALL //6FDAE8B2 |. E8 8FA9FAFF CALL //6FD5FAA2 |. E8 5FB4FFFF CALL log_msg("\n" ); isInstalled = true; } /*================================= END OF FILE =================================*/