VC结束进程

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 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注