116 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* module_info.cc
 | |
| 
 | |
|    Copyright 1999, 2000, 2001, 2010 Red Hat, Inc.
 | |
| 
 | |
|    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>
 | |
| #include "loadlib.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;
 | |
| }
 |