在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。
补:
st = ObReferenceObjectByHandle (ProcessHandle, PROCESS_TERMINATE, PsProcessType, KeGetPreviousModeByThread(&Self->Tcb), &Process, NULL);
Process即所求.
5、eprocess->pid
_EPROCESS.UniqueProcessId即为所求,虽然声明类型为HANDLE,但实际上是pid。
6、eprocess->handle
//暂未发现直接转换的方法,可由eprocess->pid->handle。
补:
Status = ObOpenObjectByPointer( Process, Attributes, &AccessState, 0, PsProcessType, PreviousMode, &Handle );
Handle即所求.
本文转自: http://bbs.pediy.com/showthread.php?t=119193