2014-06-19 22:00:46|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 操作系统|来源:唯设编程网
方法很多,这里用EnumProcesses这个方法
DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i < cProcesses; i++ ) PrintProcessNameAndID( aProcesses[i]);
aProcesses数组里包含了所有进程ID,使用EnumProcesses需要安装SDK,并且需要
Header: Declared in Psapi.h.
Library: Use Psapi.lib.
这个函数在msdn上有详细的说明
有了进程ID DWORD dwProcessID
TCHAR szProcessName[MAX_PATH] = _T(""); TCHAR szProcessPath[MAX_PATH] = _T(""); HANDLE hProcess = NULL; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID); if(hProcess != NULL) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { DWORD dwRetVal = 0; DWORD dwRetValEx = 0; dwRetVal = GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); dwRetValEx = GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath)); if(dwRetVal > 0 && dwRetValEx > 0) { bRetVal = TRUE; } else { bRetVal = FALSE; } } }
GetModuleBaseName只是获得文件名如QQ.exe,
GetModuleFileNameEx是获得文件名,包括路径,如E:/tool/Tencent/qq/QQ.exe
BOOL IsSysProcess(HANDLE hProcess) { BOOL bRetVal = FALSE; //1.OpenProcessToken HANDLE hToken = NULL; if(hProcess != NULL) { bRetVal = ::OpenProcessToken(hProcess,TOKEN_QUERY,&hToken); } //2.GetTokenInformation PTOKEN_USER pToken_User = NULL; DWORD dwTokenUser = 0L; if(hToken != NULL) { ::GetTokenInformation(hToken, TokenUser, NULL,0L, &dwTokenUser); } if(dwTokenUser>0) { pToken_User = (PTOKEN_USER)::GlobalAlloc( GPTR, dwTokenUser ); } if(pToken_User != NULL) { bRetVal = ::GetTokenInformation(hToken, TokenUser, pToken_User, dwTokenUser, &dwTokenUser); } //3.LookupAccountSid... TCHAR szAccName[MAX_PATH] = {0}; TCHAR szDomainName[MAX_PATH] = {0}; if(bRetVal != FALSE && pToken_User != NULL) { SID_NAME_USE eUse = SidTypeUnknown; DWORD dwAccName = 0L; DWORD dwDomainName = 0L; PSID pSid = pToken_User->User.Sid; bRetVal = ::LookupAccountSid(NULL, pSid, NULL, &dwAccName, NULL, &dwDomainName, &eUse ); if(dwAccName>0 && dwAccName< MAX_PATH && dwDomainName>0 && dwDomainName <= MAX_PATH) { bRetVal = ::LookupAccountSid(NULL, pSid,szAccName, &dwAccName, szDomainName, &dwDomainName, &eUse ); } } //4.Compant if(bRetVal != FALSE) { if(::_tcsnicmp(szAccName,TEXT("SYSTEM"),6) != 0L) { bRetVal = FALSE; } } //4.Free pToken_User if (pToken_User != NULL) { ::GlobalFree( pToken_User ); } //5.CloseHandle if(hToken != NULL) { ::CloseHandle(hToken); } return bRetVal ; }
返回TRUE,那么就说明是系统进程
如果返回FALSE,说明不是系统进程,是用户的