使用其processID

时间:2018-06-24 08:12:28

标签: c++ windows winapi process

我试图显示所有正在运行的进程以及它们的内存使用情况,并提供一个kill选项,我使用了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 );
}

1 个答案:

答案 0 :(得分:3)

由于您手头有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的文档。