ctypes调用GetProcAddress()失败,错误代码为127,但win32api.GetProcAddress已成功

时间:2015-05-12 14:49:06

标签: python ctypes

当我通过win32api致电GetProcAddress()时,我成功获得了句柄,但ctypes没有。

代码是:

from ctypes import windll
import win32api
KERNEL32 = windll.kernel32
h_kernel32 = KERNEL32.GetModuleHandleW('kernel32.dll')
print(hex(h_kernel32))

h_loadlib1=win32api.GetProcAddress(h_kernel32,'LoadLibraryW')
print(hex(h_loadlib1))
if not h_loadlib1:
    print("NtCreateThreadEx Failed:",win32api.GetLastError())

h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32,'LoadLibraryW')
print(hex(h_loadlib2))
if not h_loadlib2:
    print("NtCreateThreadEx Failed:",win32api.GetLastError())

输出:

0x77250000  
0x77266f80  
0x0  
NtCreateThreadEx Failed: 127  

系统信息:
windows7 64,python 3.43

1 个答案:

答案 0 :(得分:3)

您需要使用char字符串而不是python 3.x提供的默认Unicode字符串,如GetProcAddress文档所示(第二个参数是LPCSTR不是< / strong> LPCTSTRLPCWSTR):

h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32,'LoadLibraryW'.encode(encoding='ascii'))

或者,您可以传递一个字节:

h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32, b'LoadLibraryW')

注意:上面的代码不能在python 64位解释器上工作(64位模块句柄中最重要的32位被置零)。在这种情况下,您需要将argtypesrestype用作explained in the tutorial(例如,通过定义64位HMODULE类型)。