3 Copyright 1999 Cygnus Solutions.
5 Written by Egor Duda <deo@logos-m.ru>
7 This file is part of Cygwin.
9 This software is a copyrighted work licensed under the terms of the
10 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
17 static int psapi_loaded
= 0;
18 static HMODULE psapi_module_handle
= NULL
;
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
);
24 static tf_EnumProcessModules
*psapi_EnumProcessModules
= NULL
;
25 static tf_GetModuleInformation
*psapi_GetModuleInformation
= NULL
;
26 static tf_GetModuleFileNameExA
*psapi_GetModuleFileNameExA
= NULL
;
29 * Returns full name of Dll, which is loaded by hProcess at BaseAddress
34 psapi_get_module_name ( HANDLE hProcess
, DWORD BaseAddress
)
40 HMODULE
* DllHandle
= dh_buf
;
44 char name_buf
[ MAX_PATH
+ 1 ];
47 psapi_EnumProcessModules
== NULL
||
48 psapi_GetModuleInformation
== NULL
||
49 psapi_GetModuleFileNameExA
== NULL
)
51 if ( psapi_loaded
) goto failed
;
53 psapi_module_handle
= LoadLibrary ( "psapi.dll" );
54 if ( ! psapi_module_handle
)
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
;
64 ok
= (*psapi_EnumProcessModules
) ( hProcess
,
69 if ( !ok
|| !cbNeeded
) goto failed
;
70 DllHandle
= (HMODULE
*) malloc ( cbNeeded
);
71 if ( ! DllHandle
) goto failed
;
72 ok
= (*psapi_EnumProcessModules
) ( hProcess
,
82 for ( i
= 0; i
< cbNeeded
/ sizeof ( HMODULE
); i
++ )
84 if ( ! (*psapi_GetModuleInformation
) ( hProcess
,
93 len
= (*psapi_GetModuleFileNameExA
) ( hProcess
,
103 if ( (DWORD
) (mi
.lpBaseOfDll
) == BaseAddress
)
106 return strdup ( name_buf
);