import ctypes
from ctypes import wintypes
import struct

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)

buf = ctypes.create_string_buffer(0x550)
bytes_read = ctypes.c_size_t(0)
if ReadProcessMemory(h_proc, ctypes.c_void_p(cam_addr), buf, 0x550, ctypes.byref(bytes_read)):
    data = bytes(buf)
    print(f"=== Camera Floats @ 0x{cam_addr:X} ===")
    for off in range(0, 0x540, 4):
        val = struct.unpack('<f', data[off:off+4])[0]
        # print non-zero interesting floats
        if 0.001 < abs(val) < 100000.0:
            ival = struct.unpack('<I', data[off:off+4])[0]
            print(f"  +0x{off:03X}: {val:12.4f} (hex: 0x{ival:08X})")
else:
    print("Failed to read camera")

CloseHandle(h_proc)
