Click to See Complete Forum and Search --> : Processes & Modules???


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