mirror of
https://gitlab.com/hashborgir/plugy.git
synced 2024-10-05 09:06:03 +00:00
287 lines
13 KiB
Diff
287 lines
13 KiB
Diff
diff --git a/PlugY/D2wrapper.cpp b/PlugY/D2wrapper.cpp
|
|
index d13608e..ffd02f2 100644
|
|
--- a/PlugY/D2wrapper.cpp
|
|
+++ b/PlugY/D2wrapper.cpp
|
|
@@ -291,6 +291,7 @@ void loadCustomLibraries()
|
|
log_msg("\n\n");
|
|
}
|
|
|
|
+/*
|
|
void loadLibrary(LPCSTR libName, int* libVersion, DWORD* libOffset, int shift, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113c)
|
|
{
|
|
*libOffset = (DWORD)LoadLibrary(libName);
|
|
@@ -386,6 +387,273 @@ void initD2modules()
|
|
|
|
log_msg("\n\n");
|
|
}
|
|
+*/
|
|
+
|
|
+IMAGE_NT_HEADERS* GetHeader(LPBYTE pBase) {
|
|
+ if (pBase == NULL)
|
|
+ return NULL;
|
|
+
|
|
+ IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)pBase;
|
|
+
|
|
+ if (IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)))
|
|
+ return NULL;
|
|
+
|
|
+ if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
|
|
+ return NULL;
|
|
+
|
|
+ IMAGE_NT_HEADERS* pHeader = (IMAGE_NT_HEADERS*)(pBase + pDosHeader->e_lfanew);
|
|
+ if (IsBadReadPtr(pHeader, sizeof(IMAGE_NT_HEADERS)))
|
|
+ return NULL;
|
|
+
|
|
+ if (pHeader->Signature != IMAGE_NT_SIGNATURE)
|
|
+ return NULL;
|
|
+
|
|
+ return pHeader;
|
|
+}
|
|
+
|
|
+void initD2modules()
|
|
+{
|
|
+ log_msg("***** Get D2 Modules address and version *****\n\n");
|
|
+
|
|
+ offset_D2Client = (DWORD)LoadLibrary("D2Client.dll");
|
|
+ offset_D2CMP = (DWORD)LoadLibrary("D2CMP.dll");
|
|
+ offset_D2Common = (DWORD)LoadLibrary("D2Common.dll");
|
|
+ offset_D2Game = (DWORD)LoadLibrary("D2Game.dll");
|
|
+ offset_D2gfx = (DWORD)LoadLibrary("D2gfx.dll");
|
|
+ offset_D2Lang = (DWORD)LoadLibrary("D2Lang.dll");
|
|
+ offset_D2Launch = (DWORD)LoadLibrary("D2Launch.dll");
|
|
+ offset_D2Net = (DWORD)LoadLibrary("D2Net.dll");
|
|
+ offset_D2Win = (DWORD)LoadLibrary("D2Win.dll");
|
|
+ offset_Fog = (DWORD)LoadLibrary("Fog.dll");
|
|
+ offset_Storm = (DWORD)LoadLibrary("Storm.dll");
|
|
+
|
|
+ int count_109b = 0;
|
|
+ int count_109d = 0;
|
|
+ int count_110f = 0;
|
|
+ int count_111 = 0;
|
|
+ int count_111b = 0;
|
|
+ int count_112a = 0;
|
|
+ int count_113c = 0;
|
|
+ int count_113d = 0;
|
|
+ int count_114a = 0;
|
|
+ int count_114b = 0;
|
|
+ int count_114c = 0;
|
|
+ int count_114d = 0;
|
|
+
|
|
+ IMAGE_NT_HEADERS* pHeader;
|
|
+
|
|
+ if (offset_D2Client != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Client);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000C234D) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000C16CD) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000C1C1D) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000045E6) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000045EE) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000045FA) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000045F6) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000045DE) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2CMP != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2CMP);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00011361) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00011361) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00010E61) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C23) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C23) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C23) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C23) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C23) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Common != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Common);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00074D1D) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00074E2D) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000856DD) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C94) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C8D) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C97) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C8F) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000047C7) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Game != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Game);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000C66AC) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000C6D5C) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000EDC2C) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000036E6) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000373D) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000374B) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000373C) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003747) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2gfx != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2gfx);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000054EB) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000054EB) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000054A5) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001807) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001807) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001807) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001807) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001807) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Lang != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Lang);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00005148) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00005138) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00005048) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A6A) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A5B) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A75) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A71) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A5A) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Launch != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Launch);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000172C3) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00017243) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00018DC7) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A84) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A85) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A85) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A87) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001A84) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Net != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Net);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002BCE) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002BCE) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00002C6E) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001676) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001676) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000167E) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001676) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000167E) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_D2Win != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_D2Win);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00014F38) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00014F38) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00012EC0) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000187E) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000187E) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000188E) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000187E) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00001887) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_Fog != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_Fog);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00013658) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000142E7) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000162B0) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003159) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003142) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000314A) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003162) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003142) count_113d++;
|
|
+ }
|
|
+
|
|
+ if (offset_Storm != NULL) {
|
|
+ pHeader = GetHeader((LPBYTE)offset_Storm);
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00013658) count_109b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000142E7) count_109d++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x000162B0) count_110f++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003159) count_111++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003142) count_111b++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0000314A) count_112a++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00003162) count_113c++;
|
|
+ if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x0003C3E0) count_113d++;
|
|
+ }
|
|
+
|
|
+ int minimum_match_dll = 7;
|
|
+
|
|
+ if (count_109b >= minimum_match_dll) version_Game = V109b;
|
|
+ if (count_109d >= minimum_match_dll) version_Game = V109d;
|
|
+ if (count_110f >= minimum_match_dll) version_Game = V110;
|
|
+ if (count_111 >= minimum_match_dll) version_Game = V111;
|
|
+ if (count_111b >= minimum_match_dll) version_Game = V111b;
|
|
+ if (count_112a >= minimum_match_dll) version_Game = V112;
|
|
+ if (count_113c >= minimum_match_dll) version_Game = V113c;
|
|
+ if (count_113d >= minimum_match_dll) version_Game = V113d;
|
|
+
|
|
+ //version_SmackW32 = version_Game;
|
|
+ version_D2Common = version_Game;
|
|
+ //version_ijl11 = version_Game;
|
|
+ //version_D2Gdi = version_Game;
|
|
+ version_D2Win = version_Game;
|
|
+ //version_D2sound = version_Game;
|
|
+ //version_D2MCPCLI = version_Game;
|
|
+ version_D2Launch = version_Game;
|
|
+ version_D2gfx = version_Game;
|
|
+ version_D2Client = version_Game;
|
|
+ version_D2Net = version_Game;
|
|
+ version_D2Lang = version_Game;
|
|
+ version_D2Game = version_Game;
|
|
+ version_D2CMP = version_Game;
|
|
+ //version_Bnclient = version;
|
|
+ version_Fog = version_Game;
|
|
+ version_Storm = version_Game;
|
|
+
|
|
+ log_msg("DLL match for version 1.09b :\t%d\n", count_109b);
|
|
+ log_msg("DLL match for version 1.09d :\t%d\n", count_109d);
|
|
+ log_msg("DLL match for version 1.10f :\t%d\n", count_110f);
|
|
+ log_msg("DLL match for version 1.11 :\t%d\n", count_111);
|
|
+ log_msg("DLL match for version 1.11b :\t%d\n", count_111b);
|
|
+ log_msg("DLL match for version 1.12a :\t%d\n", count_112a);
|
|
+ log_msg("DLL match for version 1.13c :\t%d\n", count_113c);
|
|
+ log_msg("\n");
|
|
+
|
|
+ offset_Game = (DWORD)GetModuleHandle("Game.exe");
|
|
+ if (offset_Game != NULL) {
|
|
+ version_Game = GetD2Version((HMODULE)offset_Game);
|
|
+ log_msg("Game.exe loaded at:\t%08X (%s)\n", offset_Game, GetVersionString(version_Game));
|
|
+ if (version_Game >= V114a)
|
|
+ {
|
|
+ //version_SmackW32 = version_Game;
|
|
+ version_D2Common = version_Game;
|
|
+ //version_ijl11 = version_Game;
|
|
+ //version_D2Gdi = version_Game;
|
|
+ version_D2Win = version_Game;
|
|
+ //version_D2sound = version_Game;
|
|
+ //version_D2MCPCLI = version_Game;
|
|
+ version_D2Launch = version_Game;
|
|
+ version_D2gfx = version_Game;
|
|
+ version_D2Client = version_Game;
|
|
+ version_D2Net = version_Game;
|
|
+ version_D2Lang = version_Game;
|
|
+ version_D2Game = version_Game;
|
|
+ version_D2CMP = version_Game;
|
|
+ //version_Bnclient = version;
|
|
+ version_Fog = version_Game;
|
|
+ version_Storm = version_Game;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ //if (offset_Game != NULL) {
|
|
+ // pHeader = GetHeader((LPBYTE)offset_Game);
|
|
+ // if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00291342) count_114a++;
|
|
+ // if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x002854F2) count_114b++;
|
|
+ // if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x002850E2) count_114c++;
|
|
+ // if (pHeader->OptionalHeader.AddressOfEntryPoint == 0x00282985) count_114d++;
|
|
+ //}
|
|
+
|
|
+ log_msg("Version game is:\t(%s)\n\n", GetVersionString(version_Game));
|
|
+
|
|
+ if (version_Game == UNKNOWN)
|
|
+ {
|
|
+ MessageBoxA(NULL, "This version of Diablo II is not supported by Plugy. Please upgrade or downgrade to a supported version.", "Plugy 14.03", MB_OK);
|
|
+ }
|
|
+}
|
|
+
|
|
//////////////////////////////////// EXPORTS FUNCTIONS ////////////////////////////////////
|
|
|
|
|