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)
ご回答いただきありがとうございます。 –