gpt4 book ai didi

从地址调用函数不起作用

转载 作者:行者123 更新时间:2023-11-30 14:46:26 25 4
gpt4 key购买 nike

我不明白为什么如果我使用该地址调用 CreateFileA 函数,程序就会崩溃。

此片段应使用从 GetProcAddress 调用中检索到的地址来调用 CreateFileA。当然,在这个简单的示例中,我可以正常调用它,但我需要手动检索每个地址(甚至 LoadLibraryAGetProcAddress 但为了简洁起见,我没有在本例中)

我做错了什么?为什么如果我在最后一行使用 CreateFileA 而不是 (*CreateFileAAddr) 即使它们指向相同的东西它也能工作?

#include <windows.h>

typedef HMODULE(*_LoadLibraryA)(LPCSTR);
typedef FARPROC(*_GetProcAddress)(HMODULE, LPCSTR);
typedef HANDLE(*_CreateFileA)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);

int main() {
_LoadLibraryA LoadLibraryAAddr = (_LoadLibraryA)&LoadLibraryA;
_GetProcAddress GetProcAddressAddr = (_GetProcAddress)&GetProcAddress;

HMODULE kernel32Handle = (*LoadLibraryAAddr)("Kernel32.dll");
if (kernel32Handle == NULL) return -1;
_CreateFileA CreateFileAAddr = (_CreateFileA)((*GetProcAddressAddr)(kernel32Handle, "CreateFileA"));
if ((unsigned long)CreateFileAAddr != (unsigned long)&CreateFileA) return -1; //Just to check if the address is correct for Debug
(*CreateFileAAddr)("123.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, OPEN_ALWAYS, NULL);
return 0;
}

最佳答案

根据我的评论,Windows API 函数和指向该函数的指针类型需要使用 __stdcall (或 WINAPI)进行注释,这会将它们的调用约定更改为API 所期望的一个(有关 stdcall 调用约定的更多信息 here )。

typedef HMODULE(__stdcall *_LoadLibraryA)(LPCSTR);
typedef FARPROC(__stdcall *_GetProcAddress)(HMODULE, LPCSTR);
typedef HANDLE(__stdcall *_CreateFileA)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);

另外注意:出于某种原因,* 必须放在 __stdcall 之后;否则注释将不会执行任何操作。

关于从地址调用函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52303813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com