繁体   English   中英

使用其processID杀死一个进程

[英]Kill a process with its processID

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

由于您有一个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()文档在此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM