import ctypes
from ctypes import wintypes
import struct
import time

PROCESS_ALL_ACCESS = 0x1F0FFF

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

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

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_ALL_ACCESS, False, pid)
if not h_proc:
    print(f"Cannot open process {pid}: {ctypes.get_last_error()}")
    exit(1)

try:
    test_zoom = 2.0
    val_bytes = struct.pack('<f', test_zoom)
    bytes_written = ctypes.c_size_t(0)
    
    ok1 = WriteProcessMemory(h_proc, ctypes.c_void_p(cam_addr + 0x354), val_bytes, 4, ctypes.byref(bytes_written))
    ok2 = WriteProcessMemory(h_proc, ctypes.c_void_p(cam_addr + 0x34C), val_bytes, 4, ctypes.byref(bytes_written))
    print(f"Written targetZoom={test_zoom}: ok1={ok1}, ok2={ok2}")
    
    # Read back
    buf = ctypes.create_string_buffer(8)
    bytes_read = ctypes.c_size_t(0)
    ReadProcessMemory(h_proc, ctypes.c_void_p(cam_addr + 0x34C), buf, 4, ctypes.byref(bytes_read))
    s_zoom = struct.unpack('<f', buf[:4])[0]
    ReadProcessMemory(h_proc, ctypes.c_void_p(cam_addr + 0x354), buf, 4, ctypes.byref(bytes_read))
    t_zoom = struct.unpack('<f', buf[:4])[0]
    print(f"Read back: smoothedZoom={s_zoom:.4f}, targetZoom={t_zoom:.4f}")
finally:
    CloseHandle(h_proc)
