2009-10-12 10 views
10

私はPythonのctypesの中に次のCコード複製したい:私は、関数ポインタとして、このメモリ場所を呼び出すが、普通のデリファレンスをしない方法を見つけ出すことができますpython ctypesからメモリ位置を参照解除するには?

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

を:

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 

そこには命令ポインタがこのメモリ位置を指し示すセグメンテーションがあるので、それをうまく呼び出すことができます。

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

答えて

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

ご回答いただきありがとうございます。 –