《Windows核心编程 5th》读书笔记------第3章 内核对象

何为内核对象?

每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员维护着与对象相关的信息。由于内核对象的数据结构只能由操作系统内核访问,所以应用程序不能在内在中定位这些数据结构并直接更改其内容。应用程序想要操纵这些内核对象,可以利用Windows提供的一组函数。

调用一个会创建内核对象的函数后,函数会返回一个句柄(handle),它标识了所创建的对象。可以将这个句柄对象想象为一个不透明的值,它可由进程的任何线程使用。在 32位Windows进程中,句柄是一个32位值;在64位Windows进程中,则是一个64值,我们可以将这个句柄传给各种Windows函数,从而对它进行操作。


使用计数

内核对象的所有者是操作内核,而非进程。换言之,如果我们的进程调用一个函数来创建一个内核对象,然后进程终止运行,则内核对象并不一定会销毁。大多数情况下,这个内核对象是会销毁的,但假如另一个进程正在使用我们的进程创建的内核对象,那么在其他进程停止使用它之前,它是不会销毁的。总之,内核对象的生命期可能长于创建的那个进程。

操作系统内核知道当前有多少个进程正在使用一个特定的内核对象,因为每个对象都包含一个使用计数。初次创建一个对象的时候,其使用计数被设为1。另一个进程获得对现有内核对象的访问后,使用计数会递增。进程终止运行后,操作系统内核将自动递减此进程仍然打开的所有内核对象的使用计数。如果一旦对象的使用计数变成0,操作系统内核就会销毁该对象。


进程内核对象句柄表

一个进程在初始化时,系统将为它分配一个句柄表。这个句柄表仅供内核对象使用,不适用于用户对象或GDI对象。


跨进程边界共享内核对象:

可以利用三种不同的机制来允许进程共享内核对象:使用对象继承,为对象命名,复制对象句柄

关于对象继承,此前已经写过一篇读书笔记:http://blog.csdn.net/gzzheyi/article/details/7777202



你可能感兴趣的:(《Windows核心编程 5th》读书笔记------第3章 内核对象)