正如我之前提到的一個問題,我正在模擬我的代碼中的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