3 Copyright 1999, 2000, 2001, 2010, 2013 Red Hat, Inc.
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
18 static int psapi_loaded
= 0;
19 static HMODULE psapi_module_handle
= NULL
;
21 typedef BOOL
WINAPI (tf_EnumProcessModules
) (HANDLE
, HMODULE
*, DWORD
,
23 typedef BOOL
WINAPI (tf_GetModuleInformation
) (HANDLE
, HMODULE
, LPMODULEINFO
,
25 typedef DWORD
WINAPI (tf_GetModuleFileNameExA
) (HANDLE
, HMODULE
, LPSTR
,
28 static tf_EnumProcessModules
*psapi_EnumProcessModules
= NULL
;
29 static tf_GetModuleInformation
*psapi_GetModuleInformation
= NULL
;
30 static tf_GetModuleFileNameExA
*psapi_GetModuleFileNameExA
= NULL
;
32 /* Returns full name of Dll, which is loaded by hProcess at BaseAddress.
36 psapi_get_module_name (HANDLE hProcess
, LPVOID BaseAddress
)
42 HMODULE
*DllHandle
= dh_buf
;
46 char name_buf
[MAX_PATH
+ 1];
49 psapi_EnumProcessModules
== NULL
||
50 psapi_GetModuleInformation
== NULL
||
51 psapi_GetModuleFileNameExA
== NULL
)
56 psapi_module_handle
= LoadLibrary ("psapi.dll");
57 if (!psapi_module_handle
)
59 psapi_EnumProcessModules
=
60 (tf_EnumProcessModules
*) GetProcAddress (psapi_module_handle
,
61 "EnumProcessModules");
62 psapi_GetModuleInformation
=
63 (tf_GetModuleInformation
*) GetProcAddress (psapi_module_handle
,
64 "GetModuleInformation");
65 psapi_GetModuleFileNameExA
=
66 (tf_GetModuleFileNameExA
*) GetProcAddress (psapi_module_handle
,
67 "GetModuleFileNameExA");
68 if (psapi_EnumProcessModules
== NULL
69 || psapi_GetModuleInformation
== NULL
70 || psapi_GetModuleFileNameExA
== NULL
)
74 ok
= (*psapi_EnumProcessModules
) (hProcess
,
75 DllHandle
, sizeof (HMODULE
), &cbNeeded
);
79 DllHandle
= (HMODULE
*) malloc (cbNeeded
);
82 ok
= (*psapi_EnumProcessModules
) (hProcess
, DllHandle
, cbNeeded
, &cbNeeded
);
89 for (i
= 0; i
< cbNeeded
/ sizeof (HMODULE
); i
++)
91 if (!(*psapi_GetModuleInformation
) (hProcess
,
92 DllHandle
[i
], &mi
, sizeof (mi
)))
98 len
= (*psapi_GetModuleFileNameExA
) (hProcess
,
99 DllHandle
[i
], name_buf
, MAX_PATH
);
106 if (mi
.lpBaseOfDll
== BaseAddress
)
109 return strdup (name_buf
);