惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
Engineering at Meta
Engineering at Meta
量子位
A
About on SuperTechFans
阮一峰的网络日志
阮一峰的网络日志
Recent Announcements
Recent Announcements
博客园 - 司徒正美
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
腾讯CDC
Jina AI
Jina AI
C
Check Point Blog
H
Help Net Security
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
爱范儿
爱范儿
I
InfoQ

博客园 - cxun

使用 Sublime Text 将含下划线的字符串批量替换为驼峰命名法格式的字符串 如何使用iTunes与iTools导出微信聊天记录 git 常用命令粗略总结 如何从第三方应用下载广播电台的缓存节目内容 在 Windows 10 中启用 Windows Photo Viewer iOS版微信朋友圈数据库的简要分析 如何将密切好友的微信聊天记录恢复到自己的微信中 Hash工具下载地址 微信聊天记录查看器(程序+源码) - iOS版 XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境 Windows内核开发中如何区分文件对象究竟是文件还是文件夹? 白盒密码入门 Windows Language Packs Downloading Links 使用VirtualBox SDK之初步编译 VirtualBox开发环境的搭建详解 最简单的7z API接口 Chrome的Awesome Screenshot的插件离线下载 Chrome插件安装文件提取方法及 PwdHash Port 的插件下载
[转] win32内核程序中进程的pid,handle,eprocess之间相互转换...
cxun · 2013-05-10 · via 博客园 - cxun

很有用,收下以后方便查询。

原贴地址:http://bbs.pediy.com/showthread.php?t=119193

在win32内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开发效率。

以下就是我自己在实际开发中总结出来的转换方法,在此记录下来,以供需要的朋友参考。

1、pid->handle

OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID clientid;
InitializeObjectAttributes(&ObjectAttributes, 0 ,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
clientid.UniqueProcess = (HANDLE)pid;
clientid.UniqueThread=0;
ZwOpenProcess(&handle, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientid); 
handle即为所求。

2、handle->pid

PROCESS_BASIC_INFORMATION pbi;
ns = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(ProcessBasicInformation), NULL);
pid = pbi.UniqueProcessId; 
pid即为所求。

3、pid->eprocess

PEPROCESS pEProc;
PsLookupProcessByProcessId((HANDLE)pid, &pEProc);
ObDereferenceObject(pEProc); 
pEProc即为所求eprocess的指针。

4、handle->eprocess

暂未发现直接转换的方法,可由handle->pid->eprocess。

5、eprocess->pid

_EPROCESS.UniqueProcessId即为所求,虽然声明类型为HANDLE,但实际上是pid。

6、eprocess->handle

暂未发现直接转换的方法,可由eprocess->pid->handle。

以上方法在Windows XP SP2中验证通过,欢迎大家补充

4、handle->eprocess

暂未发现直接转换的方法,可由handle->pid->eprocess。

这个我来完善吧.

    st = ObReferenceObjectByHandle (ProcessHandle,
                                    PROCESS_TERMINATE,
                                    PsProcessType,
                                    KeGetPreviousModeByThread(&Self->Tcb),
                                    &Process,
                                    NULL);

6、eprocess->handle

暂未发现直接转换的方法,可由eprocess->pid->handle。

这个也完善下.

        Status = ObOpenObjectByPointer(
                    Process,
                    Attributes,
                    &AccessState,
                    0,
                    PsProcessType,
                    PreviousMode,
                    &Handle
                    );