3 Copyright 1999,2000,2001,2010 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, DWORD 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 ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
109 return strdup (name_buf);