先来一张图。下面文字参考《 Undocumented Windows 2000 Secrets》
四
1. Dispatcher 对象 此类对象位于系统的最底层,在它们的对象体的开始处都有一个共享
的公共数据结构 ----DISPATCHER_HEADER (参见列表 7-1 )。在它们的对象头中包含一个对象类型 ID 和对象体的长度(保存在 32 位的 DWORD 变量中)。所有 Dispatcher 对象结构体的名字都以字母 K 开始,这表示它们是内核( Kernel )对象。 DISPATCHER_HEADER 结构的存在使得对象是 “ 可等待的( waitable ) ” 。这意味着,此种类型的对象可以被传递给同步函数 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() , Win32 函数 WaitForSingleObject() 和 WaitForMultipleObjects() 就构建于它们之上。
2. I/O 系统数据结构( I/O 对象) 这类对象是最高层的对象,其对象体的开始位置是一个 SHORT 类型的成员,该成员用来标识该对象的 ID 。通常,此 ID 之后还有一个 SHORT 或 WORD 类型的成员用来记录对象体的大小。不过,此类对象并不都遵守这一规则。
3. 其他对象 不属于上述两种对象的对象。
从现在起就要注意 Dispatcher 对象和 I/O 对象的类型 ID ,因为这些 ID 都是单独维护的,所以有些 ID 可能会发生重复。表 7-1 给出了我所知道的 Dispatcher 对象的类型。
表 7-1. Dispatcher 对象汇总 ID |
类 型 |
C 结构 |
定 义 |
|
0 |
DISP_TYPE_NOTIFICATION_EVENT |
KEVENT |
ntddk.h |
|
1 |
DISP_TYPE_SYNCHRONIZATION_EVENT |
KEVENT |
ntddk.h |
|
2 |
DISP_TYPE_MUTANT |
KMUTANT,KMUTEX |
ntddk.h |
|
3 |
DISP_TYPE_PROCESS |
KPROCESS |
w2k_def.h |
|
4 |
DISP_TYPE_QUEUE |
KQUEUE |