2011-05-25 142 views
1

我試圖在內存中加載我的進程的映像基礎。根據我的理解,您可以調用GetModuleHandle來獲取圖像庫。我的問題是,它的手柄回到基本指向IMAGE_DOS_HEADER結構,例如,你可以做到以下幾點:GetModuleHandle獲取指向IMAGE_DOS_HEADER的指針?

PIMAGE_DOS_HEADER DosHeader; 
DosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL); 

如果這是不正確的,可能你用什麼樣的方法?

回答

2

這是正確的,但如果你想要一個dll的模塊句柄,你需要指定它的路徑。否則,您將獲得進程exe的句柄。您還應該首先查看返回的HMODULE以查看其有效性。

如何獲得該模塊的虛擬大小的一個例子:

std::size_t GetModuleSize(const char* szModule) 
{ 
    HMODULE hModule = GetModuleHandle(szModule); 
    if(hModule == NULL) return 0; 
    IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*)hModule; 
    IMAGE_NT_HEADERS* pNTHeaders =(IMAGE_NT_HEADERS*)((BYTE*)pDOSHeader + pDOSHeader->e_lfanew); 
    return pNTHeaders->OptionalHeader.SizeOfImage; 
} 

你會發現我使用IMAGE_DOS_HEADER*,而不是作爲PIMAGE_DOS_HEADER我發現,更具可讀性和清晰。

+0

感謝Necrolis!我確實想獲取代碼執行的模塊的基礎。 – Chris 2011-05-25 15:41:07

+0

@Necrolis:MSDN sais「如果此參數爲NULL,則GetModuleHandle將返回用於創建調用進程(.exe文件)的文件的句柄」。所以它總是返回進程的模塊。 – user877329 2014-05-17 07:21:02

0

隨着微軟的編譯器和連接器,你可以使用

extern "C" IMAGE_DOS_HEADER __ImageBase;