【Windows核心编程】之内核对象

本文介绍了Windows内核对象的概念,包括其内存分配、使用计数、安全描述符以及创建和关闭对象的过程。内核对象由操作系统内核管理,其生命周期依赖于使用计数。安全描述符用于控制对象的访问权限,创建时可以指定默认或自定义的安全属性。句柄用于进程内的线程共享,但不适用于跨进程。CloseHandle函数用于关闭对象,不过不一定会立即销毁,必须等到使用计数为0。最后提到了内核对象可能的泄漏问题及检测方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

内核对象是一个内存块,由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员有些事所有内核对象都有的,比如安全描述符和使用计数,有些是独有的。

利用Windows提供的一组函数可以进行对应的操作。

类型

核心对象

产生方法

事件对象

HANDLE CreateEvent();

文件对象

HANDLE CreateFile();

文件映射对象

HANDLE CreateFileMapping();

I/O完成对象

HANDLE CreateIoCompletionPort();

作业对象

HANDLE CreateJobObject();

信箱对象

HANDLE CreateMailslot();

互斥对象

HANDLE CreateMutex();

管道对象

BOOL CreatePipe();

进程对象

BOOL CreateProcess();

信号量对象

HANDLE CreateSemaphore();

线程对象

HANDLE CreateThread();

等待计时器对象

HANDLE CreateWaitableTimer();

使用计数

内核对象的所有者是系统内核,而不是进程。所以进程结束后,内核对象不一定会销毁。内核对象的销毁是根据使用计数来进行的,当对象的使用计数为0时,操作系统内核才会销毁该对象。

安全描述符

安全描述符作为内核对象的一个成员,用来描述谁可以使用此对象,谁又不能使用此对象。一般来说,此参数传NULL,表示具有默认安全性。至于具体默认安全性包括哪些,取决于当前进程的安全令牌。

当然,你也可以分配一个 SECURITY_ATTRIBUTES 给它,进行安全控制。

创建内核对象

具体创建方法可以参照上表。

创建内核对象时会返回一个句柄,这个句柄可以由同一进程中所有线程使用。由于句柄值是作为进程句柄表的索引来使用的,所以这些句柄只与当前进程相关,无法供其他进程使用。否则使用的只是其他进程中只是索引值相同的对象而已,至于类型不确定。

关闭内核对象

CloseHandle 用于关闭内核对象,此时我们的进程不能再访问此对象。但是此对象不一定会销毁,因为使用计数不一定为0。

因此忘记调用CloseHandle不一定会对象泄漏,只有程序运行继续运行时才可能会泄漏内核对象。可以使用Windows任务管理器中进程选项卡中的句柄数来查看是否泄漏。如果发生泄漏,可以使用Process Explorer工具定位泄漏位置。

跨进程共享内核对象

由于内容较多,下一节具体分析。

 

---------------------------------------------------------------------------------------------------------------------------------------------

参考资料:

Windows核心编程(第五版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值