These are the functions I'm using currently:
Code: Select all
;READ MEMORY
ReadMemory(MADDRESS=0,PROGRAM="",BYTES=4)
{
Static OLDPROC, ProcessHandle
VarSetCapacity(MVALUE, BYTES,0)
IF PROGRAM != %OLDPROC%
{
WinGet, pid, pid, % OLDPROC := PROGRAM
ProcessHandle := ( ProcessHandle ? 0*(closed:=DllCall("CloseHandle"
,"UInt",ProcessHandle)) : 0 )+(pid ? DllCall("OpenProcess"
,"Int",16,"Int",0,"UInt",pid) : 0)
}
IF (ProcessHandle) && DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Str",MVALUE,"UInt",BYTES,"UInt *",0)
{ Loop % BYTES
Result += *(&MVALUE + A_Index-1) << 8*(A_Index-1)
Return Result
}
return !ProcessHandle ? "Handle Closed:" closed : "Failed"
}
Code: Select all
;READ ML POINTERS
ReadPointer(GameTitle, BaseAddress, offsets*)
{
IF Offsets.MaxIndex() = 1
ReadPointer := Offsets[1] + ReadMemory(BaseAddress, GameTitle)
ELSE
For Index, Offset IN Offsets
{
IF Index = 1
ReadPointer := ReadMemory(Offset + ReadMemory(BaseAddress, GameTitle), GameTitle)
ELSE IF (Offsets.MaxIndex() = A_Index)
ReadPointer += offset
ELSE ReadPointer := ReadMemory(ReadPointer + Offset, GameTitle)
}
RETURN ReadMemory(ReadPointer, GameTitle)
}
Code: Select all
;Read Weight Pointer
CurrentWeight_Pointer := ReadPointer(GameTitle, BaseAddress, 0x360,0x14,0x18,0x1C)