python - ctypes: construir puntero a partir de entero arbitrario
pywin32 (1)
Puedes usar ctypes.cast(addr, type)
. Extenderé su ejemplo para adquirir una dirección a través de un objeto conocido, para demostrar:
INTP = ctypes.POINTER(ctypes.c_int)
num = ctypes.c_int(42)
addr = ctypes.addressof(num)
print ''address:'', addr, type(addr)
ptr = ctypes.cast(addr, INTP)
print ''pointer:'', ptr
print ''value:'', ptr[0]
Salida:
address: 4301122528 <type ''int''>
pointer: <__main__.LP_c_int object at 0x1005decb0>
value: 42
Para propósitos de bajo nivel, necesito construir un puntero de ctypes desde una dirección arbitraria, dado como un entero. Por ejemplo:
INTP = ctypes.POINTER(ctypes.c_int)
p = INTP(0x12345678) # i *know* this is the address
Pero todos esos intentos resultan en
TypeError: expected c_long instead of int
¿Hay algo que pueda hacer para superar esto? En caso de que alguien se pregunte por qué necesito esto, se hace para extraer la estructura OVERLAPPED
de un win32file.PyOVERLAPPED
, para integrar las funciones expuestas de ctypes con las API envueltas en el archivo win32file.
Gracias,
-Tomador