Code:
#include <Windows.h>
#include <iostream>
#include <string>
#include <Psapi.h>
enum ObjectManager
{
CurMgrPointer = 0x00C79CE0, // 3.3.5a 12340
CurMgrOffset = 0x00002ED0, // 3.3.5a 12340
NextObject = 0x3C, // 3.3.5a 12340
FirstObject = 0xAC, // 3.3.5a 12340
LocalGUID = 0xC0, // 3.3.5a 12340
};
enum WoWObjectFields
{
OBJECT_FIELD_GUID = 0x0,
OBJECT_FIELD_TYPE = 0x2,
OBJECT_FIELD_ENTRY = 0x3,
OBJECT_FIELD_SCALE_X = 0x4,
OBJECT_FIELD_PADDING = 0x5,
//TOTAL_OBJECT_FIELDS = 0x5
};
UINT READUInt(HANDLE WowHandle, UINT address) {
SIZE_T read;
UINT val;
ReadProcessMemory(WowHandle, (LPVOID)(address), (LPVOID)(&val), sizeof(UINT), &read);
if (read == 0) {
std::cout << "Failed to read data" << std::endl;
}
return val;
}
UINT64 READUInt64(HANDLE WowHandle, UINT address) {
SIZE_T read;
UINT64 val;
ReadProcessMemory(WowHandle, (LPVOID)(address), (LPVOID)(&val), sizeof(UINT64), &read);
if (read == 0) {
std::cout << "Failed to read data" << std::endl;
}
return val;
}
std::string READString(HANDLE WowHandle, UINT address, size_t length) {
std::string res(length, 0);
SIZE_T read;
ReadProcessMemory(WowHandle, (LPVOID)(address), (LPVOID)(&res[0]), sizeof(char) * length, &read);
if (read == 0) {
std::cout << "Failed to read data" << std::endl;
}
return res;
}
DWORD GetMemLocByGUID(HANDLE WowHandle, UINT64 guid, DWORD curMgr) {
DWORD nextObject = READUInt(WowHandle, curMgr + FirstObject );
DWORD ObjType = READUInt(WowHandle, nextObject + OBJECT_FIELD_TYPE);
while ((ObjType <= 7) && (ObjType > 0)) {
if (READUInt64(WowHandle, nextObject + OBJECT_FIELD_GUID) == guid) {
return nextObject;
}
nextObject = READUInt(WowHandle, nextObject + NextObject);
ObjType = READUInt(WowHandle, nextObject + OBJECT_FIELD_TYPE);
}
return 0;
}
DWORD GetModuleBase(HANDLE hProc, std::string sModuleName)
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD dwBase = -1;
//------
EnumProcessModules(hProc, NULL, 0, &cModules);
hModules = new HMODULE[cModules / sizeof(HMODULE)];
if (EnumProcessModules(hProc, hModules, cModules / sizeof(HMODULE), &cModules)) {
for (int i = 0; i < cModules / sizeof(HMODULE); i++) {
if (GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if (sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD)hModules[i];
break;
}
}
}
}
delete[] hModules;
return dwBase;
}
int main(int argc, char* argv[]) {
HWND Wow = FindWindow(NULL, "World of Warcraft");
if (!Wow) {
std::cout << "Failed to find window process" << std::endl;
return 0;
}
DWORD pId;
GetWindowThreadProcessId(Wow, &pId);
HANDLE wowHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
DWORD baseAddress = GetModuleBase(wowHandle, "Wow.exe");
SIZE_T read;
DWORD currentManager_pre = READUInt(wowHandle, baseAddress + CurMgrPointer);
DWORD currentManager = READUInt(wowHandle, currentManager_pre + CurMgrOffset);
UINT64 pGuid = READUInt64(wowHandle, currentManager + LocalGUID);
DWORD player = GetMemLocByGUID(wowHandle, pGuid, currentManager);
return 0;
}
It currently isn't working at all