为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
繁星coding 2019-10-17 11:11:26
我正在尝试获取example.exe的进程句柄,因此可以对其进行调用TerminateProcess。我怎样才能做到这一点?请注意,它没有窗口,因此FindWindow无法使用。
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

#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;

}


查看完整回答
反对 回复 2019-10-17
?
萧十郎

TA贡献1815条经验 获得超13个赞

有两种基本技术。第一种使用PSAPI;第二种使用PSAPI。MSDN有一个例子,使用EnumProcesses,OpenProcess,EnumProcessModules,和GetModuleBaseName。


另一个使用我更喜欢的Toolhelp。使用CreateToolhelp32Snapshot来获取进程列表的快照,走在它与Process32First和Process32Next,它提供了模块名称和进程ID,直到你找到你想要的,然后调用OpenProcess得到的句柄。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 999 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信