应用程序对象正在关闭_Windows核心编程-内核对象

概念:内核对象可以供系统和应用程序使用来管理各种各样的资源,Windows程序员可以调用Windows API去创建、打开和操作各种内核对象。常见的内核对象有:访问令牌、事件对象、文件对象、文件映射对象、I/O完成端口、作业对象、邮件槽对象、互斥量对象、管道对象、进程对象、信号量对象、线程对象、可等待计时器对象以及线程池工厂对象等。

本质:内核对象本质上是由操作系统内核分配的一个内存块,并且只能由操作系统内核访问(应用程序不能再内存中定位该内存块并直接更改其内容,只能通过Windows提供的一组函数来操作这些结构)。这个内存块的数据结构维护着与对象相关的信息。其中安全描述符和使用计数器是所有内核对象都有的数据成员,但大多数成员都是不同的类型所特有的,例如进程对象的进程ID,文件对象的字节偏移量等。

操作内核对象:通过调用内核对象创建函数(Windows API,如CreateFileMapping)会返回一个内核对象句柄,该句柄的位数与操作系统的位数一致。为了增强操作系统可靠性,句柄与进程相关联(即使句柄值相同,再不同进程间表示的内核对象也是不一样的)。

使用计数:内核对象的所有者是操作系统而非进程,即内核对象的生命周期并不一定会随着创建该对象的进程的消亡而消亡,这一点是通过使用计数来实现的。使用计数是所有内核对象固有的属性,操作系统通过使用计数维护内核对象的生命周期,当使用计数为0的时候,操作系统将销毁该内核对象。内核对象被创建时,其使用计数为1,另一个进程访问该内核对象后,使用计数加1,当进程终止时,使用计数减1。

内核对象安全性:内核对象的安全性是有内核对象的一个叫安全描述符的属性来保证的。创建内核对象的API通常有一个指向SECURITY_ATTRIBUTES结构体的指针作为参数,该结构体描述了谁拥有对象(一般是内核对象的创建者)、哪些组和用户允许被访问和使用此对象、哪些组和用户被拒绝访问此对象。

typedef struct _SECURITY_ATTRIBUTES{

DWORD nlength;//结构体大小

LPVOID lpSecurityDescriptor;//

BOOL bInheritHandle;//

}SECURITY_ATTRIBUTES

进程内核对象句柄表:前面讲过句柄与进程相关联,这是通过进程的句柄表来实现的,进程初始化时,系统将为它分配一个句柄表,用以存在内核对象。可以将句柄表看成一个数组,每个数组成员存放一个句柄的相关信息:指向内核对象的指针、一个访问掩码和一些标志。

10480971202a18f603c85aa0ed034a64.png

创建和关闭内核对象:当进程首次初始化的时候,其句柄表为空,当进程内的一个线程调用一个会创建内核对象的函数时,操作系统将为这个对象分配并初始化一块内存,然后扫描进程的句柄表,查找到一个空白的记录项,填入该内核对象的相关信息,最后返回对象句柄。可以调用CloseHandle来关闭内核对象句柄,该函数首先检查主调进程的句柄表,验证被关闭的对象句柄值是该经常确实有权访问的一个对象,如果句柄有效,系统将获得内核对象的数据结构地址,并将使用计数减1,如果使用计数变为0,内核对象将被销毁,并从内存中除去。一个内核对象不用了应该调用CloseHandle关闭对象,否则程序运行时将泄漏内核对象,当然,当进程终止后,也能保证内核对象被正确清除。

注意内核对象和用对象(GDI对象)的区别:内核对象创建时有安全属性(SECURITY_ATTRIBUTES),而用户对象或GDI对象没有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值