WINDOWS核心编程之什么是内核对象(二)

来源:互联网 发布:马化腾有几个孩子知乎 编辑:程序博客网 时间:2024/04/30 05:53
1.进程的内核对象句柄表
当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象不用于用户对象或GDI对象.句柄表它只是个数据结构的数组,每个结构都包含一个指向内核对象的指针,一个访问屏蔽和一些标志.
 
句柄表如图如示
索引
内核对象内存块的指针
访问屏蔽(标志位的DWORD)
标志
1
0x????????
0x????????
0x????????
2
0x????????
0x????????
0x????????
 
当进程第一次被初始化时,它的句柄表是空的,当进程中的线程调用创建内核对象的函数时,内核就为该对象分配一个内存块,并对它初始化。初始化的过程是,内核对进程的句柄表扫描,找一个空项。然后初始化内核对象内存块的指针,访问屏蔽,标志。
 
2.创建内核对象
创建内核对象的函数例如
HANDLE CreateThread(…..)
HANDLE CreateFile(……)
HANDLE CreateFileMapping(……)
HANDLE CreateSemaphore(…….)
这些创建内核对象返回的句柄是放入进程的句柄表中的索引,其用于标识内核对象的信息存入的位置., 在win2000中返回的值用于标识放入进程的句柄表的该对象的字节数,而不是索引号.
 
3.关闭内核对象
BOOL CloseHandle(HANDLE hobj)
此函数首先检查调用进程的句柄表,以确保传递给经的索引用标识一个进程,如果该索引是有效的,那么系统就可以获得内核对象的数据结构的地址,计数等,它会清除进程的句柄表中的项,此时该句柄对你的进程就无效了。如果计数为0,该内核便从内存中撤消该内核对象,如果不为0,也会执行closeahandle操作,计数减1,标识着系统中还有别的进程对此对象进行访问,当其它进程停止使用该对象时(也就是也执行了closehandle操作),该对象将被撤消。
 
Q:如果没有调用CloseHandle函数, 会不会出现内存泄漏呢?
A:这是可能的,当进程终止运行了,系统会自动扫描进程的句柄表,如果在终止进程运行前没有关闭对象,系统将关闭这些对象句柄,如果对象的使用计数为0, 内核便撤消该对象,但如果不为0, 那么就会出现内存泄漏。
 
4.跨越进程边界共享内核对象
这就是说,在不同进程中运行的线程需要共享内核对象.
比如
1:文件映射 在同一台机器上运行的两个进程之间共享数据块
2.管道使得应用程序能够在连风的不同机器上运行的进程之间发送数据块
3.互斥对象,事件使得不同进程中的线程能够同步它们的连续运行,就像一个程序在完成某项任务时需要将情况通知另一个应用程序的情况相同.
 
前一断时间由于工作比较忙,没有来得及更新,请大家见谅
上面只简单的介绍的一些进程的相关知识,后续将详细介绍.(待续)