您正在使用正确的 API,即创建Toolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx, 进程32优先 http://msdn.microsoft.com/en-us/library/ms684834(VS.85).aspx and 流程32下一个 http://msdn.microsoft.com/en-us/library/ms684836(VS.85).aspx。正如您所做的那样,您应该使用结构中的 szExeFile 成员流程输入32 http://msdn.microsoft.com/en-us/library/ms684839(VS.85).aspx.
当您当前找到匹配项时,您将从函数中返回。相反,您应该增加计数器而不返回。并返回一个带有进程计数的 int 而不是 bool。另外请确保不要执行 CloseHandle(hSnapshot); 操作直到获得计数后函数结束。
还要确保首先获得特权SeDebugPrivilege
在枚举之前,这样您将获得所有会话和用户的所有进程。
要获得特权以便获得所有会话:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
其中 acquirePrivilegeByName 定义为:
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()