zoukankan      html  css  js  c++  java
  • [Windows驱动开发] 进程的pid handle eprocess之间相互转换的方法

    在内核程序开发中,我们常常需要取得某进程的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); 





    2、handle->pid

    PROCESS_BASIC_INFORMATION pbi;
    ns = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(ProcessBasicInformation), NULL);
    pid = pbi.UniqueProcessId; 





    3、pid->eprocess

    PEPROCESS pEProc;
    PsLookupProcessByProcessId((HANDLE)pid, &pEProc);
    ObDereferenceObject(pEProc); 




    4、handle->eprocess

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




    5、eprocess->pid

    _EPROCESS.UniqueProcessId




    6、eprocess->handle

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




    总结:
    这是句柄、句柄表、对象三者间的关系。
    PspCidTable是全局的句柄表,用来存放进程、线程对象体,通过进、线程的pid作为索引可以在PspCidTable句柄表中找到pid所属进、线程的对象体(既EPROCESS或ETHREAD)。
    其次,在进程内部,以handle作为索引,可以在进程的句柄表(ObjectTable)中找到handle代表的对象头,对象头+0x18就可得到对象体。以上内容全部可以通过在windbg下验证。 

  • 相关阅读:
    css文字换行问题white-space:pre-line或者white-space:pre-wrap,解决word-wrap:break-word解决不了的
    ie浏览器检测不到cookie的问题
    jQuery ajax在IE浏览器的跨域问题--jquery.xdomainrequest.min.js
    移动端 input 获取焦点后弹出带搜索、确定、前往的键盘,以及隐藏系统键盘
    三个获取浏览器URL中参数值的方法
    上传文件时文件类型限制 <input id="File1" type="file" accept=""/>
    ES6 let和const 的相同点与区别
    html页面中的title设置为空格
    vue 之 key
    nginx 之 proxy_pass详解
  • 原文地址:https://www.cnblogs.com/csnd/p/15613295.html
Copyright © 2011-2022 走看看