内核对象

来源:互联网 发布:耦合器端口区分 编辑:程序博客网 时间:2024/04/30 05:32

1、与用户对象的区别

内核对象如:时间、文件映射、文件、邮件槽、互斥量、管道、进程、线程、信号量等。

与用户对象如:菜单、图标、窗口、光标、刷子、字体等

 

最明显的区别:创建时有内核对象一般具有安全属性,缺省NULL表示只有管理员和创建该内核对象的创建者可以访问,其他都不能访问

 

2、内核对象归属

属于系统而不是进程,通过计数来决定是否销毁/释放。所有对象的创建都返回一个进程相关的句柄(不同进程的不同对象句柄值是可以相同的)

 

3、错误检查

一般内核对象创建失败,返回的句柄值通常是0/NULL,可能的原因是内存太少或者安全问题。但是有几个返回-1(INVALID_HANDLE_VALUE),所以要仔细查看MSDN

 

4、关闭内核对象

一般调用CloseHandle,使得计数减1,内核判断为计数为0后,内核会释放该内核对象。但是某些新的函数可能不需要用户来调用CloseHandle了,看MSDN吧。

 

5、进程间共享内核对象:

  1)设置当前进程中内核对象安全属性可以继承,然后创建子进程(传递继承参数为true),子进程会使得内核对象计数加1。在创建子进程时,把当前所有可继承的内核对象复制了一份。句柄值可以通过参数、消息、环境变量等方式让子进程知道。还可以通过GetHandleInformation和SetHandleInformation来设置句柄的临时的继承属性、是否允许被关闭等。

  2)创建命名的内核对象。相关函数:Create...   Open...,通过GetLastError判断是否已经存在等。

  3)复制对象句柄(DuplicateHandle),特殊用法:复制到当前进程来增加一下计数

 

 

 

原创粉丝点击