跨进程边界共享内核对象

正在拜读《windows核心编程》,稍后总结。---------XiaoF

先说说为何要实现此功能
   1,利用文件映射对象,可以在同一电脑的不同进程之间共享数据块。
   2,借助邮件槽和命名管道,在网络中的不同计算机上运行的进程相互发送消息。
   3,互斥量。信号量。事件,允许不同进程中的线程做同步。
如何实现,方法3种:使用对象句柄继承(父子进程);为对象命名;复制对象句柄。
使用对象句柄继承
    只有在父子进程关系,才可以用对象句柄继承方法。
    步骤如下:
    1,当父进程创建一个内核对象时,必须向系统指明这个对象句柄是否希望子进程继承。(对象继承这种说法是不正确的,应
         该是对象句柄继承。
          为了创建一个可继承的句柄,需分配并初始化 SECURITY_ATTRIBUTES结构,并将结构地址传给Create*函数。
        例如创建一个互斥量对象:
                   SECURITY_ATTRIBUTES sa;
                    sa.nLength=sizeof(sa);
                    sa.lpSecurityDescriptor = NULL;
                    sa.bInheritHandle = TRUE;  // Make the returned handle inheritable
                    HANDLE hMutex= CreateMutex(&sa, FALSE , NULL);
             注解:SECURITY_ATTRIBUTES 结构的成员变量,nLength结构体大小;lpSecurityDescriptor 为安全访问描述符,如果想对
                        创建的对象记忆访问限制,修改此值;bInheritHandle    此变量如果是true 则是可以继承。
    2,创建子进程
            BOOL CreateProcess(PCTSTR  pszApplicationName,PTSTR pszCommandLine,·······, Bool bInheritHandles, ······);
            注意bInherithandles ,再生成一个进程时:此值决定子进程是否可以继承父进程句柄表中的“可继承句柄”;
            如果bInheritHandles为True,系统会做三件事:1,创建子进程并创建一个新的进程句柄表;2:,遍历父进程句柄表,凡是标志是
            可继承的句柄,就复制到子进程的句柄表中(位置也一样,完全一致);3, 系统还会递增内核对象的使用计数。
    注:对象句柄的继承只会发生在子进程生成时,假如父进程又创建了一个内核对象,并同样将他的句柄设为可继承的句柄。正在运行的
            子进程不会继承这个内核对象的。
           子进程是不会知道自己继承的内核对象的句柄的。在子进程文档中英指出他从另一个进程生成时,希望还获得内核队形句柄。
    3,为了使子进程得到想要的内核对象句柄,最常用的方法是:句柄值作为命令行参数传给子进程;进程通迅技术(WaitForInputIdle函数);父进程想起环境快中添加环境变量;

整理一下思路,稍后继续 ------XiaoF

对象命名
    许多内核对象都可以进行命名。
    1,在一个进程A中创建一个内核对象:
    例如:上面所用例子:
      HANDLE CreateMutex(
            PECURITY_ATTRIBUTES psa,
            BOOL    bInitialOwner,
            PCTSTR    pszname);
    最后一个参数pszName,向此参数传入NULL,相当于让系统创建一个未命名的内核对象,可以利用继承技术来实现共享内核对象;如
    果想使用对象命名来实现,必须为此函数赋值。
    paName赋值是“以0为终止符的名称字符串”的地址。这个名称可以长达MAX_PATH个字节。
     例如创建一个互斥对象:
     HANDLE  hMutex = CreateMutex(NULL,FALSE,TEXT("XiaoF_Object");
     注意:Microsoft没有提供任何机制来保证内核对象名称的唯一性(解决名称唯一的方法:专有命名空间)
                ,所以如果在名义一个XiaoF_Object的对象将会失败
    注解:例如在创建一个信号对象:
    HANDLE hSem  = CreateSemaphore(NULL,1,1,TEXT("XiaoF_Object");
    DWORD dwErrorCode = GetLastError();
    结果dwErrorCode 的值为6(ERROR_INVALID_HANDLE),句柄错误。
   
    2,在另一个进程中创建一个进程B:
           在进程B中创建一个名称为XiaoF_Object的对象。
            系统会查看是否存在XiaoF_Object的对象,如果存在,接着检查对象的类型,如果类型一致,接着执行一次安全检查,验证调用者是否对该对象拥有完全访问权限。如果是,系统就会在进程B的句柄表中找到空白项,初始化为指向现有的内核对象。如果对象的类型不匹配或者调用被拒绝,就会失败(返回NULL);
        
        调用Create*创建对象函数成功后,未创建对象,其实是process B分配了一个新的Handle,他表示了内核中现有的对象。
        内核对象的计数+1;
        
      
       还可以使用Open*  函数
        参数和Create* 一样。如果没有找到同名的内核对象,函数返回NULL,GetLastError返回2(ERROR_FILE_NOT_FOUND); 如果找到同名的对象,但是类型不同,函数返回NULL,GetLastError返回6,(ERROR_INVALID_HANDLE);如果同名同类型,系统会检查请求的访问(通过dwDesiredAccess制定)是否允许。如果均通过,系统跟新调用进程的句柄表,并内核对象计数+1;

Create* 和Open* 的区别:如果内核对象不存在,Create*会创建内核对象,而Open* 只会返回失败。

跨进程边界共享内核对象

时间: 2024-10-09 11:42:13

跨进程边界共享内核对象的相关文章

跨越进程边界共享内核对象【命名对象】

跨越进程边界共享内核对象有三种方法: 对象句柄的继承性 命名对象 复制对象句柄 命名对象 共享跨越进程边界的内核对象的第二种方法是给对象命名,注意有些内核对象是不可以命名的,但多数内核对象可以命名. 下面的所有函数都可以创建命名的内核对象: HANDLE CreateMutex( PSLCURITY_ATTRIBUTES psa, BOOL bInitialOwner, PCTSTR pszName); HANDLE CreateEvent( PSECURITY_ATTRIBUTES psa,

多个进程获取同一个内核对象,他们的句柄是一样的

// temp10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #include <string> #include <iostream> #include <time.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HANDLE handle=::CreateEventA(n

双进程守护?内核对象?单实例....?抱歉会进程挂起...抱歉我还有HOOK....

那时候总会问自己,这次写的驱动,用Windbg调试过吗? 写SsdtHook,手动找过吗?写ObjectHook知道对象结构吗?用FS寄存器获取信息?为什么能获取那么多的信息?,_kpcr与他有什么关系?要从那次学习双进程守护说起,也算小半年以前的事情了.不懂互斥体.不懂事件.信号量等机制,你就说用互斥体.事件写双进程守护?科普:当年自学操作系统的时候不懂,慢慢的也就懂了.穿孔器.纸卡带的年代只有程序,为了解决人与CPU的交互效率低下,单批道处理器当年就出现了.但是仍然满足不了需求,这时候多批道

第3章 内核对象(2)

3.3 跨进程边界共享内核对象 3.3.1 使用对象句柄继承 (1)对象句柄继承,只发生在进程之间有父子关系的时候(即一个进程而另一个进程CreateProcess起来) (2)内核对象句柄继承的实现 ①父进程必须先指出哪些内核对象句柄是可继承(注意不是内核对象本身的继承,而是内核对象的句柄继承),父进程在创建内核对象时要将SECURITY_ATTRIBUTES的bInheritHandle字段设为TRUE,表示可继承.这时句柄表中相应的记录项的标志位被设为1,否则为0. ②父进程调用Creat

Windows核心编程之核心总结(第三章 内核对象)(2018.6.2)

学习目标 第三章内核对象的概念较为抽象,理解起来着实不易,我不断上网找资料和看视频,才基本理解了内核对象的概念和特性,其实整本书给我的感觉就是完整代码太少了,没有多少实践的代码对内容的实现,而且书本给的源码例子,有太多我们不知道的知识,并且这些知识对本章主要内容来说是多余的,所以我们理解起来也非常困难.为了更好的学习这章,我补充了一些辅助性内容.这一章的学习目标:1.Windows会话和安全机制2.什么是内核对象?3.使用计数和安全描述符4.内核对象句柄表5.创建内核对象6.关闭内核对象7.跨进

windows编程基础之内核对象

      学好windows编程,理解内核对象还是至关重要的(●'?'●).闲话不多说,下面先来了解一下关于内核对象的知识:       内核对象(kernel object):内核对象是用于管理进程.线程和文件等诸多种类的大量资源.       内核对象的分类:进程对象,线程对象,互斥量(mutex)对象,信号量(semaphore)对象,事件对象,作业对象,文件对象,文件映射对象,管道(pipe)对象,邮件槽(mailslot)对象,I/O完成端口对象,线程池工厂(thread pool 

白话windows内核对象共享之复制对象句柄

引子:话说老王的果园大丰收,老王心花怒放,带着全家去美国阿拉斯加度假.阿拉斯加有很多东西琳琅满目,都是中国没有的,老王及家人都过了一把购物瘾.但是有一次却遇到了比较尴尬的事.怎么回事呢?原来老王第一次出国,在买地摊上的东西时讨价还价100元,但是给人家的却是100元人民币,人家自然不干撒,你100元才多少美元呀,老王只好忍痛割爱给了600元人民币. 为什么会出现这样的尴尬呢?因为两个国家的货币换算不是一样的.中国的100元和美国的100元不是等价的,如何才能等价呢?必须根据当前汇率来换算.今天要

【朝花夕拾】一篇文章搞懂Android跨进程通信

前言 只要是面试中高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎.如果您还对这方面的知识还做不到如数家珍,那就和我一起来攻克它吧! 本文主要包含了如下内容: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC.(2)总结Android的IPC

Windows内核之内核对象

1内核对象定义: 1.1:每个内 核对象只是内核分配的一个内存块,并且只能由该内核访问. 1.2:该内存块是一种数据结构,它的成员负责维护该对象的各种信息. 有些数据成员(如安全性描述符.使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型.例如,进程对象有一个进程ID .一个基 本优先级和一个退出代码,而文件对象则拥有一个字节位移.一个共享模式和一个打开模式. 2内核对象种类: 比如存取符号对象. 事件对象.文件对象.文件映射对象.I / O 完成端口对象.作业对象.信箱对