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
,
22 typedef BOOL
WINAPI (tf_GetModuleInformation
) (HANDLE
, HMODULE
, LPMODULEINFO
,
24 typedef DWORD
WINAPI (tf_GetModuleFileNameExA
) (HANDLE
, HMODULE
, LPSTR
,
27 static tf_EnumProcessModules
*psapi_EnumProcessModules
= NULL
;
28 static tf_GetModuleInformation
*psapi_GetModuleInformation
= NULL
;
29 static tf_GetModuleFileNameExA
*psapi_GetModuleFileNameExA
= NULL
;
31 /* Returns full name of Dll, which is loaded by hProcess at BaseAddress.
35 psapi_get_module_name (HANDLE hProcess
, DWORD BaseAddress
)
41 HMODULE
*DllHandle
= dh_buf
;
45 char name_buf
[MAX_PATH
+ 1];
48 psapi_EnumProcessModules
== NULL
||
49 psapi_GetModuleInformation
== NULL
||
50 psapi_GetModuleFileNameExA
== NULL
)
55 psapi_module_handle
= LoadLibrary ("psapi.dll");
56 if (!psapi_module_handle
)
58 psapi_EnumProcessModules
=
59 (tf_EnumProcessModules
*) GetProcAddress (psapi_module_handle
,
60 "EnumProcessModules");
61 psapi_GetModuleInformation
=
62 (tf_GetModuleInformation
*) GetProcAddress (psapi_module_handle
,
63 "GetModuleInformation");
64 psapi_GetModuleFileNameExA
=
65 (tf_GetModuleFileNameExA
*) GetProcAddress (psapi_module_handle
,
66 "GetModuleFileNameExA");
67 if (psapi_EnumProcessModules
== NULL
68 || psapi_GetModuleInformation
== NULL
69 || psapi_GetModuleFileNameExA
== NULL
)
73 ok
= (*psapi_EnumProcessModules
) (hProcess
,
74 DllHandle
, sizeof (HMODULE
), &cbNeeded
);
78 DllHandle
= (HMODULE
*) malloc (cbNeeded
);
81 ok
= (*psapi_EnumProcessModules
) (hProcess
, DllHandle
, cbNeeded
, &cbNeeded
);
88 for (i
= 0; i
< cbNeeded
/ sizeof (HMODULE
); i
++)
90 if (!(*psapi_GetModuleInformation
) (hProcess
,
91 DllHandle
[i
], &mi
, sizeof (mi
)))
97 len
= (*psapi_GetModuleFileNameExA
) (hProcess
,
98 DllHandle
[i
], name_buf
, MAX_PATH
);
105 if ((DWORD
) (mi
.lpBaseOfDll
) == BaseAddress
)
108 return strdup (name_buf
);