import ctypes
from ctypes import wintypes

PROCESS_VM_READ = 0x0010
PROCESS_QUERY_INFORMATION = 0x0400

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
OpenProcess = kernel32.OpenProcess
OpenProcess.restype = wintypes.HANDLE
OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD]

ReadProcessMemory = kernel32.ReadProcessMemory
ReadProcessMemory.restype = wintypes.BOOL
ReadProcessMemory.argtypes = [wintypes.HANDLE, wintypes.LPCVOID, wintypes.LPVOID, ctypes.c_size_t, ctypes.POINTER(ctypes.c_size_t)]

CloseHandle = kernel32.CloseHandle
CloseHandle.restype = wintypes.BOOL
CloseHandle.argtypes = [wintypes.HANDLE]

pid = 39484
cam_addr = 0x00000506F8B230F0

h_proc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, False, pid)
if not h_proc:
    print(f"Cannot open process {pid}: {ctypes.get_last_error()}")
    exit(1)

try:
    import struct
    buf = ctypes.create_string_buffer(0x400)
    bytes_read = ctypes.c_size_t(0)
    if ReadProcessMemory(h_proc, ctypes.c_void_p(cam_addr), buf, 0x400, ctypes.byref(bytes_read)):
        data = bytes(buf)
        vtable = struct.unpack('<Q', data[0:8])[0]
        smooth_zoom = struct.unpack('<f', data[0x34C:0x34C+4])[0]
        target_zoom = struct.unpack('<f', data[0x354:0x354+4])[0]
        print(f"Camera @ 0x{cam_addr:016X}:")
        print(f"  VTABLE: 0x{vtable:016X}")
        print(f"  smoothedZoom (+0x34C): {smooth_zoom:.4f}")
        print(f"  targetZoom   (+0x354): {target_zoom:.4f}")
    else:
        print("ReadProcessMemory failed:", ctypes.get_last_error())
finally:
    CloseHandle(h_proc)
