2.全局句柄表

  1. 所有的进程和线程无论无论是否打开,都在这个表中。
  2. 每个进程和线程都有一个唯一的编号: PID和CID 这两个值其实就是全局句柄表中的索引。

进程和线程的查询,主要是以下三个函数,按照给定的PID或CID从PspCidTable从查找相应的进线程对象:

PsLookupProcessThreadByCid()
PsLookupProcessByProcessld()
PsLookupThreadByThreadld()
...
其实这些函数就是遍历全局句柄表PspCidTable

如果TableCode低2位为0,最多512个对象(超过就变表)
2.全局句柄表

TableCode低2位为1,第一级可以存1024个地址,第二级存储的才是真正的句柄信息,最多存1024*512=524288 (超过就变表)
2.全局句柄表

TableCode低2位为2,第一级地址,第二级也是地址,第三级才是句柄信息。最多存10241024512=536870912
2.全局句柄表
其实我们平时根本不需要这么多。

观察句柄表

通过PID的值,在PspCidTable中找到内核对象

我进程开的比较少TableCode低2位为0,只有一页。
2.全局句柄表

2.全局句柄表

1732对应的16进制就是6c4,6c4/4=1b1
2.全局句柄表

全局句柄表,和进程的句柄表不同它的后4位清0直接就该结构地址,其他不变
2.全局句柄表