内核对象

来源:互联网 发布:英格拉姆全明星后数据 编辑:程序博客网 时间:2024/04/30 04:43

 

3.1 什么是内核对象

作为一个Wi n d o w s软件开发人员,你经常需要创建、打开和操作各种内核对象。系统要创

建和操作若干类型的内核对象,比如存取符号对象、事件对象、文件对象、文件映射对象、

I / O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程

对象和等待计时器对象等。这些对象都是通过调用函数来创建的。例如, C r e a t e F i l e M a p p i n g函

数可使系统能够创建一个文件映射对象。每个内核对象只是内核分配的一个内存块,并且只能

由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成

员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定

的对象类型。例如,进程对象有一个进程I D、一个基本优先级和一个退出代码,而文件对象则

拥有一个字节位移、一个共享模式和一个打开模式。

由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构

并直接改变它们的内容。M i c r o s o f t规定了这个限制条件,目的是为了确保内核对象结构保持状

态的一致。这个限制也使M i c r o s o f t能够在不破坏任何应用程序的情况下在这些结构中添加、删

除和修改数据成员。

如果我们不能直接改变这些数据结构,那么我们的应用程序如何才能操作这些内核对象

呢?解决办法是,Wi n d o w s提供了一组函数,以便用定义得很好的方法来对这些结构进行操作。

这些内核对象始终都可以通过这些函数进行访问。当调用一个用于创建内核对象的函数时,该

函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个不透明值,你的进程中的任何

线程都可以使用这个值。将这个句柄传递给Wi n d o w s的各个函数,这样,系统就能知道你想操

作哪个内核对象。本章后面还要详细讲述这些句柄的特性。

 

3.1.1 内核对象的使用计数

内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建

 

内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对

象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另

一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建

该对象的进程长。

内核知道有多少进程正在使用某个内核对象,因为每个对象包含一个使用计数。使用计数

是所有内核对象类型常用的数据成员之一。当一个对象刚刚创建时,它的使用计数被置为1。

然后,当另一个进程访问一个现有的内核对象时,使用计数就递增1。当进程终止运行时,内

核就自动确定该进程仍然打开的所有内核对象的使用计数。如果内核对象的使用计数降为0,

内核就撤消该对象。这样可以确保在没有进程引用该对象时系统中不保留任何内核对象。

3.1.2 安全性

内核对象能够得到安全描述符的保护。安全描述符用于描述谁创建了该对象,谁能够访问

或使用该对象,谁无权访问该对象。安全描述符通常在编写服务器应用程序时使用,如果你编

写客户机端的应用程序,那么可以忽略内核对象的这个特性。

Windows 98 根据原来的设计, Windows 98并不用作服务器端的操作系统。为此,

M i c r o s o f t公司没有在Windows 98中配备安全特性。不过,如果你现在为Windows 98

设计软件,在实现你的应用程序时仍然应该了解有关的安全问题,并且使用相应的访

问信息,以确保它能在Windows 2000上正确地运行

用于创建内核对象的函数几乎都有一个指向S E C U R I T Y AT T R I B U T E S结构的指针作为其

参数,下面显示了C r e a t e F i l e M a p p i n g函数的指针: