您的位置:首页 > 其它

win32内核程序中进程的pid,handle,eprocess之间相互转换的方法

2016-05-30 16:53 537 查看
很有用,收下以后方便查询。

原贴地址: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
);
http://www.cnblogs.com/cxun/archive/2013/05/10/3070551.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: