BOOL GetDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY , &hToken))
{
return FALSE ;
}
if (! LookupPrivilegeValue( NULL , SE_DEBUG_NAME , &sedebugnameValue))
{
CloseHandle(hToken);
return FALSE ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
if (!AdjustTokenPrivileges(hToken, FALSE , &tkp, sizeof tkp, NULL, NULL))
{
CloseHandle(hToken);
return FALSE ;
}
return TRUE ;
}
void CToolDlg ::KillProcess()
{
GetDebugPriv();
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof (pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE )
{
MessageBox (L"CreateToolhelp32Snapshot调用失败!\n" );
return ;
}
CString strPrcNameID;
BOOL bMore = ::Process32First (hProcessSnap, &pe32);
while (bMore)
{
if (lstrcmp (pe32.szExeFile, _TEXT( "contrlvip.exe")) == 0)
{
HANDLE hTargetProcess = OpenProcess(PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE | // For WriteProcessMemory
PROCESS_TERMINATE , //Required to terminate a process using TerminateProcess function
FALSE , pe32.th32ProcessID);
if (hTargetProcess == NULL )
{
DWORD ulErrCode = GetLastError();
CString strError;
strError.Format( L"OpenProcess failed,error code:%ld" , ulErrCode);
AfxMessageBox(strError);
}
BOOL result = TerminateProcess(hTargetProcess, 0);
if (!result)
{
DWORD ulErrCode = GetLastError();
CString strError;
strError.Format( L"TerminateProcess failed,error code:%ld" , ulErrCode);
AfxMessageBox(strError);
}
}
bMore = :: Process32Next (hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
}
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。