mirror of
https://gitlab.com/hashborgir/CharmZone-1.10.git
synced 2024-10-05 17:15:59 +00:00
158 lines
8.3 KiB
C++
158 lines
8.3 KiB
C++
#pragma once
|
|
|
|
#ifndef _D2PATCH_H
|
|
#define _D2PATCH_H
|
|
|
|
#include "D2PatchConst.h"
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <windows.h>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <map>
|
|
#include <fstream>
|
|
#include <algorithm>
|
|
|
|
// Function to read settings from D2Mod.ini file
|
|
int ReadSettingFromIni(const char* section, const char* key, BYTE defaultValue) {
|
|
return GetPrivateProfileInt(section, key, defaultValue, "D2Mod.ini");
|
|
}
|
|
|
|
// Function to calculate relative offset (D2COMMON base address is 0x6F600000)
|
|
DWORD calculateRelativeOffsetD2Common(DWORD offset) {
|
|
return offset - 0x6F600000;
|
|
}
|
|
|
|
// Function to calculate relative offset (D2COMMON base address is 0x6F600000)
|
|
DWORD calculateRelativeOffsetD2Client(DWORD offset) {
|
|
return offset - 0x6FAA0000;
|
|
}
|
|
|
|
// Define settings from D2Mod.ini
|
|
BYTE leftBorder = ReadSettingFromIni("CharmZone", "leftBorder", 0x00);
|
|
BYTE rightBorder = ReadSettingFromIni("CharmZone", "rightBorder", 0x10);
|
|
BYTE topBorder = ReadSettingFromIni("CharmZone", "topBorder", 0x0C);
|
|
BYTE bottomBorder = ReadSettingFromIni("CharmZone", "bottomBorder", 0x10);
|
|
|
|
// Function to reverse the bytes of a hexadecimal number
|
|
uint32_t reverseHexBytes(uint32_t hexNumber) {
|
|
uint32_t reversedHex = 0;
|
|
|
|
// Reverse the bytes
|
|
reversedHex |= (hexNumber & 0x000000FF) << 24; // Move the last byte to the first byte
|
|
reversedHex |= (hexNumber & 0x0000FF00) << 8; // Move the second last byte to the second byte
|
|
reversedHex |= (hexNumber & 0x00FF0000) >> 8; // Move the second byte to the second last byte
|
|
reversedHex |= (hexNumber & 0xFF000000) >> 24; // Move the first byte to the last byte
|
|
|
|
return reversedHex;
|
|
}
|
|
|
|
static const DLLPatchStrc gptTemplatePatches[] =
|
|
{
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F65FEF4), (DWORD)PATCH_JMP, FALSE, 0x01},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F65FEF5), (DWORD)reverseHexBytes(0x77D60200), FALSE, 0x00},
|
|
|
|
// Patching TEST EAX, EAX at address 0x6F68D570
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D570), (DWORD)(0xC085), FALSE, 0x00},
|
|
// Patching JNE SHORT 6F68D577 at address 0x6F68D572
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D572), (DWORD)(0x0375), FALSE, 0x00},
|
|
// Patching RETN 8 at address 0x6F68D574
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D574), (DWORD)(0x0008C2), FALSE, 0x00},
|
|
// Patching MOV EAX,DWORD PTR SS:[ESP+4] at address 0x6F68D577
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D577), (DWORD)(0x04E4448B), FALSE, 0x00},
|
|
// Patching MOV EAX,DWORD PTR DS:[EAX+2C] at address 0x6F68D57B
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D57B), (DWORD)(0x2C408B), FALSE, 0x00},
|
|
|
|
// Patching CMP DWORD PTR DS:[EAX+0C],leftBorder at address 0x6F68D57E
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D57E), (DWORD)(0x0C7883), FALSE, 0x0},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D581), (DWORD)leftBorder, FALSE, 0x01},
|
|
// Patching JB SHORT 6F68D59E at address 0x6F68D582
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D582), (DWORD)(0x1A72), FALSE, 0x0},
|
|
|
|
// Patching CMP DWORD PTR DS:[EAX+0C],rightBorder at address 0x6F68D584
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D584), (DWORD)(0x0C7883), FALSE, 0x0},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D587), (DWORD)rightBorder, FALSE, 0x01},
|
|
// Patching JA SHORT 6F68D59E at address 0x6F68D588
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D588), (DWORD)(0x1477), FALSE, 0x0},
|
|
|
|
// Patching CMP DWORD PTR DS:[EAX+10],topBorder at address 0x6F68D58A
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58A), (DWORD)(0x107883), FALSE, 0x0},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58D), (DWORD)topBorder, FALSE, 0x01},
|
|
// Patching JB SHORT 6F68D59E at address 0x6F68D58E
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58E), (DWORD)(0x0E72), FALSE, 0x0},
|
|
|
|
// Patching CMP DWORD PTR DS:[EAX+10],bottomBorder at address 0x6F68D590
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D590), (DWORD)(0x107883), FALSE, 0x0},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D593), (DWORD)bottomBorder, FALSE, 0x01},
|
|
// Patching JA SHORT 6F68D59E at address 0x6F68D594
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D594), (DWORD)(0x0877), FALSE, 0x0},
|
|
|
|
// Patching MOV EAX,1 at address 0x6F68D596
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D596), (DWORD)reverseHexBytes(0xB8010000), FALSE, 0x0},
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D59A), (DWORD)(0x00), FALSE, 0x1},
|
|
|
|
// Patching RETN 8 at address 0x6F68D59B
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D59B), (DWORD)(0x0008C2), FALSE, 0x0},
|
|
// Patching XOR EAX,EAX at address 0x6F68D59E
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D59E), (DWORD)(0xC031), FALSE, 0x0},
|
|
// Patching RETN 8 at address 0x6F68D5A0
|
|
{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D5A0), (DWORD)(0x0008C2), FALSE, 0x0},
|
|
|
|
|
|
|
|
//// Patching TEST EAX, EAX at address 0x6F68D570
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D570), (DWORD)(0x85C0), FALSE, 0x00},
|
|
//// Patching JNE SHORT 6F68D577 at address 0x6F68D572
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D572), (DWORD)(0x7503), FALSE, 0x00},
|
|
//// Patching RETN 8 at address 0x6F68D574
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D574), (DWORD)(0xC20800), FALSE, 0x00},
|
|
//// Patching MOV EAX,DWORD PTR SS:[ESP+4] at address 0x6F68D577
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D577), (DWORD)reverseHexBytes(0x8B44E404), FALSE, 0x00},
|
|
//// Patching MOV EAX,DWORD PTR DS:[EAX+2C] at address 0x6F68D57B
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D57B), (DWORD)(0x8B402C), FALSE, 0x00},
|
|
|
|
//// Patching CMP DWORD PTR DS:[EAX+0C],leftBorder at address 0x6F68D57E
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D57E), (DWORD)(0x83780C), FALSE, 0x0},
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D581), (DWORD)leftBorder, FALSE, 0x01},
|
|
//// Patching JB SHORT 6F68D59E at address 0x6F68D582
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D582), (DWORD)(0x721A), FALSE, 0x0},
|
|
|
|
//// Patching CMP DWORD PTR DS:[EAX+0C],rightBorder at address 0x6F68D584
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D584), (DWORD)(0x83780C), FALSE, 0x0},
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D587), (DWORD)rightBorder, FALSE, 0x01},
|
|
//// Patching JA SHORT 6F68D59E at address 0x6F68D588
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D588), (DWORD)(0x7714), FALSE, 0x0},
|
|
|
|
//// Patching CMP DWORD PTR DS:[EAX+10],topBorder at address 0x6F68D58A
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58A), (DWORD)(0x837810), FALSE, 0x0},
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58D), (DWORD)topBorder, FALSE, 0x01},
|
|
//// Patching JB SHORT 6F68D59E at address 0x6F68D58E
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D58E), (DWORD)(0x720E), FALSE, 0x0},
|
|
|
|
//// Patching CMP DWORD PTR DS:[EAX+10],bottomBorder at address 0x6F68D590
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D590), (DWORD)(0x837810), FALSE, 0x0},
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D593), (DWORD)bottomBorder, FALSE, 0x01},
|
|
//// Patching JA SHORT 6F68D59E at address 0x6F68D594
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D594), (DWORD)(0x7708), FALSE, 0x0},
|
|
|
|
//// Patching MOV EAX,1 at address 0x6F68D596
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D596), (DWORD)reverseHexBytes(0xB8010000), FALSE, 0x0},
|
|
//// Patching RETN 8 at address 0x6F68D59B
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D59B), (DWORD)(0xC20800), FALSE, 0x0},
|
|
//// Patching XOR EAX,EAX at address 0x6F68D59E
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D59E), (DWORD)(0x31C0), FALSE, 0x0},
|
|
//// Patching RETN 8 at address 0x6F68D5A0
|
|
//{D2DLL_D2COMMON, calculateRelativeOffsetD2Common(0x6F68D5A0), (DWORD)(0xC20800), FALSE, 0x0},
|
|
|
|
|
|
//{D2DLL_D2CLIENT, calculateRelativeOffsetD2Client(0x6FAE118F), (DWORD)PATCH_JMP, FALSE, 0x00},
|
|
//{D2DLL_D2CLIENT, calculateRelativeOffsetD2Client(0x6FAE1190), (DWORD)0x6CB30800, FALSE, 0x00},
|
|
//{D2DLL_D2CLIENT, calculateRelativeOffsetD2Client(0x6FAE1194), (DWORD)0x90, FALSE, 0x03},
|
|
//{D2DLL_D2CLIENT, calculateRelativeOffsetD2Client(0x6FB6C500), (DWORD)customD2ClientASM, TRUE, 0x00},
|
|
|
|
{D2DLL_INVALID} // this must be the last entry in the array!
|
|
};
|
|
|
|
#endif // _D2PATCH_H
|