求助,关于获取模块地址的问题.
使用 GetModuleHandle可以获取一个模块的地址,如,HMODULE hm = GetModuleHandle(xxxxx.dll);就会返回地址;
请问如何获取一个xxxxx.exe 的地址呢?
如,我想获取一个HMODULE hm = GetModuleHandle(xxxxx.exe);就总会返回一个0,而不是一个正确的值;
我该怎么做才能正确返回一个exe的地址。
程序代码:#include <windows.h>
#include <psapi.h>
#include <vector>
#include <string>
#include <iostream>
HANDLE GetProcessHandle_ByWindow( const wchar_t* lpClassName, const wchar_t* lpWindowName )
{
HWND hWnd = ::FindWindowW( lpClassName, lpWindowName );
if( !hWnd )
return nullptr;
DWORD pid;
if( GetWindowThreadProcessId(hWnd,&pid) == 0 )
return nullptr;
return OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid );
}
std::vector<std::pair<std::wstring,HMODULE>> GetModules_ByProcessHandle( HANDLE hProcess )
{
std::vector<HMODULE> temp( 100, nullptr );
for( ; ; )
{
DWORD cb_needed;
if( !EnumProcessModulesEx(hProcess, &temp[0], DWORD(temp.size()*sizeof(HMODULE)), &cb_needed, LIST_MODULES_DEFAULT) )
return {};
if( cb_needed < temp.size()*sizeof(HMODULE) )
{
temp.resize( cb_needed/sizeof(HMODULE) );
break;
}
temp.resize( temp.size()*2 );
}
std::vector<std::pair<std::wstring,HMODULE>> result;
for( const auto& h : temp )
{
std::wstring basename( 10, L'?' );
for( ; ; )
{
DWORD n = GetModuleBaseNameW( hProcess, h, &basename[0], (DWORD)basename.size() );
if( n == 0 )
return {};
if( n < basename.size() )
{
basename.resize( n );
break;
}
basename.resize( basename.size()*2 );
}
result.emplace_back( basename, h );
}
return result;
}
int main( void )
{
std::wcout.imbue( std::locale(std::locale(),"",std::locale::ctype) );
HANDLE hProcess = GetProcessHandle_ByWindow( L"Notepad", nullptr );
if( hProcess )
{
std::vector<std::pair<std::wstring,HMODULE>> modules = GetModules_ByProcessHandle( hProcess );
for( const auto& [name,hModule] : modules )
{
std::wcout << hModule << '\t' << name << '\n';
}
CloseHandle( hProcess );
}
return 0;
}