2.全局句柄表
kd> dt _HANDLE_TABLE
nt!_HANDLE_TABLE+0x000 TableCode : //指向句柄表的存儲結構+0x004 QuotaProcess : _EPROCESS//句柄表記錄的內存資源記錄在此進程中+0x008 UniqueProcessId : Void//創(chuàng)建進程的ID,用于回調函數+0x00c HandleTableLock : [4] _EX_PUSH_LOCK//句柄表鎖 (僅在句柄表拓展時使用)+0x01c HandleTableList : _LIST_ENTRY //所有句柄表形成一個鏈表,鏈表頭為全局變量HandleTableListHand+0x024 HandleContentionEvent : _EX_PUSH_LOCK//若在訪問句柄表時發(fā)生競爭,則在此推鎖上等待+0x028 DebugInfo : //調試信息,當調試句柄時才有意義+0x02c ExtraInfoPages : //審計信息所占用的頁面數量+0x030 FirstFree : //空閑鏈表表頭的句柄索引+0x034 LastFree : //最近被釋放的句柄索引,用于FIFO類型空閑鏈表+0x038 NextHandleNeedingPool : //下一次句柄表拓展的起始句柄索引+0x03c HandleCount : //正在使用的句柄表項的數量+0x040 Flags : //標志域+0x040 StrictFIFO : //是否使用FIFO風格的重用,既先釋放先重用
所有的進程和線程無論無論是否打開,都在這個表中。 每個進程和線程都有一個唯一的編號: PID和CID 這兩個值其實就是全局句柄表中的索引。
進程和線程的查詢,主要是以下三個函數,按照給定的PID或CID從PspCidTable從查找相應的進線程對象:
PsLookupProcessThreadByCid() PsLookupProcessByProcessld() PsLookupThreadByThreadld() ... 其實這些函數就是遍歷全局句柄表PspCidTable如果TableCode低2位為0,最多512個對象(超過就變表)
TableCode低2位為1,第一級可以存1024個地址,第二級存儲的才是真正的句柄信息,最多存512 * 1024 (超過就變表)
TableCode低2位為2,第一級地址,第二級也是地址,第三級才是句柄信息。最多存512 * 1024 * 1024
觀察句柄表
通過PID的值,在PspCidTable中找到內核對象
我進程開的比較少TableCode低2位為0,只有一頁。
1732對應的16進制就是6c4,6c4/4=1b1
全局句柄表,和進程的句柄表不同它的后4位清0直接就該結構地址,其他不變
總結