WINDOWS核心编程--第二章内核对象

什么是内核对象
作为一个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 . 3节“跨越进程边界共享内核对象”中,将要介绍3种
机制,使多个进程能够成功地共享单个内核对象。




除了内核对象外,你的应用程序也可以使用其他类型的对象,如菜单、窗口、鼠标光标、
刷子和字体等。这些对象属于用户对象或图形设备接口( G D I)对象,而不是内核对象。当初
次着手为Wi n d o w s编程时,如果想要将用户对象或G D I对象与内核对象区分开来,你一定会感
到不知所措。比如,图标究竟是用户对象还是内核对象呢?若要确定一个对象是否属于内核对
象,最容易的方法是观察创建该对象所用的函数。创建内核对象的所有函数几乎都有一个参数,
你可以用来设定安全属性的信息,这与前面讲到的C r e a t e F i l e M a p p i n g函数是相同的。
用于创建用户对象或G D I对象的函数都没有P S E C U R I T Y _ AT T R I B U T E S参数。


进程的内核对象句柄表
当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于内核对象,不用于用户对
象或G D I对象。句柄表的详细结构和管理方法并没有具体的资料说明。通常我并不介绍操作系统中
没有文档资料的那些部分。不过,在这种情况下,我会进行例外处理,因为,作为一个称职的
Wi n d o w s程序员,必须懂得如何管理进程的句柄表。由于这些信息没有文档资料,因此不能保证所
有的详细信息都正确无误,同时,在Windows 2000、Windows 98和Windows CE中,它们的实现方
法是不同的。为此,请认真阅读下面介绍的内容以加深理解,在此不学习系统是如何进行操作的。
表3 - 1显示了进程的句柄表的样子。可以看到,它只是个数据结构的数组。每个结构都包
含一个指向内核对象的指针、一个访问屏蔽和一些标志。



如果调用一个函数以便创建内核对象,但是调用失败了,那么返回的句柄值通常是0
(N U L L)。发生这种情况是因为系统的内存非常短缺,或者遇到了安全方面的问题。不过有少
数函数在运行失败时返回的句柄值是-1(I N VA L I D _ H A N D L E _ VA L U E)。例如,如果C r e a t e F i l e
未能打开指定的文件,那么它将返回I N VA L I D _ H A N D L E _ VA L U E,而不是返回N U L L。当查看
创建内核对象的函数返回值时,必须格外小心。特别要注意的是,只有当调用C r e a t e F i l e函数时,
才能将该值与I N VA L I D _ H A N D L E _ VA L U E进行比较。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值