当一个进程被初始化时,系统会为它分配一个句柄表。该句柄表只用于内核对象(简单的说就是由CreateFile, CreateMutex, CreateXXXX这类函数创建的对象),不用于用户对象或G D I 对象。
下表显示了进程的句柄表的样子,它是个数据结构的数组。每个结构都包含一个指向内核对象的指针、一个访问屏蔽和一些标志。
索引 | 内核对象内存块的指针 | 访问屏蔽(标志位的D W O R D ) | 标志(标志位的D W O R D ) |
1 | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? |
2 | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? |
... | ... | ... | ... |
创建内核对象时获得的HANDLE值 如hFile, 进行右移2位(hFile>>2),得到的即是表中的索引值,所以调试程序时常看到句柄值为偶数结尾。不同进程中直接传递HANDLE是无意义的, 内核对象的内存指针并没有传递过去。