【问题标题】:How to call a WINAPI function with ctypes and store the return value如何使用 ctypes 调用 WINAPI 函数并存储返回值
【发布时间】:2016-01-29 20:42:22
【问题描述】:

我阅读了 ctypes 文档和一些教程,但我仍然不明白一些东西。

  1. ctypes.wintypes 是否定义了 HANDLE 等 Windows 类型?
  2. 我将如何调用例如NtQueryInformationProcess,它返回一个NTSTATUS 值,并存储返回值?
  3. 如何取消引用指针以使用 ctypes 遍历 PEB 结构?

示例代码将不胜感激。

【问题讨论】:

标签: python-2.7 winapi ctypes


【解决方案1】:
  1. HANDLE 实际上是一个指针,所以使用ctypes.c_void_p 就足够了。
  2. 您可以像 Python 中的任何其他函数一样通过 ctypes.windll.ntdll.NtQueryInformationProcess 调用它,但将 C 对象(例如 ctypes.c_int)作为参数传递。 NTSTATUS 不是一个结构,而是一个很长的结构。但是,如果需要,您可以创建 C-like structures using ctypes
  3. 请参阅documentation 中的指针

您可能想查看pywin32,这是一个更高级别且更 pythonic 的 Windows API 接口,尽管它并未完全涵盖。

希望对你有帮助!

【讨论】:

  • (1) 对于有 Windows 编程经验的人来说,使用 Windows 类型别名(例如 wintypes.HANDLE)更清楚。 (2) 请使用ctypes.WinDLL('ntdll') 而不是ctypes.windll.ntdllwindll 加载器有麻烦的函数指针缓存。 (3) Jake 对原生 NT 编程感兴趣,可以调用NtQueryInformationProcess 来获取PEB,所以 PyWin32 不会有任何帮助。
  • 嘿,谢谢@eryksun。你能帮我换一个吗?当我使用 PROCESS_BASIC_INFORMATION 发出 NtQueryInformationProcess 时。如何将返回的缓冲区“PebBaseAddress”转换为 PEB 结构,以便我可以访问其成员?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多