Windows核心编程(三)内核对象

本文介绍了Windows内核对象,包括其创建、句柄、使用计数、安全描述符和跨进程共享。内核对象由操作系统分配,通过API访问,使用句柄标识。句柄是进程句柄表的索引,安全描述符描述对象访问权限。内核对象可被多个进程共享,使用计数管理对象生命周期。创建命名内核对象可以实现跨进程共享,DuplicateHandle函数用于复制对象句柄。
摘要由CSDN通过智能技术生成

1、内核对象:

通过API来创建,每个内核对象是一个数据结构,对应一块内存,由操作系统内核分配,并且只能由操作系统内核访问。在此数据结构中少数成员(如安全描述符和使用计数)是所有对象都有的,但其他大多数成员都是不同类型的对象特有的。

例如,进程对象有一个进程ID、一个基本的优先级和一个退出代码;文件对象有一个字节偏移量、一个共享模式和一个打开模式。

2、内核对象的数据结构只能由操作系统提供的API访问,应用程序在内存中不能访问。调用创建内核对象的函数后,该函数会返回一个句柄,它标识了所创建的对象。它可以由进程的任何线程使用。在32位系统中句柄是一个32位值。64位系统中则是64位值。

3、句柄仅仅是独立于每个进程的句柄表的一个索引。在每个进程中都存在一个句柄表,列出了所有本进程内可以使用的句柄。它只是一个有数据结构组成的数组,每个结构都包含一个指向内核对象的指针、访问掩码、继承标识等,而句柄仅仅是句柄表数组的下标。

由于每个进程都存在句柄表,因此句柄是独立于进程的,虽然将一个进程的句柄传给另一个进程不一定会失败,但是它引用的是另一个进程完全不同的内核对象。

4、使用计数:
内核对象的所有者是操作系统内核,而非进程。即多个进程可以共享一个内核对象。内核对象数据结构内有一个使用计数成员,它是所有对象都有的一个成员,标识该内核对象被引用的次数。刚创建时使用计数被初始化为1,如果有另一个进程获得对此内核对象的访问后,使用计数就会递增。一个使用此内核对象的进程终止后或是对此内核对象调用CloseHandle,操作系统内核会自动递减内核对象的使用计数。一旦计数变为0,操作系统内核就会销毁对象。

5、安全描述符SD:
用以描述内核对象的安全性。它描述了内核对象的拥有者,那组用户可以访问此对象,那组用户无访问权限。安全描述符对应一个数据结构:SECURITY_ATTRIBUTES结构,几乎内核对象在创建时都需要传入此结构,但是大部分情况下都是传入NULL,表示使用默认的安全性。

6、除了使用内核对象,应用程序还需要使用其他类型的对象,如菜单、窗口、鼠标光标等,这些属于用户对象或GDI对象,而非内核对象。要判断一个对象是不是内核对象,最简单的方法就是查看创建这个对象的函数,几乎所有的创建内核对象的函数都需要指定安全属性信息的参数,而用于创建用户对象的函数都不需要使用安全描述符。

7、一个进程在刚被创建时,它的句柄表是空的。当进程内的一个线程调用创建内核对象的函数时,内核将为这个对象分配并初始化一个内存块,然后扫描进程的句柄表,查找一个空白的记录项,并对其进行初始化。指针成员将会被初始化为内核对象的地址,继承标志也会被设置。

例如:一些用于创建内核对象的函数:
1)HANDLE CreateThread( );
2)HANDLE CreateFile( );
3)HANDLE CreateFileMapping( );
4)HANDLE Creat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值