使用python的trace32-使用函数T32_ReadMemoryObj

问题描述

代码前的问题:

T32_ReadMemory和T32_ReadMemoryObj有什么区别?在哪种情况下,我应该优先选择另一种? 据我从API PDF得知,“ Obj”版本更为高级,具有更多访问选项和对64位地址的访问权,但是普通版本没有缺陷,因此如果可以使用,我可以使用吗?对吧?

对于代码

localBuffer = (ctypes.c_uint8 * size)()

myBufferHandle = ?
myAddressHandle32 = ?

t32api.T32_RequestBufferObj(ctypes.byref(myBufferHandle),0)
t32api.T32_RequestAddressObjA32(ctypes.byref(myAddressHandle32),addr)

t32api.T32_ReadMemoryObj(myBufferHandle,myAddressHandle32,size)

t32api.T32_copyDataFromBufferObj(localBuffer,size,myBufferHandle)
t32api.T32_ReleaseBufferObj(ctypes.byref(myBufferHandle))

这是尝试将远程API PDF中的以下代码示例“翻译”为python:

c code example for using T32_ReadMemoryObj

我被卡在问号标记的地方,我不知道如何创建trace32内部类型。我寻找了一个python示例,但找不到任何示例。

解决方法

是的,您不需要使用T32_ReadMemoryObj(),可以使用T32_ReadMemory()。我仍然建议使用T32_ReadMemoryObj(),因为它使用起来稍微复杂一点,但提供了充分的灵活性。我认为主要的优点是更好的访问类管理(使用字符串而不是幻数)和64位地址。在简单的用例中,您可能不需要这些。

关于T32_ReadMemoryObj():您只需要创建void指针即可。 T32_Request...Obj()函数将创建对象并设置指向它们的指针。

localBuffer = (ctypes.c_uint8 * size)()

myBufferHandle = ctypes.c_void_p()
myAddressHandle32 = ctypes.c_void_p()

t32api.T32_RequestBufferObj(ctypes.byref(myBufferHandle),0)
t32api.T32_RequestAddressObjA32(ctypes.byref(myAddressHandle32),addr)

t32api.T32_ReadMemoryObj(myBufferHandle,myAddressHandle32,size)

t32api.T32_CopyDataFromBufferObj(localBuffer,size,myBufferHandle)
t32api.T32_ReleaseBufferObj(ctypes.byref(myBufferHandle))