Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
aap committed Jun 17, 2018
1 parent 236ad39 commit e1ab854
Show file tree
Hide file tree
Showing 5 changed files with 1,501 additions and 0 deletions.
1 change: 1 addition & 0 deletions premake5.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
premake5 vs2015
147 changes: 147 additions & 0 deletions src/MemoryMgr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
#ifndef __MEMORYMGR
#define __MEMORYMGR
typedef uintptr_t addr;
#define WRAPPER __declspec(naked)
#define DEPRECATED __declspec(deprecated)
#define EAXJMP(a) { _asm mov eax, a _asm jmp eax }
#define VARJMP(a) { _asm jmp a }
#define WRAPARG(a) UNREFERENCED_PARAMETER(a)

#define NOVMT __declspec(novtable)
#define SETVMT(a) *((DWORD_PTR*)this) = (DWORD_PTR)a

enum
{
PATCH_CALL,
PATCH_JUMP,
PATCH_NOTHING,
};

enum
{
III_10 = 1,
III_11,
III_STEAM,
VC_10,
VC_11,
VC_STEAM
};

extern int gtaversion;

template<typename T>
inline T AddressByVersion(addr addressIII10, addr addressIII11, addr addressIIISteam, addr addressvc10, addr addressvc11, addr addressvcSteam)
{
if(gtaversion == -1){
if(*(addr*)0x5C1E75 == 0xB85548EC) gtaversion = III_10;
else if(*(addr*)0x5C2135 == 0xB85548EC) gtaversion = III_11;
else if(*(addr*)0x5C6FD5 == 0xB85548EC) gtaversion = III_STEAM;
else if(*(addr*)0x667BF5 == 0xB85548EC) gtaversion = VC_10;
else if(*(addr*)0x667C45 == 0xB85548EC) gtaversion = VC_11;
else if(*(addr*)0x666BA5 == 0xB85548EC) gtaversion = VC_STEAM;
else gtaversion = 0;
}
switch(gtaversion){
case III_10:
return (T)addressIII10;
case III_11:
return (T)addressIII11;
case III_STEAM:
return (T)addressIIISteam;
case VC_10:
return (T)addressvc10;
case VC_11:
return (T)addressvc11;
case VC_STEAM:
return (T)addressvcSteam;
default:
return (T)0;
}
}

inline bool
is10(void)
{
return gtaversion == III_10 || gtaversion == VC_10;
}

inline bool
isIII(void)
{
return gtaversion >= III_10 && gtaversion <= III_STEAM;
}

inline bool
isVC(void)
{
return gtaversion >= VC_10 && gtaversion <= VC_STEAM;
}

template<typename T, typename AT> inline void
Patch(AT address, T value)
{
DWORD dwProtect[2];
VirtualProtect((void*)address, sizeof(T), PAGE_EXECUTE_READWRITE, &dwProtect[0]);
*(T*)address = value;
VirtualProtect((void*)address, sizeof(T), dwProtect[0], &dwProtect[1]);
}

template<typename AT> inline void
Nop(AT address, unsigned int nCount)
{
DWORD dwProtect[2];
VirtualProtect((void*)address, nCount, PAGE_EXECUTE_READWRITE, &dwProtect[0]);
memset((void*)address, 0x90, nCount);
VirtualProtect((void*)address, nCount, dwProtect[0], &dwProtect[1]);
}

template<typename AT, typename HT> inline void
InjectHook(AT address, HT hook, unsigned int nType=PATCH_NOTHING)
{
DWORD dwProtect[2];
switch ( nType )
{
case PATCH_JUMP:
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &dwProtect[0]);
*(BYTE*)address = 0xE9;
break;
case PATCH_CALL:
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &dwProtect[0]);
*(BYTE*)address = 0xE8;
break;
default:
VirtualProtect((void*)((DWORD)address + 1), 4, PAGE_EXECUTE_READWRITE, &dwProtect[0]);
break;
}
DWORD dwHook;
_asm
{
mov eax, hook
mov dwHook, eax
}

*(ptrdiff_t*)((DWORD)address + 1) = (DWORD)dwHook - (DWORD)address - 5;
if ( nType == PATCH_NOTHING )
VirtualProtect((void*)((DWORD)address + 1), 4, dwProtect[0], &dwProtect[1]);
else
VirtualProtect((void*)address, 5, dwProtect[0], &dwProtect[1]);
}

inline void ExtractCall(void *dst, addr a)
{
*(addr*)dst = (addr)(*(addr*)(a+1) + a + 5);
}
template<typename T>
inline void InterceptCall(void *dst, T func, addr a)
{
ExtractCall(dst, a);
InjectHook(a, func);
}
template<typename T>
inline void InterceptVmethod(void *dst, T func, addr a)
{
*(addr*)dst = *(addr*)a;
Patch(a, func);
}

#endif
55 changes: 55 additions & 0 deletions src/gta.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include "tcycedit.h"

RsGlobalType &RsGlobal = *(RsGlobalType*)ADDR(0x8F4360, 0x9B48D8);

uint8 &CTimer::m_UserPause = *(uint8*)ADDR(0x95CD7C, 0xA10B36);
uint8 &CTimer::m_CodePause = *(uint8*)ADDR(0x95CDB1, 0xA10B76);
//WRAPPER void CTimer::Stop(void) { EAXJMP(0x4AD480); }
//WRAPPER void CTimer::Update(void) { EAXJMP(0x4ACF70); }

