newlib/winsup/utils/module_info.cc

113 lines
3.1 KiB
C++

/* module_info.cc
Copyright 1999 Cygnus Solutions.
Written by Egor Duda <deo@logos-m.ru>
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <stdlib.h>
#include <windows.h>
#include <psapi.h>
static int psapi_loaded = 0;
static HMODULE psapi_module_handle = NULL;
typedef BOOL WINAPI (tf_EnumProcessModules ) ( HANDLE, HMODULE*, DWORD, LPDWORD );
typedef BOOL WINAPI (tf_GetModuleInformation) ( HANDLE, HMODULE, LPMODULEINFO, DWORD );
typedef DWORD WINAPI (tf_GetModuleFileNameExA) ( HANDLE, HMODULE, LPSTR, DWORD );
static tf_EnumProcessModules *psapi_EnumProcessModules = NULL;
static tf_GetModuleInformation *psapi_GetModuleInformation = NULL;
static tf_GetModuleFileNameExA *psapi_GetModuleFileNameExA = NULL;
/*
* Returns full name of Dll, which is loaded by hProcess at BaseAddress
* Uses psapi.dll
*/
char*
psapi_get_module_name ( HANDLE hProcess, DWORD BaseAddress )
{
DWORD len;
MODULEINFO mi;
unsigned int i;
HMODULE dh_buf [ 1 ];
HMODULE* DllHandle = dh_buf;
DWORD cbNeeded;
BOOL ok;
char name_buf [ MAX_PATH + 1 ];
if ( !psapi_loaded ||
psapi_EnumProcessModules == NULL ||
psapi_GetModuleInformation == NULL ||
psapi_GetModuleFileNameExA == NULL )
{
if ( psapi_loaded ) goto failed;
psapi_loaded = 1;
psapi_module_handle = LoadLibrary ( "psapi.dll" );
if ( ! psapi_module_handle )
goto failed;
psapi_EnumProcessModules = (tf_EnumProcessModules *) GetProcAddress ( psapi_module_handle, "EnumProcessModules" );
psapi_GetModuleInformation = (tf_GetModuleInformation *) GetProcAddress ( psapi_module_handle, "GetModuleInformation" );
psapi_GetModuleFileNameExA = (tf_GetModuleFileNameExA*) GetProcAddress ( psapi_module_handle, "GetModuleFileNameExA" );
if ( psapi_EnumProcessModules == NULL ||
psapi_GetModuleInformation == NULL ||
psapi_GetModuleFileNameExA == NULL ) goto failed;
}
ok = (*psapi_EnumProcessModules) ( hProcess,
DllHandle,
sizeof ( HMODULE ),
&cbNeeded );
if ( !ok || !cbNeeded ) goto failed;
DllHandle = (HMODULE*) malloc ( cbNeeded );
if ( ! DllHandle ) goto failed;
ok = (*psapi_EnumProcessModules) ( hProcess,
DllHandle,
cbNeeded,
&cbNeeded );
if ( ! ok )
{
free ( DllHandle );
goto failed;
}
for ( i = 0; i < cbNeeded / sizeof ( HMODULE ); i++ )
{
if ( ! (*psapi_GetModuleInformation) ( hProcess,
DllHandle [ i ],
&mi,
sizeof ( mi ) ) )
{
free ( DllHandle );
goto failed;
}
len = (*psapi_GetModuleFileNameExA) ( hProcess,
DllHandle [ i ],
name_buf,
MAX_PATH );
if ( len == 0 )
{
free ( DllHandle );
goto failed;
}
if ( (DWORD) (mi.lpBaseOfDll) == BaseAddress )
{
free ( DllHandle );
return strdup ( name_buf );
}
}
failed:
return NULL;
}