注册 登录
编程论坛 C语言论坛

win32里,关于获取进程句柄的方法openpeocess总是返回失败

a451410 发布于 2024-12-21 02:07, 534 次点击
我对比了任务管理器里面的PID,确认了第一步里PID是获取的正确的,
但是通过PID用openprocess获取进程句柄的时候总是返回NULL,
32和64都试了不行,管理员权限运行也不行,迷茫的,望大佬解答.下面是代码
程序代码:
//遍历进程并初始化进程信息到livstView
VOID  EPinitLISTV_Process_1()
{
//第一,枚举所有进程的PID--------------------------------------------------------
   
//枚举遍历进程的pid,放入procPID数组中
    DWORD procPID[1024];//存放pid的数组
    DWORD procSize = sizeof(procPID);//pid数组的字节大小
    DWORD procByteNum;//遍历出来的字节数
    DWORD procNum;//进程数
    int a;
    a = EnumProcesses(procPID, procSize, &procByteNum);
    procNum = procByteNum / sizeof(DWORD);
    DBG("枚举返回值 = %d\n", a);
    DBG("进程字节数 = %d\n", procByteNum);
    DBG("进程数 = %d\n", procNum);

//第二,通过PID获取进程的句柄------------------------------------------------------
   
//DBG("%x\n", OpenProcess(PROCESS_ALL_ACCESS, FALSE, procPID[10]));
   
//通过PID的到进程的句柄
    HANDLE* procHandle = (HANDLE*)malloc(procNum*(sizeof(HANDLE)));//存放进程句柄的缓冲区
    for (size_t i = 0; i < procNum; i++)
    {
        procHandle[i] = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procPID[i]);
        if (procHandle[i] == NULL)
        {
            DBG("获取进程句柄失败!\n");
            //return;
        }
        DBG("PID = %d = %08x\n", procPID[i], procHandle[i]);
    }

}

我的运行结果如图
只有本站会员才能查看附件,请 登录
2 回复
#2
a4514102024-12-21 15:13
经反复测试,大多数PID确实会返回NULL,但有一部分用户程序是返回正常的,
猜测,应该是系统类的进程不允许被获取,待我用快照方式获取一份对比下
#3
时光流逝2025-03-24 20:28
用这个函数:
程序代码:

#include <windows.h>
#include <stdio.h>

//成功返回TRUE,失败返回FALSE
BOOL AdjustPrivilege(LPCWSTR PrivilegeName) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    LUID luid;
    BOOL ret;

    // 获取当前进程的访问令牌
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        printf("OpenProcessToken failed. Error: %u\n", GetLastError());
        return FALSE;
    }

    // 获取指定权限的 LUID
    if (!LookupPrivilegeValueW(NULL, PrivilegeName, &luid)) {
        printf("LookupPrivilegeValue failed. Error: %u\n", GetLastError());
        CloseHandle(hToken);
        return FALSE;
    }

    // 填充 TOKEN_PRIVILEGES 结构
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    // 调整令牌特权
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {
        printf("AdjustTokenPrivileges failed. Error: %u\n", GetLastError());
        CloseHandle(hToken);
        return FALSE;
    }

    CloseHandle(hToken);
    return TRUE;
}

然后再以管理员权限运行你的程序应该就行了.
如果还是有获取句柄失败的进程,那你可能需要编写驱动来完成这件事,这涉及windows内核编程,你想要相应代码或者驱动文件的话我也可以给你.
1