内核对象

何为内核对象

令牌对象、事件对象、文件对象、文件映射对象、I/O完成对口对象、作业对象、邮件槽对象、互斥量对象、管道对象、进程对象、信号量对象、线程对象、可等待计时对器象以及线程池工厂对象等
内核对象是和线程相关的,但是线程不是内核对象的所有者

  • 使用计数

使用计数是所有内核对象类型都有的一个数据成员。初次创建一个对象的时候,其实用计数被设为1。另一个进程获得对现有对象的访问后,使用计数就会递增。进程终止后,操作系统内核将自动递减此进程仍然打开的所有内核对象的使用计数。

  • 内核对象的安全性

内核对象可以用一个安全描述符来保护。要想查看一个对象是不是内核对象,就查看该对象的创建函数是不是包含了一个允许我们指定安全信息的参数

  • 进程内核对象句柄表

进程句柄表仅供内核对象使用。它只是一个由数据结构组成的数组,每个结构都包含一个指向一个内核对象的指针、一个访问掩码和一些标志

  • 创建一个内核对象

当一个进程首次初始化的时候,其句柄表为空,当一个线程调用一个会创建内核对象的函数时,内核将对句柄表进行初始化。
用于创建内核对象的任何一个函数都会返回一个与进程相关的句柄,这个句柄可由同一个进程中运行的所有线程使用。
调用一个函数时,如果它接受一个内核对象句柄作为参数,这个函数会查找进程的句柄表,获得目标内核对象地址,然后以一种恰当的方式来操纵内核对象的数据结构。
调用一个函数来创建内核对象时,如果调用失败,那么返回的句柄值通常会是0(NULL),遗憾的是,有几个函数在调用失败时会返回句柄值-1。在检查它们的返回值时,务必相当仔细。

  • 关闭内核对象

无论以什么方式创建内核对象,我们都要调用CloseHandle向系统表明我们已经结束使用对象
该函数同过检查主调进程的句柄表对使用计数进行递减,如果为0,就销毁这个内核对象,如果是一个无效的句柄,CloseHandle将返回False,GetLastError将返回ERROR_INVALID_HANDLE。如果进程正在调试,系统将会抛出异常。在CloseHandle返回之前,它会清除主调进程句柄表中对应的记录项
在创建一个内核对象时,我们会将相应的句柄保存到一个变量中,将此变量作为参数调用CloseHandle后,还应同时将这个变量设置为NULL。

跨进程边界共享内核对象

在很多时候,不同进程中的运行线程需要共享内核对象。
1.利用文件映射对象,可以共享数据块。
2.借助邮件槽和命名管道,在网络中的不同计算机上运行的进程可以相互发送数据块。
3.互斥量、信号量和事件允许不同进程中的线程同步执行。

  • 使用对象句柄继承

只有进程之间有一个父子关系时,才可以使用对象句柄继承。
为了创建一个可继承的句柄,父进程必须分配并初始化一个SECURITY_ATTRIBUTES结构,并将这个结构的地址传给具体的Create函数。
句柄表中的每一个记录项都有一个指明句柄是否可以继承的标志位,如果在创建内核对象的时候将NULL作为PSECURITY_ATTRIBUTES参数传入,则返回的句柄是不可继承的,这个标志位为0,将bInheritHandle成员设为TRUE,则导致这个标志位被设为1。
为了使用对象句柄继承,下一步是由父进程生成子进程。通过CreateProcess函数来完成,把bInheritHandle传递TRUE,子进程就会继承父进程的"可继承的句柄"的值
对象句柄的继承只会在生成子进程的时候发生。
子进程并不知道自己继承了任何句柄。
到目前为止,为了使子进程得到它想要的一个内核对象的句柄值,最常见的方式是将句柄值作为命令行参数传给子进程。
也可以采用其它进程间通讯技术将继承的内核对象句柄值传入子进程。一个技术是让父进程等待子进程完成初始化,发送一条消息到子进程中的一个线程创建的一个窗口。
另一种方式是让父进程向其环境块添加一个环境变量。变量的名称应该是子进程知道的一个名称,变量的值应该是准备被子进程继承的那个内核对象的句柄值。

�* 改变句柄的标志

我们有时候想控制哪些子进程能继承内核对象句柄。可以调用SetHandleInformation函数来改变内核对象句柄的继承标志。
SetHandleInformation(hObj, HANDLE_FLAG_INHERIT , HANDLE_FLAG_INHERIT);
HANDLE_FLAG_PROTECT_FROM_CLOSE标志告诉我们系统不允许关闭句柄
GetHandleInformation用来检查一个句柄可否继承
DWORD dwFlags; GetHandleInformation(hObj, &dwFlags); BOOL fHandleIsInheritable = (0 != (dwFlags & HANDLE_FLAG_INHERIT ));

  • 为对象命名

跨进程边界共享内核对象的第二个方法是对对象命名。
通过为对象命名来实现共享时,是否可以继承并非一个必要条件。
为了实现这些内核对象的共享,还可以考虑另一个办法。我们可以不调用Create函数,相反,可以调用的一个Open函数
Create*函数返回后,调用一下GetLastError,可以查看是创建了新的内核对象还是返回了现有的

  • 终端服务命名空间

在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有用户都能访问的内核对象放到这个命名空间中。此外,每个客户端会话都有一个自己的命名空间。
如果必须知道进程在哪个会话中运行,可以借助于ProcessIdToSessionId();
我们也可以强制把一个命名对象放入全局命名空间或者当前命名空间,具体做法是在其名称前加上"Global"前缀或者"Local"
所有保留关键字都是区分大小写的

  • 专有命名空间

专有命名空间相当于可供我们在其中创建内核对象的目录。和其他目录一样,专有命名空间也有一个和它相关联的安全描述符,这个描述符是在CreatePrivateNamespace的时候设置的。

  • 复制对象句柄

跨进程边界共享内核对象的最后一招是使用DuplicateHandle函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,669评论 0 27
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,018评论 11 349
  • 身为生活的看客,当我回忆半辈子的坎坷,我明白了很多很多。 我一个人孤独寂寞,我一个人口渴饥饿,我一个人白白忙活,我...
    李一十八阅读 647评论 2 3
  • 我永远忘不了那样一个早晨—— 新来的你默默坐在窗边的位置,托着脸,望着窗外。阳光透过窗打在你的脸上,仿佛给你镀上了...
    初夏幻梦阅读 151评论 0 0
  • 【壹】 “嗒——嗒——嗒——”一阵极富韵律的脚步声从皇宫门口逐渐传来。 他在朦胧中睁开双眼,隐约看到一道苗条的...
    牧城雪阅读 867评论 1 17