It seems like we're just "pulling at straws" on this issue. So, I hacked one of my listview apps to perform the necessary process enumeration. I've used the following code to load the listview with the process names.
Code:
void InsertRow (HWND hWnd, char *col1, char *col2)
{
LV_ITEM lvItem;
lvItem.mask = 0;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.iItem = ListView_InsertItem (hWnd, &lvItem);
lvItem.mask = LVIF_TEXT;
lvItem.pszText = col1;
lvItem.cchTextMax = strlen (lvItem.pszText);
ListView_SetItem (hWnd, &lvItem);
lvItem.iSubItem = 1;
lvItem.pszText = col2;
lvItem.cchTextMax = strlen (lvItem.pszText);
ListView_SetItem (hWnd, &lvItem);
}
// Following code is in your calling function
HMODULE hModule;
char szProcessName[MAX_PATH] = {0};
DWORD dwProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
char PIDbuf[10];
if (!EnumProcesses(dwProcesses, sizeof(dwProcesses), &cbNeeded))
return;
cProcesses = cbNeeded / sizeof(DWORD);
for (i = 0; i < cProcesses; i++)
if(dwProcesses[i] != 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ, FALSE, dwProcesses[i]);
if (NULL != hProcess)
{
strcpy(szProcessName, "Unknown");
if (EnumProcessModules(hProcess, &hModule, sizeof(hModule),
&cbNeeded))
{
GetModuleBaseName(hProcess, hModule, szProcessName,
sizeof(szProcessName)/sizeof(CHAR));
}
}
sprintf(PIDbuf, "%d", dwProcesses[i]);
InsertRow (hWndListView, PIDbuf, szProcessName );
CloseHandle(hProcess);
}