代码之家  ›  专栏  ›  技术社区  ›  Malfist

如何在C++中以其名称获取进程句柄?

  •  52
  • Malfist  · 技术社区  · 15 年前

    我正在尝试获取的进程句柄,例如example.exe,以便调用 TerminateProcess 关于它。我该怎么做?注意,它没有窗户,所以 FindWindow 不起作用。

    5 回复  |  直到 7 年前
        1
  •  70
  •   xian    14 年前
    #include <cstdio>
    #include <windows.h>
    #include <tlhelp32.h>
    
    int main( int, char *[] )
    {
        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(PROCESSENTRY32);
    
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    
        if (Process32First(snapshot, &entry) == TRUE)
        {
            while (Process32Next(snapshot, &entry) == TRUE)
            {
                if (stricmp(entry.szExeFile, "target.exe") == 0)
                {  
                    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
    
                    // Do stuff..
    
                    CloseHandle(hProcess);
                }
            }
        }
    
        CloseHandle(snapshot);
    
        return 0;
    }
    

    另外,如果您想在OpenProcess中使用process_all_access,可以尝试以下方法:

    #include <cstdio>
    #include <windows.h>
    #include <tlhelp32.h>
    
    void EnableDebugPriv()
    {
        HANDLE hToken;
        LUID luid;
        TOKEN_PRIVILEGES tkp;
    
        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
    
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = luid;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
    
        CloseHandle(hToken); 
    }
    
    int main( int, char *[] )
    {
        EnableDebugPriv();
    
        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(PROCESSENTRY32);
    
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    
        if (Process32First(snapshot, &entry) == TRUE)
        {
            while (Process32Next(snapshot, &entry) == TRUE)
            {
                if (stricmp(entry.szExeFile, "target.exe") == 0)
                {  
                    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
    
                    // Do stuff..
    
                    CloseHandle(hProcess);
                }
            }
        }
    
        CloseHandle(snapshot);
    
        return 0;
    }
    
        2
  •  15
  •   bytecode77    7 年前

    下面的代码显示了如何使用工具帮助和OpenProcess来获取进程的句柄。为简洁起见,删除了错误处理。

    HANDLE GetProcessByName(PCSTR name)
    {
        DWORD pid = 0;
    
        // Create toolhelp snapshot.
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 process;
        ZeroMemory(&process, sizeof(process));
        process.dwSize = sizeof(process);
    
        // Walkthrough all processes.
        if (Process32First(snapshot, &process))
        {
            do
            {
                // Compare process.szExeFile based on format of name, i.e., trim file path
                // trim .exe if necessary, etc.
                if (string(process.szExeFile) == string(name))
                {
                   pid = process.th32ProcessID;
                   break;
                }
            } while (Process32Next(snapshot, &process));
        }
    
        CloseHandle(snapshot);
    
        if (pid != 0)
        {
             return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
        }
    
        // Not found
    
    
           return NULL;
    }
    
        3
  •  11
  •   Rob Kennedy    15 年前

    有两种基本技术。第一个使用psapi;msdn有 an example 使用的 EnumProcesses , OpenProcess , EnumProcessModules GetModuleBaseName .

    另一个使用工具帮助,我更喜欢。使用 CreateToolhelp32Snapshot 要获取流程列表的快照,请使用 Process32First Process32Next ,它提供模块名和进程ID,直到找到所需的模块,然后调用 开放过程 得到一个手柄。

        4
  •  2
  •   GEOCHET S.Lott    15 年前

    退房: MSDN Article

    你可以使用 GetModuleName (我认为?)得到名字并核对一下。

        5
  •  1
  •   aJ.    15 年前

    OpenProcess 功能

    来自MSDN:

    要打开另一个本地进程的句柄并获得完全访问权限,必须启用sedebugprivilege特权。