ilgar
May 21st, 1999, 02:30 AM
I'm trying to enumerate all processes and by their modules to find executable names.
Exception is thrown on the line labeled EXCEPTION:
Any help appreciated!
#include <windows.h>
#include <windowsx.h>
int pascal WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
DWORD dwProcessId[1024], cbProcessNeeded, cbModuleNeeded;
HANDLE hProcess;
HMODULE hModules[1024];
LPTSTR lpszFilePath = "";
UINT n1 = 1;
UINT n2 = 1;
UINT i, j;
typedef HANDLE (WINAPI *LPENUMPROCESSES)(DWORD *, DWORD, DWORD *);
typedef HANDLE (WINAPI *LPENUMPROCESSMODULES)(HANDLE, HMODULE *, DWORD, DWORD *);
typedef HANDLE (WINAPI *LPGETMODULEFILENAMEEX)(HANDLE, HMODULE, LPTSTR, DWORD);
LPENUMPROCESSES lpEnumProcesses;
LPENUMPROCESSMODULES lpEnumProcessModules;
LPGETMODULEFILENAMEEX lpGetModuleFileNameEx;
HINSTANCE hDll = LoadLibrary("PSAPI.DLL");
if (hDll)
{
lpEnumProcesses = (LPENUMPROCESSES)GetProcAddress(hDll, "EnumProcesses");
lpEnumProcessModules =
(LPENUMPROCESSMODULES)GetProcAddress(hDll, "EnumProcessModules");
lpGetModuleFileNameEx =
(LPGETMODULEFILENAMEEX)GetProcAddress(hDll, "GetModuleFileNameEx");
// Enumerate System Processes
if (lpEnumProcesses(dwProcessId, sizeof(dwProcessId), &cbProcessNeeded))
{
// Enumerate each process' modules
n1 = cbProcessNeeded / sizeof(DWORD);
for (i = 0; i < n1; i++)
{
hProcess = OpenProcess(PROCESS_VM_READ |
PROCESS_QUERY_INFORMATION |
PROCESS_SET_INFORMATION,
FALSE,
dwProcessId[i]);
if (lpEnumProcessModules(hProcess,
hModules,
sizeof(hModules),
&cbModuleNeeded))
{
// Get each module's file name
n2 = cbModuleNeeded / sizeof(HMODULE);
for (j = 0; j < n2; j++)
{
EXCEPTION: lpGetModuleFileNameEx(hProcess, hModules[j],
lpszFilePath, _MAX_PATH);
}
CloseHandle(hProcess);
}
}
}
else
{
MessageBox(NULL, "Can't enum processes", "ERROR", MB_OK);
}
FreeLibrary(hDll);
}
else
{
MessageBox(NULL, "No Dll", "ERROR", MB_OK);
}
return 0;
}
Thanks,
Ilgar Mashayev
Exception is thrown on the line labeled EXCEPTION:
Any help appreciated!
#include <windows.h>
#include <windowsx.h>
int pascal WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
DWORD dwProcessId[1024], cbProcessNeeded, cbModuleNeeded;
HANDLE hProcess;
HMODULE hModules[1024];
LPTSTR lpszFilePath = "";
UINT n1 = 1;
UINT n2 = 1;
UINT i, j;
typedef HANDLE (WINAPI *LPENUMPROCESSES)(DWORD *, DWORD, DWORD *);
typedef HANDLE (WINAPI *LPENUMPROCESSMODULES)(HANDLE, HMODULE *, DWORD, DWORD *);
typedef HANDLE (WINAPI *LPGETMODULEFILENAMEEX)(HANDLE, HMODULE, LPTSTR, DWORD);
LPENUMPROCESSES lpEnumProcesses;
LPENUMPROCESSMODULES lpEnumProcessModules;
LPGETMODULEFILENAMEEX lpGetModuleFileNameEx;
HINSTANCE hDll = LoadLibrary("PSAPI.DLL");
if (hDll)
{
lpEnumProcesses = (LPENUMPROCESSES)GetProcAddress(hDll, "EnumProcesses");
lpEnumProcessModules =
(LPENUMPROCESSMODULES)GetProcAddress(hDll, "EnumProcessModules");
lpGetModuleFileNameEx =
(LPGETMODULEFILENAMEEX)GetProcAddress(hDll, "GetModuleFileNameEx");
// Enumerate System Processes
if (lpEnumProcesses(dwProcessId, sizeof(dwProcessId), &cbProcessNeeded))
{
// Enumerate each process' modules
n1 = cbProcessNeeded / sizeof(DWORD);
for (i = 0; i < n1; i++)
{
hProcess = OpenProcess(PROCESS_VM_READ |
PROCESS_QUERY_INFORMATION |
PROCESS_SET_INFORMATION,
FALSE,
dwProcessId[i]);
if (lpEnumProcessModules(hProcess,
hModules,
sizeof(hModules),
&cbModuleNeeded))
{
// Get each module's file name
n2 = cbModuleNeeded / sizeof(HMODULE);
for (j = 0; j < n2; j++)
{
EXCEPTION: lpGetModuleFileNameEx(hProcess, hModules[j],
lpszFilePath, _MAX_PATH);
}
CloseHandle(hProcess);
}
}
}
else
{
MessageBox(NULL, "Can't enum processes", "ERROR", MB_OK);
}
FreeLibrary(hDll);
}
else
{
MessageBox(NULL, "No Dll", "ERROR", MB_OK);
}
return 0;
}
Thanks,
Ilgar Mashayev