非常奇怪,不知道为什么我终止不了进程,非系统进程,代码如下:void CEnumProcessDlg::Terminate(const CString& szTargetProcess)
{
PROCESSENTRY32 processEntry = {0};
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
return;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnap,&processEntry);
int i = -1;
while(bRet)
{
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,processEntry.th32ProcessID);
CString str;
str.Format(_T("%s"),processEntry.szExeFile);
if(str.CompareNoCase(szTargetProcess) == 0)
{
DWORD dw;
GetExitCodeProcess(hModuleSnap,&dw);
TerminateProcess(hModuleSnap,dw);
CloseHandle(hProcessSnap);
return;
}
bRet = Process32Next(hProcessSnap,&processEntry); }
}这个是根据进程名去终止一个进程的.也调用了TerminateProcess函数,但不知道为什么返回结果是0,也就是说不成功,不知道为什么????请高手指点.
{
PROCESSENTRY32 processEntry = {0};
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
return;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnap,&processEntry);
int i = -1;
while(bRet)
{
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,processEntry.th32ProcessID);
CString str;
str.Format(_T("%s"),processEntry.szExeFile);
if(str.CompareNoCase(szTargetProcess) == 0)
{
DWORD dw;
GetExitCodeProcess(hModuleSnap,&dw);
TerminateProcess(hModuleSnap,dw);
CloseHandle(hProcessSnap);
return;
}
bRet = Process32Next(hProcessSnap,&processEntry); }
}这个是根据进程名去终止一个进程的.也调用了TerminateProcess函数,但不知道为什么返回结果是0,也就是说不成功,不知道为什么????请高手指点.
在kill进程之前试着用AdjustTokenPrivileges调整权限至SE_DEBUG_NAME,然后kill it.
HANDLE hToken;
LUID luid; //
// enable debug privilege
// if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken ))
{
return NULL;
} if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
return NULL;
} tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL ); if (GetLastError() != ERROR_SUCCESS)
{
return NULL;
}// 打开进程,然后kill it!
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntry.th32ProcessID);
TerminateProcess(hProcess, 0); // Revoke all privileges this process holds (including backup)
AdjustTokenPrivileges( hToken, TRUE, NULL, 0, NULL, NULL); // close handle to process token
CloseHandle(hToken);