Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84970
  • 博文数量: 34
  • 博客积分: 1640
  • 博客等级: 上尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 14:37
文章分类
文章存档

2008年(34)

我的朋友
最近访客

分类: WINDOWS

2008-04-21 10:52:44

Kernel Objects是一种由操作系统所管理的数据结构而已。这些结构存储的是系统对象的相关信息。常见的Kernel Objects有process, thread, file, mutex等。这些对象有操作系统进行统一的管理。作为用户来说,我们只能创建这些对象,然后通过指向他们的指针,也就是所谓的Handles来间接的进行操作。

这里需要注意Objects和Handle的区别。Objects是属于整个操作系统的,而Handles是相对于process而言,也就是说不同的processes拥有不同的handles,但是这些handles可以指向相同的objects。

由于objects会占用系统的资源,我们必须通过一定的方式来对其进行分配以及释放。而不同的进程都可能使用这些objects,所以Windows使用了usage counting的技术对这些对象进行管理。只有当objects的usage count==0时,系统才会释放这些对象所占用的资源。

很显然,对于资源来说,我们常常需要对其进行安全的控制,也就是那些进程可以对这些资源进行存取操作,那些进程有不能存取他们。Windows为每个kernel objects都关联了一个security descriptor。当我们创建这些对象的时候,我们可以指定这些对象的安全级别。每个创建kernel objects的函数,都有一个指向SECURITY_ATTRIBUTES的指针参数。
typedef struct _SECURITY_ATTRIBUTES {
   DWORD nLength;
   LPVOID lpSecurityDescriptor;
   BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
只要我们创建一个SECURITY_ATTRIBUTES对象,然后将其传递给创建kernel objects的函数就可以了。

在Windows中,每个进程都有一个kernel object handle table。这个table存放的就是该进程可以存取的kernel object的指针,以及一些其他信息,比如access mark等。对这些信息的存储,使用的应该就是一个数组而已吧(结构数组)。当我们创建一个kernel object时,系统就会在该进程的table存储一项handle的信息。从实现来看,这个handle的值其实也就是该table的索引而已。当我们存取一个handle的时候,系统就以该handle为索引,从table中取得对应的kernel object的地址,然后就对实际的kernel object进行处理了。另外,需要注意的是,当我们结束了对kernel objects的处理之后,应该使用函数CloseHandle关闭该handle,这样就会将对应kernel object的usage count减1。

对于Kernel Objects来说,一个很重要的任务就是要在不同的process之间进行共享。我们可以通过三种方法来实现。一是利用object handle inheritance。这种技术只能在具有父子关系的进程之间共享kernel objects。另一种就是利用Named Objects。也就是在创建kernel objects的时候,对该object指定一个名字。由于kernel objects的名字是有系统统一管理的。如果其他进程需要共享某个kernel objects的话,它只需创建一个同名的对象就可以了。第三种技术就是利用Duplicating object handles。这项技术是通过函数DuplicateHandle来实现的。其功能就是复制原进程的一个kernel object的handle到目标进程中。这样目标进程就可以共享该kernel Object了。

这章还将了三种在进程之间传递信息的方法。
1. 利用控制台参数
2. 利用环境变量
3. 利用进程间通信的机制。
但是方法1,2只能在创建进程的时候给该进程传递一些信息,而方法3可以在某个进程运行的过程中给其传递信息。



阅读(2070) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~