int8 &CClock::ms_nGameClockHours = *(int8*)ADDR(0x95CDA6, 0xA10B6B);
int8 &CClock::ms_nGameClockMinutes = *(int8*)ADDR(0x95CDC8, 0xA10B92);
int16 &CClock::ms_nGameClockSeconds = *(int16*)ADDR(0x95CC7C, 0xA10A3C);

float &CWeather::InterpolationValue = *(float*)ADDR(0x8F2520, 0x9787D8);
int16 &CWeather::OldWeatherType = *(int16*)ADDR(0x95CCEC, 0xA10AAA);
int16 &CWeather::NewWeatherType = *(int16*)ADDR(0x95CC70, 0xA10A2E);

WRAPPER void CFileMgr::SetDir(const char *path) { EAXJMP(ADDR(0x479020, 0x48E030)); }

WRAPPER void CCoronas::DoSunAndMoon(void){ EAXJMP(ADDR(0x4FA380, 0x542210)); }
WRAPPER void CCoronas::Update(void){ EAXJMP(ADDR(0x4F8EC0, 0x544130)); }

WRAPPER CPad *CPad::GetPad(int id) { EAXJMP(ADDR(0x492F60, 0x4AB060)); }

WRAPPER bool CControllerConfigManager::GetIsKeyboardKeyDown(RsKeyCodes key) { EAXJMP(ADDR(0x58D2A0, 0x617E10)); }
WRAPPER bool CControllerConfigManager::GetIsKeyboardKeyJustDown(RsKeyCodes key) { EAXJMP(ADDR(0x58D8A0, 0x617430)); }

WRAPPER void CSprite2d::Draw(CRect const &, CRGBA const &) { EAXJMP(ADDR(0x51ED50, 0x578710)); }
WRAPPER void CSprite2d::DrawRect(CRect const &,CRGBA const &) { EAXJMP(ADDR(0x51F970, 0x577B00)); }

//WRAPPER void CFont::Initialise(void) { EAXJMP(ADDR(0x500A40, 0x552310)); }
//WRAPPER void CFont::Shutdown(void) { EAXJMP(ADDR(0x500BA0, 0x5522E0)); }
//WRAPPER void CFont::InitPerFrame(void) { EAXJMP(ADDR(0x500BE0, 0x0)); }
//WRAPPER void CFont::PrintChar(float,float,short) { EAXJMP(ADDR(0x500C30, 0x0)); }
WRAPPER void CFont::PrintString(float,float,uint16 *) { EAXJMP(ADDR(0x500F50, 0x551040)); }
//WRAPPER void CFont::PrintString(float,float,uint16 *,uint16 *,float) { EAXJMP(ADDR(0x501730, 0x0)); }
//WRAPPER void CFont::ParseToken(uint16 *,uint16 *) { EAXJMP(ADDR(0x5019A0, 0x0)); }
//WRAPPER void CFont::DrawFonts(void) { EAXJMP(ADDR(0x501B50, 0x0)); }
WRAPPER void CFont::SetScale(float,float) { EAXJMP(ADDR(0x501B80, 0x550230)); }
WRAPPER void CFont::SetColor(CRGBA*) { EAXJMP(ADDR(0x501BD0, 0x550170)); }
WRAPPER void CFont::SetJustifyOff(void) { EAXJMP(ADDR(0x501C80, 0x550140)); }
WRAPPER void CFont::SetCentreOn(void) { EAXJMP(ADDR(0x501C90, 0x550120)); }
WRAPPER void CFont::SetCentreOff(void) { EAXJMP(ADDR(0x501CB0, 0x550110)); }
//WRAPPER void CFont::SetCentreSize(float) { EAXJMP(ADDR(0x501CD0, 0x0)); }
WRAPPER void CFont::SetBackgroundOff(void) { EAXJMP(ADDR(0x501CF0, 0x5500D0)); }
WRAPPER void CFont::SetBackGroundOnlyTextOff(void) { EAXJMP(ADDR(0x501D40, 0x550080)); }
WRAPPER void CFont::SetRightJustifyOn(void) { EAXJMP(ADDR(0x501D50, 0x550060)); }
WRAPPER void CFont::SetPropOff(void) { EAXJMP(ADDR(0x501D90, 0x550030)); }
WRAPPER void CFont::SetPropOn(void) { EAXJMP(ADDR(0x501DA0, 0x550020)); }
WRAPPER void CFont::SetFontStyle(short) { EAXJMP(ADDR(0x501DB0, 0x54FFE0)); }
WRAPPER void CFont::SetRightJustifyWrap(float) { EAXJMP(ADDR(0x501DC0, 0x54FFD0)); }
//WRAPPER void CFont::SetDropShadowPosition(short) { EAXJMP(ADDR(0x501E70, 0x0)); }
//WRAPPER double CFont::GetStringWidth(uint16 *str, bool spc) { EAXJMP(ADDR(0x5018A0, 0x0)); }

WRAPPER void AsciiToUnicode(char const *,uint16 *) { EAXJMP(ADDR(0x5009C0, 0x552500)); }
Loading

0 comments on commit e1ab854

Please sign in to comment.