]> sourceware.org Git - newlib-cygwin.git/blob - winsup/utils/module_info.cc
* Makefile.in: Add dumper.exe target and associated mechanisms for building it.
[newlib-cygwin.git] / winsup / utils / module_info.cc
1 /* module_info.cc
2
3 Copyright 1999 Cygnus Solutions.
4
5 Written by Egor Duda <deo@logos-m.ru>
6
7 This file is part of Cygwin.
8
9 This software is a copyrighted work licensed under the terms of the
10 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
11 details. */
12
13 #include <stdlib.h>
14 #include <windows.h>
15 #include <psapi.h>
16
17 static int psapi_loaded = 0;
18 static HMODULE psapi_module_handle = NULL;
19
20 typedef BOOL WINAPI (tf_EnumProcessModules ) ( HANDLE, HMODULE*, DWORD, LPDWORD );
21 typedef BOOL WINAPI (tf_GetModuleInformation) ( HANDLE, HMODULE, LPMODULEINFO, DWORD );
22 typedef DWORD WINAPI (tf_GetModuleFileNameExA) ( HANDLE, HMODULE, LPSTR, DWORD );
23
24 static tf_EnumProcessModules *psapi_EnumProcessModules = NULL;
25 static tf_GetModuleInformation *psapi_GetModuleInformation = NULL;
26 static tf_GetModuleFileNameExA *psapi_GetModuleFileNameExA = NULL;
27
28 /*
29 * Returns full name of Dll, which is loaded by hProcess at BaseAddress
30 * Uses psapi.dll
31 */
32
33 char*
34 psapi_get_module_name ( HANDLE hProcess, DWORD BaseAddress )
35 {
36 DWORD len;
37 MODULEINFO mi;
38 unsigned int i;
39 HMODULE dh_buf [ 1 ];
40 HMODULE* DllHandle = dh_buf;
41 DWORD cbNeeded;
42 BOOL ok;
43
44 char name_buf [ MAX_PATH + 1 ];
45
46 if ( !psapi_loaded ||
47 psapi_EnumProcessModules == NULL ||
48 psapi_GetModuleInformation == NULL ||
49 psapi_GetModuleFileNameExA == NULL )
50 {
51 if ( psapi_loaded ) goto failed;
52 psapi_loaded = 1;
53 psapi_module_handle = LoadLibrary ( "psapi.dll" );
54 if ( ! psapi_module_handle )
55 goto failed;
56 psapi_EnumProcessModules = (tf_EnumProcessModules *) GetProcAddress ( psapi_module_handle, "EnumProcessModules" );
57 psapi_GetModuleInformation = (tf_GetModuleInformation *) GetProcAddress ( psapi_module_handle, "GetModuleInformation" );
58 psapi_GetModuleFileNameExA = (tf_GetModuleFileNameExA*) GetProcAddress ( psapi_module_handle, "GetModuleFileNameExA" );
59 if ( psapi_EnumProcessModules == NULL ||
60 psapi_GetModuleInformation == NULL ||
61 psapi_GetModuleFileNameExA == NULL ) goto failed;
62 }
63
64 ok = (*psapi_EnumProcessModules) ( hProcess,
65 DllHandle,
66 sizeof ( HMODULE ),
67 &cbNeeded );
68
69 if ( !ok || !cbNeeded ) goto failed;
70 DllHandle = (HMODULE*) malloc ( cbNeeded );
71 if ( ! DllHandle ) goto failed;
72 ok = (*psapi_EnumProcessModules) ( hProcess,
73 DllHandle,
74 cbNeeded,
75 &cbNeeded );
76 if ( ! ok )
77 {
78 free ( DllHandle );
79 goto failed;
80 }
81
82 for ( i = 0; i < cbNeeded / sizeof ( HMODULE ); i++ )
83 {
84 if ( ! (*psapi_GetModuleInformation) ( hProcess,
85 DllHandle [ i ],
86 &mi,
87 sizeof ( mi ) ) )
88 {
89 free ( DllHandle );
90 goto failed;
91 }
92
93 len = (*psapi_GetModuleFileNameExA) ( hProcess,
94 DllHandle [ i ],
95 name_buf,
96 MAX_PATH );
97 if ( len == 0 )
98 {
99 free ( DllHandle );
100 goto failed;
101 }
102
103 if ( (DWORD) (mi.lpBaseOfDll) == BaseAddress )
104 {
105 free ( DllHandle );
106 return strdup ( name_buf );
107 }
108 }
109
110 failed:
111 return NULL;
112 }
This page took 0.04135 seconds and 6 git commands to generate.