【问题标题】:Kill a process with its processID用它的 processID 杀死一个进程
【发布时间】:2018-06-24 08:12:28
【问题描述】:

我正在尝试显示所有正在运行的进程及其内存使用情况并提供终止选项,我使用 OpenProcess 方法来获取当前进程使用的内存。如何终止具有 processID 的进程?

代码如下:

BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  HANDLE hToken;
  PROCESSENTRY32 pe32;
  DWORD dwPriorityClass;
  PROCESS_MEMORY_COUNTERS pmc;

  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
    return( FALSE );
  }

  pe32.dwSize = sizeof( PROCESSENTRY32 );

  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    printError( TEXT("Process32First") ); // show cause of failure
    CloseHandle( hProcessSnap );          // clean the snapshot object
    return( FALSE );
  }
  if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))
    {
        if (GetLastError() == ERROR_NO_TOKEN)
        {
            if (!ImpersonateSelf(SecurityImpersonation))
            return FALSE;

            if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){
                printError( TEXT("OpenThreadToken") );
            return FALSE;
            }
         }
        else
            return FALSE;
     }
    SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
  do
  {
    printf( TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile );

    dwPriorityClass = 0;
    SIZE_T  dwMin, dwMax;
    hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION , FALSE, pe32.th32ProcessID );
    if(GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)))
    {
        printf( "\nPagefileUsage: %d KB", pmc.PagefileUsage/1024); 
    } else{
        printError( TEXT("GetProcessMemoryInfo") );
    }

    CloseHandle(hProcess);
  }while( Process32Next( hProcessSnap, &pe32 ) );
  CloseHandle( hProcessSnap );
  return( TRUE );
}

【问题讨论】:

    标签: c++ windows winapi process


    【解决方案1】:

    既然你手头有一个hProcess,你可以直接使用它:

    BOOL ok = TerminateProcess (hProcess, exit_code);
    

    exit_code 可以是你喜欢的任何东西(尽量让它有意义,以防有任何东西在等待进程并且想知道它为什么退出)。

    如果你不想那样做,你可以使用OpenProcess

    HANDLE hProcess = OpenProcess (PROCESS_TERMINATE, FALSE, process_id);
    if (hProcess)
    {
        BOOL ok = TerminateProcess (hProcess, exit_code);
        CloseHandle (hProcess);
    }
    else
    {
        DWORD err = GetLastError ();
        ...
    }
    

    您需要检查OpenProcess() 是否成功,因为(除其他外)您可能没有足够的访问权限,并且您需要在完成后关闭hProcess,即使您已经杀死了进程本身。

    TerminateProcess()here 的文档。

    【讨论】:

      最近更新 更多