| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 474 人关注过本帖, 1 人收藏
标题:win32里,关于获取进程句柄的方法openpeocess总是返回失败
只看楼主 加入收藏
a451410
Rank: 2
等 级:论坛游民
帖 子:132
专家分:98
注 册:2018-3-4
结帖率:83.67%
收藏(1)
 问题点数:0 回复次数:2 
win32里,关于获取进程句柄的方法openpeocess总是返回失败
我对比了任务管理器里面的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]);
    }

}

我的运行结果如图
图片附件: 游客没有浏览图片的权限,请 登录注册
2024-12-21 02:07
a451410
Rank: 2
等 级:论坛游民
帖 子:132
专家分:98
注 册:2018-3-4
收藏
得分:0 
经反复测试,大多数PID确实会返回NULL,但有一部分用户程序是返回正常的,
猜测,应该是系统类的进程不允许被获取,待我用快照方式获取一份对比下
2024-12-21 15:13
时光流逝
Rank: 5Rank: 5
来 自:北京
等 级:职业侠客
威 望:8
帖 子:101
专家分:304
注 册:2019-11-16
收藏
得分:0 
用这个函数:
程序代码:
#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内核编程,你想要相应代码或者驱动文件的话我也可以给你.
前天 20:28
快速回复:win32里,关于获取进程句柄的方法openpeocess总是返回失败
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019601 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved