windows核心编程摘抄内 核 对 象

来源:互联网 发布:小学免费教学软件 编辑:程序博客网 时间:2024/06/03 12:20

在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄。


什么是内核对象


作为一个Wi n d o w s软件开发人员,你经常需要创建、打开和操作各种内核对象。系统要创
建和操作若干类型的内核对象,比如存取符号对象、事件对象、文件对象、文件映射对象、
I / O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程

对象和等待计时器对象等。这些对象都是通过调用函数来创建的。


每个内核对象只是内核分配的一个内存块,并且只能
由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成
员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定
的对象类型。例如,进程对象有一个进程I D、一个基本优先级和一个退出代码,而文件对象则
拥有一个字节位移、一个共享模式和一个打开模式。
由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构
并直接改变它们的内容。M i c r o s o f t规定了这个限制条件,目的是为了确保内核对象结构保持状
态的一致。这个限制也使M i c r o s o f t能够在不破坏任何应用程序的情况下在这些结构中添加、删
除和修改数据成员。



内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建
内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对
象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另
一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建
该对象的进程长。


用于创建内核对象的所有函数均返回与进程相关的句柄,这些句柄可以被在相同进程中运
行的任何或所有线程成功地加以使用。该句柄值实际上是放入进程的句柄表中的索引,它用于
标识内核对象的信息存放的位置。因此当调试一个应用程序并且观察内核对象句柄的实际值时,
会看到一些较小的值,如1,2等。请记住,句柄的含义并没有记入文档资料,并且可能随时变
更。实际上在Windows 2000中,返回的值用于标识放入进程的句柄表的该对象的字节数,而不
是索引号本身。
每当调用一个将内核对象句柄接受为参数的函数时,就要传递由一个 C r e a t e * &函数返回的
值。从内部来说,该函数要查看进程的句柄表,以获取要生成的内核对象的地址,然后按定义
得很好的方式来生成该对象的数据结构。
如果传递了一个无效索引(句柄),该函数便返回失败,而 G e t L a s t E r r o r则返回 6
(E R R O R _ I N VA L I D _ H A N D L E)。由于句柄值实际上是放入进程句柄表的索引,因此这些句柄
是与进程相关的,并且不能由其他进程成功地使用。
如果调用一个函数以便创建内核对象,但是调用失败了,那么返回的句柄值通常是 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
原创粉丝点击