查看文章 |
本来偶在学习内核线程调度的东西,发现里面有关于HANDLE_TABLE的知识.于是参照WRK把附带的一些东西深入学习了一下子--关于PsLookupProcessByProcessId的执行流程[写点心得存档,供以后学习的同学参考.老鸟飘过~] ![]() EXHANDLE 是一个union, 其中的 Index 即是 GenericHandleOverlay 的低30位.这个检查是确保 2~10这9位存在,即3层表的0级的索引存在. 然后该函数调用 ExpLookupHandleTableEntry 函数,同样为此函数传递上面的2个参数,不过此时的第2个参数已经转换成另一种形式----EXHANDLE结构了.此函数做的工作才是重点,它负责通过索引在这个句柄3层表中寻找到指定的进程对象 [关于它的内部实现细节及注释过程, 句柄3层表,一些结构体。见附件] 最终它返回一个 HANDLE_TABLE_ENTRY 的地址,里面的前4字节包含了指定进程的对象地址. ----> 返回到 ExMapHandleToPointer 函数中后,此函数获得控制权,便接着往下执行.它会调用 ExpLockHandleTableEntry 来锁定当前的 handle table entry (InterlockedCompareExchangePointer ---->InterlockedCompareExchange).如果不成功或者ExpLookupHandleTableEntry返回结果为0,则可能是进程句柄处于被调试状态, 通过 HANDLE_TABLE 结构中的 DebugInfo 来判断当前句柄是否处于被调试状态. 若是,则调用 ExpUpdateDebugInfo 函数填充 HANDLE_TRACE_DEBUG_INFO 结构体以保存当前的调试信息; 否则返回NULL,调用失败. 当函数调用成功时,便返回从ExpLookupHandleTableEntry得到的HANDLE_TABLE_ENTRY 的地址. ----> 这样就回到了PsLookupProcessByProcessId函数中,它将 HANDLE_TABLE_ENTRY 中的Object转化为EPROCESS类型,确保这个对象是ProcessObject且有继承权限,将此对象的计数+1:
------------------------------------------------------------------------------------- |



