Object Types
从北京回来后的这几天晚上,心血来潮地跟踪了一下 Ob 模块自 ObInitSystem() 开始的近 10 余个函数,有心得,反汇编总结以后再详细的写。
整个对象管理器在从无到有的过程中,第一个被创建的单元是 Type Object Type,之后 Object Types 们被陆续创建,终而形成了一条双向循环链表。链表的长度是 31+1(Win-XP),对应于 31 种对象类型。
在 InitializationPhase0 完全结束以后,ObInitSystem() 开始第二阶段初始化:Root Directory、\KernelObjects、\ObjectTypes、DosDevices(SymbolicLink) 对象被先后创建,同时 Phase0 时形成的对象类型链表被 ObpInsertDirectoryEntry() 顺次插入到 \ObjectTypes 目录中。在第 0 阶段,共有 4 个模块 / 函数创建了 8 个对象类型,如下(按诞生顺序):
nt!ObInitSystem() :
1. "Type" object
2. "Directory" object
3. "SymbolicLink" object
nt!SepTokenInitialization() :
4. "Token" object
nt!PspInitPhase0() :
5. "Process" object
6. "Thread" object
7. "Job" object
nt!DbgkInitialize() :
8. "DebugObject" object
随着跟踪的深入,我发现有许多方法可以定位 / 遍历 Object Types 们 —— "链表法(ObpTypeObjectType etc.)" 和 "数组法(ObpObjectTypes[48])",遂把这几种情况的代码都写了一遍。
So,写一个类似于 WinObj 的程序是不难的~
