windows内核对象句柄
内核对象用于管理进程、线程和文件等诸多种类的大量资源,每一个内核对象都只是一个句内存快,它由操作系统内核分配,并只能右操作系统内核访问。这个内存块是一个数据结构,其维护着与对象相关的信息,其中少数成员是所有对象都有的,其他大多数都是不同类型的对象特有的。
由于内核对象只能由操作系统内核访问,因此windows提供了句柄来标识内核对象,对于应用程序来说,这个句柄就相当于这个内核对象。应用程序创建一个内核对象,就会返回对应的句柄,然后可以以这个句柄作为参数,去调用操纵和关闭内核对象的函数。
操作系统内核通过记录内核对象的使用计数,来维护内核对象的生存周期。初始创建的内核对象使用计数被设置为1,当其他进程获得对现有内核对象的访问后,使用计数就会递增,当其他进程主动关闭内核对象或者退出进程时,使用计数递减,当使用计数减为0时,操作系统内核就会销毁该对象。
为了维护内核对象的安全性,windows提供了安全描述符来记录谁拥有对象,哪些组和用户被允许访问或者使用对象,哪些组和用户被拒绝访问此对象。因此,几乎所有创建时提供了SECURITY_ATTRUBUTES(这个结构体包含了安全描述符对象指针)作为指针参数的对象,都是内核对象。
每个进程在初始化时,系统都为它分配了一个句柄表,这个句柄表仅供内核对象使用,我们称其为进程内核对象句柄表。
一个进程内核对象句柄表(简称进程的句柄表),只是一个数组,这个数组的每个元素都是一个结构体的指针,这个结构体包含了一个内核对象的指针、一个访问掩码和一些标志。
当进程创建一个内核对象时,操作系统内核将为这个内核对象分配一块内存,然后扫描这个进程的句柄表,找出一个空项,这个空项的内核对象指针会指向这个内核对象内部数据结构的地址,访问掩码会被设置成拥有的完全访问权限,标志也会被设置。
创建内核对象的函数返回的内核对象句柄,实质上就是进程句柄表中的索引的映射(由一个句柄获取索引的方式为用句柄的值除以4或者右移两位,以忽略句柄表中前面几个windows内核占用的索引(待参考))。因此,跨进程之间对同一个内核对象的共享,不能简单的传递这个句柄值去共享,因为它是和进程的句柄表相关的。
windows内核对象句柄的更多相关文章
- Windows进程的内核对象句柄表
当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象 ,不用于用户对象或GDI对象. 创建内核对象 当进程初次被初始化时,它的句柄表是空的.然后,当进程中的线程调用创建内核对象的函数 ...
- 【Windows 操作系统】Windows 进程的内核对象句柄表
总结: 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的.一个内核对象可用有多个句柄.Windows之所以要设立句柄,根本上源于内存管 ...
- 【Windows 操作系统】 内核对象|句柄
内核对象简介 内核对象就是 一些数据结构该结构用来描述存储内核中的一个内存块中的数据信息. 内存块是一种数据结构,其中的数据成员负责维护该对象的相应信息,这个数据结构以及其中的数据成员只能由内核访 ...
- (转)WINDOWS内核对象
WINDOWS内核对象 原文地址:http://blog.csdn.net/misterliwei/article/details/976988 支持原创 一.前言 Windows中有很多像进程对象 ...
- 内核对象&句柄&泄漏&检测
今天看到这个问题如何评价王垠的 <讨厌的 C# IDisposable 接口>? - 王垠(人物),答案被歪到windows 内核对象和句柄,答案中谈的太浅显而且有误.翻出陈年老文章(此文 ...
- 内存块是一种数据结构,内核对象&句柄
内核对象&句柄 目录 1 内核对象的概念 2 内核对象的使用计数 3 句柄 4 句柄表 项目工程代码中设计句柄的使用,一时不知句柄是何物,通过查阅自学之后,对句柄及其使用有一个初步的了解. ...
- Windows内核对象
1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...
- windows内核对象管理学习笔记
目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object ...
- 内核对象&句柄
目录 1 内核对象的概念 2 内核对象的使用计数 3 句柄 4 句柄表 项目工程代码中设计句柄的使用,一时不知句柄是何物,通过查阅自学之后,对句柄及其使用有一个初步的了解.分享出来,算是抛砖引玉吧 ...
随机推荐
- mysql 查询某字段里含有(或者不含)某字符的所有记录方法(转)
select gid, username from users where FIND_IN_SET(8,gid); //查询gid里含有数字8的记录,gid是varchar ,数据格式:"1 ...
- machine learning in action , part 1
We should think in below four questions: the decription of machine learning key tasks in machine lea ...
- 线段树---HDU1394Minimum Inversion Number
此题和上题略有不同,但是大体差不多,不过要把题意转换过来,题目大体意思为, 输入n, 也就是n个数,这些数为0 - (n-1), 这些数刚开始给定输入的顺序, 然后求他的逆序数,然后接着把第一个移到这 ...
- codevs 3693 数三角形
/* n*m个点中选3个 再排除三点共线 共线分两类 1 在横线或者竖线上 m*C(n,3) n*C(m,3) 2 在对角线上 这个比较麻烦 以为对角线和矩阵是一一对应的 我们转化成求矩阵 并且保证有 ...
- 03-StreamReader和StreamWriter的案例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- dl标签和table标签
dl标签定义了一个定义列表 <html> <body> <h2>一个定义列表:</h2> <dl> <dt>计算机</ ...
- java的final变量理解
java的final变量理解 final基本类型是数值不能改变 final对象是引用不能改变,对象其自身是可以被修改的.
- JAVA-2-GetDay
import java.util.*; public class Ch0310 { public static void main(String[] args) { // TODO 自动生成的方法存根 ...
- 1.3.1 switch 语句中的 String
switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...
- php经典面试题
1. 用PHP打印出前一天的时间,打印格式是2007年5月10日 22:21:21 2. PHP代码如下:$a="hello"; $b=&$a;unset($b);$b=& ...