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