正如我之前提到的一个问题,我正在模拟我的代码中的GetProcAddress()函数。下面的代码是成功的在做这个,但是它会导致应用程序崩溃,在Windows 7Windows 7上的动态加载失败
void *GetFuncAddr(HMODULE hModule, char *fname)
{
unsigned int count = 1;
IMAGE_DOS_HEADER *DosHeader;
IMAGE_NT_HEADERS *NtHeaders;
IMAGE_OPTIONAL_HEADER *OptionalHeader;
IMAGE_DATA_DIRECTORY *DataDirectory;
IMAGE_EXPORT_DIRECTORY *Exp;
ULONG *addrof;
char *fullfname;
ULONG *faddr;
DosHeader = (IMAGE_DOS_HEADER *)hModule;
if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
return NULL;
}
NtHeaders = (IMAGE_NT_HEADERS *)(((BYTE *)DosHeader) + DosHeader->e_lfanew);
if (NtHeaders->Signature != IMAGE_NT_SIGNATURE)
{
return NULL;
}
OptionalHeader = &NtHeaders->OptionalHeader;
DataDirectory = &OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
Exp = (IMAGE_EXPORT_DIRECTORY *)((size_t)DosHeader + DataDirectory->VirtualAddress);
addrof = (ULONG *)((BYTE*) hModule + Exp->addrof);
faddr = (ULONG*) ((BYTE*) hModule + Exp->AddressOfFunctions);
for(count = 0; count < Exp->NumberOfNames; count++)
{
fullfname = (char*)((BYTE*) hModule + addrof[count]);
if(strcmp(fullfname, fname) == 0)
{
return (void*)((BYTE*) hModule + faddr[count]);
}
}
return NULL;
}
不要紧,我使用这个应用程序崩溃试图加载什么功能。调用导入的函数时发生崩溃,所以我的猜测是返回的指针可能是这里的罪魁祸首。这发生在x86和x64上。 在这段代码中是否有任何明显的原因?我试着设置函数返回FARPROC,但我得到了所有关于如何在((BYTE *)hModule + faddr [count])上施加返回的困惑;
无论如何,有什么想法?解决方案? 任何帮助表示赞赏。
谢谢。杰西。
编辑我导入的某些API返回的错误是错误18,该参数不正确。
首先,FARPROC是无关紧要的,因为这是从16位时代遗留下来的时候FAR(段外)或NEAR(段间)地址。 指针的值是多少? 始终ASSERT(ptr)! – 2009-12-21 20:57:43
感谢您的信息。我在调用函数的指针上声明。如果指针为空,我将标记错误并终止程序。但是,指针似乎很好 – Jessica 2009-12-21 21:02:47
也许你正在被基地址随机选中?它对你自己建造的dll是否失败? – Eugene 2009-12-21 21:37:56