import sys, struct, ctypes
from ctypes import wintypes
import psutil

kernel32 = ctypes.windll.kernel32
advapi32 = ctypes.windll.advapi32

def enable_debug():
    hToken = wintypes.HANDLE()
    if advapi32.OpenProcessToken(kernel32.GetCurrentProcess(), 0x0020 | 0x0008, ctypes.byref(hToken)):
        luid = wintypes.LARGE_INTEGER()
        if advapi32.LookupPrivilegeValueW(None, "SeDebugPrivilege", ctypes.byref(luid)):
            class TP(ctypes.Structure):
                _fields_ = [('Count', wintypes.DWORD), ('Luid', wintypes.LARGE_INTEGER), ('Attr', wintypes.DWORD)]
            tp = TP(1, luid, 2)
            advapi32.AdjustTokenPrivileges(hToken, False, ctypes.byref(tp), ctypes.sizeof(tp), None, None)
        kernel32.CloseHandle(hToken)
enable_debug()

log_path = r"c:\Projects\JX\logs\all_pids_exact_check.txt"
lines = []

vggame_pids = []
for p in psutil.process_iter(['pid', 'name']):
    name = (p.info['name'] or '').lower()
    if 'vggame' in name:
        vggame_pids.append(p.info['pid'])

lines.append(f"Found vggame PIDs: {vggame_pids}")

for pid in vggame_pids:
    hProc = kernel32.OpenProcess(0x0010 | 0x0400 | 0x0008, False, pid)
    if not hProc:
        lines.append(f"PID {pid}: OpenProcess failed")
        continue

    # 1. Read static name
    buf_name = (ctypes.c_char * 32)()
    bytesRead = ctypes.c_size_t()
    kernel32.ReadProcessMemory(hProc, ctypes.c_void_p(0x006DEC44), buf_name, 32, ctypes.byref(bytesRead))
    char_name = bytes(buf_name).split(b'\0')[0].decode('latin1', errors='ignore')

    # 2. Read static level (short at 0x006DEC66)
    buf_lvl = (ctypes.c_short * 1)()
    kernel32.ReadProcessMemory(hProc, ctypes.c_void_p(0x006DEC66), buf_lvl, 2, ctypes.byref(bytesRead))
    lvl = buf_lvl[0]

    # 3. Read map ID
    buf_map = (ctypes.c_int * 1)()
    kernel32.ReadProcessMemory(hProc, ctypes.c_void_p(0x006966CC), buf_map, 4, ctypes.byref(bytesRead))
    mid = buf_map[0]

    lines.append(f"PID {pid} -> Name: '{char_name}' | Level at 0x006DEC66: {lvl} | MapId: {mid}")
    kernel32.CloseHandle(hProc)

with open(log_path, "w", encoding="utf-8") as f:
    f.write("\n".join(lines))
