2011-05-25 9 views
1

私は自分のプロセスがメモリにロードされると、イメージベースを取得しようとしています。私の理解から、GetModuleHandleを呼び出してイメージベースを取得することができます。GetModuleHandleを使用してIMAGE_DOS_HEADERへのポインタを取得しますか?

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

これが正しくない場合は、あなたが他のどのような方法を使用することができます。私の質問は、ハンドルは、本質的に、あなたが次の操作を行うことができることなどIMAGE_DOS_HEADER構造体を指して返さないのですか?

答えて

2

これは間違いありませんが、dllのモジュールハンドルを使用する場合は、パスを指定する必要があります。それ以外の場合は、プロセスexeへのハンドルを取得します。返されたHMODULEを最初に確認して、有効であることを確認する必要があります。

モジュールの仮想サイズを取得する方法の例:あなたは、私が読みやすく、明確なことを見つけると私はIMAGE_DOS_HEADER*なくPIMAGE_DOS_HEADERを使用わかります

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; 
} 

を。 Microsoftのコンパイラとリンカで

+0

おかげNecrolisを使用することができます!私は、コードが実行されているモジュールのベースを取得したかった。 – Chris

+0

@Necrolis:MSDN sais "このパラメータがNULLの場合、GetModuleHandleは呼び出しプロセス(.exeファイル)の作成に使用されたファイルのハンドルを返します"。したがって、常にプロセスのモジュールを返します。 – user877329

0

、あなたは

extern "C" IMAGE_DOS_HEADER __ImageBase; 
関連する問題