2009-10-12 10 views
10

chcę replikować następujący kod C w ctypes Pythona:Jak wyłuskać lokalizację pamięci ze znaków Pythona?

main() { 
    long *ptr = (long *)0x7fff96000000; 
    printf("%lx",*ptr); 
} 

mogę dowiedzieć się, jak nazywają to miejsce w pamięci jako wskaźnik funkcji, ale nie tylko zrobić normalne dereference:

from ctypes import * 
""" 
>>> fptr = CFUNCTYPE(None, None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 104, in CFUNCTYPE 
    class CFunctionType(_CFuncPtr): 
TypeError: Error when calling the metaclass bases 
    item 1 in _argtypes_ has no from_param method 
""" 
fptr = CFUNCTYPE(None, c_void_p) #add c_void_p since you have to have an arg 
fptr2 = fptr(0x7fff96000000) 
fptr2(c_void_p(0)) 
#python: segfault at 7fff96000000 ip 00007fff96000000 

Ponieważ jest to segfault ze wskaźnikiem instrukcji wskazującym na tę lokalizację pamięci, którą z powodzeniem wywołuje. Jednak nie mogę go po prostu czytać lokalizację pamięci:

ptr = POINTER(c_long) 
ptr2 = ptr(c_long(0x7fff96000000)) 
#>>> ptr2[0] 
#140735709970432 
#>>> hex(ptr2[0]) 
#'0x7fff96000000' 
#>>> ptr2.contents 
#c_long(140735709970432) 

Odpowiedz

17

ctypes.cast.

>>> import ctypes 
>>> c_long_p = ctypes.POINTER(ctypes.c_long) 
>>> some_long = ctypes.c_long(42) 
>>> ctypes.addressof(some_long) 
4300833936 
>>> ctypes.cast(4300833936, c_long_p) 
<__main__.LP_c_long object at 0x1005983b0> 
>>> ctypes.cast(4300833936, c_long_p).contents 
c_long(42) 
+0

Dziękuję za odpowiedzi. –

Powiązane problemy