Никогда не приходилось читать память вручную, но если я правильно понимаю то:
pid := getPID()
hGame := openProcess(pid)
client := getModuleBaseAddress("client.dll", hGame)
engine := getModuleBaseAddress("engine.dll", hGame)
openProcess(dwPID, dwRights = 0x1F0FFF) {
hProcess := DllCall("OpenProcess", "UInt", dwRights
, "int", 0
, "UInt", dwPID
, "Uint")
if(hProcess == 0) {
ErrorLevel := ERROR_OPEN_PROCESS
return 0
}
ErrorLevel := ERROR_OK
return hProcess
}
getPID() {
local dwPID := 0
WinGet, dwPID, PID, ahk_class Grand theft auto San Andreas ; тут класс окна вашей игры определяется через win spy
return dwPID
}
getModuleBaseAddress(sModule, hProcess) {
if(!sModule) {
ErrorLevel := ERROR_MODULE_NOT_FOUND
return 0
}
if(!hProcess) {
ErrorLevel := ERROR_INVALID_HANDLE
return 0
}
dwSize = 1024*4 ; 1024 * sizeof(HMODULE = 4)
VarSetCapacity(hMods, dwSize)
VarSetCapacity(cbNeeded, 4) ; DWORD = 4
dwRet := DllCall( "Psapi.dll\EnumProcessModules"
, "UInt", hProcess
, "UInt", &hMods
, "UInt", dwSize
, "UInt*", cbNeeded
, "UInt")
if(dwRet == 0) {
ErrorLevel := ERROR_ENUM_PROCESS_MODULES
return 0
}
dwMods := cbNeeded / 4 ; cbNeeded / sizeof(HMDOULE = 4)
i := 0
VarSetCapacity(hModule, 4) ; HMODULE = 4
VarSetCapacity(sCurModule, 260) ; MAX_PATH = 260
while(i < dwMods) {
hModule := NumGet(hMods, i*4)
DllCall("Psapi.dll\GetModuleFileNameEx"
, "UInt", hProcess
, "UInt", hModule
, "Str", sCurModule
, "UInt", 260)
SplitPath, sCurModule, sFilename
if(sModule == sFilename) {
ErrorLevel := ERROR_OK
return hModule
}
i := i + 1
}
ErrorLevel := ERROR_MODULE_NOT_FOUND
return 0
}
Посмотрите через читенджин в каком формате хранятся данные по этим адресам и используйте соответствующую функцию из того же UDF. Правда все вышенаписанное может оказаться в корне неверным, повторюсь: я никогда не читал память и мои знания лишь поверхностны.
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.