按映像名称获取进程的进程句柄

时间:2010-02-17 13:58:16

标签: c windows winapi

我需要使用Win32的最简单方法,通过其可执行文件名获取另一个进程的进程句柄。

我正在寻找的过程没有任何已注册的窗口类。我也知道如果它正在运行,那么它只会运行一个实例。

1 个答案:

答案 0 :(得分:2)

使用CreateToolhelp32SnapshotProcess32FirstProcess32Next枚举所有流程。

PROCESSENTRY32内,您可以找到szExeFile成员。 您可以通过在同一结构中调用进程ID为th32ProcessID的{​​{3}}来获取进程句柄。

找到与您的exe名称匹配的进程后,您可以跳出循环并获取句柄。

注意:如果您需要枚举每个进程,无论会话是什么,您都应该获得SE_DEBUG权限。

在主要电话的顶部:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

以下是acquirePrivilegeByName

的定义
BOOL acquirePrivilegeByName(
                            const TCHAR     *szPrivilegeName)
{
    HANDLE          htoken;
    TOKEN_PRIVILEGES    tkp;
    DWORD           dwerr;

    if (szPrivilegeName == NULL)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
        return FALSE;

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
        return FALSE;

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
        GetLastError() != ERROR_SUCCESS)    // may equal ERROR_NOT_ALL_ASSIGNED
    {
        dwerr = GetLastError();
        CloseHandle(htoken);
        SetLastError(dwerr);
        return FALSE;
    }

    CloseHandle(htoken);
    SetLastError(ERROR_SUCCESS);

    return TRUE;
} //acquirePrivilegeByName()

除了我上面所说的,还有一个关于如何使用上述Win32 API OpenProcess的示例。