我阅读了ctypes文档和一些教程,但我仍然不明白一些事情。如何使用ctypes调用WINAPI函数并存储返回值
- 是否
ctypes.wintypes
定义Windows类型,如HANDLE
? - 我该如何调用,例如
NtQueryInformationProcess
,它返回一个NTSTATUS
值,并存储返回值? - 如何取消引用指针以使用ctypes走012bd结构?
示例代码将不胜感激。
我阅读了ctypes文档和一些教程,但我仍然不明白一些事情。如何使用ctypes调用WINAPI函数并存储返回值
ctypes.wintypes
定义Windows类型,如HANDLE
?NtQueryInformationProcess
,它返回一个NTSTATUS
值,并存储返回值?示例代码将不胜感激。
HANDLE
实际上是一个指针,所以使用ctypes.c_void_p
就足够了。ctypes.windll.ntdll.NtQueryInformationProcess
来调用它,但会传递C对象(如ctypes.c_int
)作为参数。 NTSTATUS
不是一个结构,而是一个长。但是,如果需要,您可以创建C-like structures using ctypes
。你可能想看看pywin32,更高层次,更Python的界面的Windows API,尽管它不能完全覆盖。
希望它有帮助!
(1)对于有Windows编程经验的人员,使用Windows类型别名(例如'wintypes.HANDLE')会更加清楚。 (2)请使用'ctypes.WinDLL('ntdll')'而不是'ctypes.windll.ntdll'。 'windll'加载器有麻烦的函数指针缓存。 (3)Jake对原生NT编程感兴趣,调用['NtQueryInformationProcess'](https://msdn.microsoft.com/en-us/library/ms684280)来获取['PEB'](https:// msdn .microsoft.com/en-us/library/aa813706),所以PyWin32不会有任何帮助。 – eryksun
嗨@cdonts,谢谢,你的回答很有帮助 – JakeAdams
嘿,谢谢@eryksun。你可以让我和另一个朋友一起?当我发布NtQueryInformationProcess与PROCESS_BASIC_INFORMATION。我如何将返回的缓冲区“PebBaseAddress”转换为PEB结构,以便我可以访问其成员? – JakeAdams
如果发现[[NtQueryInformationProcess]](https:// github)包含此[ntdll.py](https://github.com/MarioVilas/winappdbg/blob/master/winappdbg/win32/ntdll.py)。 com/MarioVilas/winappdbg/blob/master/winappdbg/win32/ntdll.py#L418)等等。 –