win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
2015-04-22 20:33
435 查看
转载自:http://www.pediy.com/kssd/pediy11/119193.html
在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
);
在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
);
相关文章推荐
- [转] win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
- win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
- 内核程序中进程的pid,handle,eprocess之间相互转换的方法
- 内核程序中进程的pid,handle,eprocess之间相互转换的方法
- 关于数组和List之间相互转换的方法
- 数组和List之间相互转换的方法
- 对Java字符串与整形、浮点类型之间的相互转换方法总结
- Vscode DOS和UNIX脚本文件之间相互转换的多种方法
- C# DataTable 和List之间相互转换的方法
- jQuery对象和DOM对象之间相互转换的方法介绍
- [转]字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- 微信小程序--页面之间相互传递数据方法
- C# DataTable 和List之间相互转换的方法
- C#实现XML与实体类之间相互转换的方法(序列化与反序列化)
- 关于数组和List之间相互转换的方法
- Long和Date数据类型之间相互转换代码 - 调整时间推前往后,截取long型日期方法。
- [java]关于数组和List之间相互转换的方法
- 内核驱动程序中获取当前用户进程的进程名的方法
- C# DataTable 和List之间相互转换的方法
- 关于数组和List之间相互转换的方法