71 lines
1.4 KiB
C++
71 lines
1.4 KiB
C++
/* module_info.cc
|
|
|
|
Written by Egor Duda <deo@logos-m.ru>
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <psapi.h>
|
|
#include "loadlib.h"
|
|
|
|
/* Returns full name of Dll, which is loaded by hProcess at BaseAddress.
|
|
Uses psapi.dll. */
|
|
|
|
char *
|
|
psapi_get_module_name (HANDLE hProcess, LPVOID BaseAddress)
|
|
{
|
|
DWORD len;
|
|
MODULEINFO mi;
|
|
unsigned int i;
|
|
HMODULE dh_buf[1];
|
|
HMODULE *DllHandle = dh_buf;
|
|
DWORD cbNeeded;
|
|
BOOL ok;
|
|
|
|
char name_buf[MAX_PATH + 1];
|
|
|
|
ok = EnumProcessModules (hProcess, DllHandle, sizeof (HMODULE), &cbNeeded);
|
|
|
|
if (!ok || !cbNeeded)
|
|
goto failed;
|
|
DllHandle = (HMODULE *) malloc (cbNeeded);
|
|
if (!DllHandle)
|
|
goto failed;
|
|
ok = EnumProcessModules (hProcess, DllHandle, cbNeeded, &cbNeeded);
|
|
if (!ok)
|
|
{
|
|
free (DllHandle);
|
|
goto failed;
|
|
}
|
|
|
|
for (i = 0; i < cbNeeded / sizeof (HMODULE); i++)
|
|
{
|
|
if (!GetModuleInformation (hProcess, DllHandle[i], &mi, sizeof (mi)))
|
|
{
|
|
free (DllHandle);
|
|
goto failed;
|
|
}
|
|
|
|
len = GetModuleFileNameExA (hProcess, DllHandle[i], name_buf, MAX_PATH);
|
|
if (len == 0)
|
|
{
|
|
free (DllHandle);
|
|
goto failed;
|
|
}
|
|
|
|
if (mi.lpBaseOfDll == BaseAddress)
|
|
{
|
|
free (DllHandle);
|
|
return strdup (name_buf);
|
|
}
|
|
}
|
|
|
|
failed:
|
|
return NULL;
|
|
}
|