Ответ 1
Вы используете правильный API, а именно CreateToolhelp32Snapshot, Process32First и Process32Next. И как вы это делаете, вы должны использовать член szExeFile из структуры PROCESSENTRY32.
Вы возвращаетесь из своей функции, когда найдете совпадение в данный момент. Вместо этого вы должны увеличивать счетчик и НЕ возвращаться. И верните int с количеством процессов вместо bool. Также не забудьте закрыть CloseHandle (hSnapshot); до конца функции после того, как у вас есть счет.
Также перед первым переустановкой убедитесь, что вы получили привилегию SeDebugPrivilege
, таким образом вы получите все процессы во всех сеансах и пользователях.
Чтобы получить привилегию, чтобы получить все сеансы:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
Где приобретаетсяPrivilegeByName определяется как:
BOOL acquirePrivilegeByName(
const TCHAR *szPrivilegeName)
{
HANDLE htoken;
TOKEN_PRIVILEGES tkp;
DWORD dwerr;
//---------------- adjust process token privileges to grant privilege
if (szPrivilegeName == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
return FALSE;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
return FALSE;
if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED
{
dwerr = GetLastError();
CloseHandle(htoken);
SetLastError(dwerr);
return FALSE;
}
CloseHandle(htoken);
SetLastError(ERROR_SUCCESS);
return TRUE;
} //acquirePrivilegeByName()