Windows进程共享内核对象的3种方法

转载 2015年11月18日 14:39:16

转载的:http://www.51testing.com/html/51/n-821751.html


Windows内核对象是什么我这里就不介绍了,任何一本关于windows编程的书都会介绍,我这里就把我找到的关于跨越进程边界共享内核对象的方法和大家分享了。

  在windows系统中想要跨越进程边界共享内核有3种方法,当然不排除以后还有更多方法,或是一些变种的方法。

  ● 继承对象句柄

  看到继承大家肯定不陌生,了解一点面向对象知识的好青年都知道这是个什么意思。简单来说就是你爸爸生你,你继承你爸爸的一点特性罢了。当两个进程具有父子关系时,就可以使用这种对象句柄的继承方法来跨越进程边界,共享进程内核对象。父进程在创建子进程时可以为子进程赋予父进程拥有的内核对象的访问权限。不过想要这么做就些前提条件。

  首先,当父进程在创建内核对象时必须向系统指明,它希望这个内核对象的句柄是个可继承的句柄。这里不是说内核对象可以继承,而仅仅是句柄可以继承。怎么实现这个设定呢?父进程只需要指定一个SECURITY_ATTRIBUTES结构,并将这个结构的bInheritHandle属性设置为TRUE就行了,然后在创建内核对象时把这个结构体传递给创建函数,那么返回的句柄就是一个可继承的句柄。像下面这样:

  1. SECURITY_ATTRIBUTES s;  
  2. s.nLength = sizeof(s);  
  3. s.lpSecurityDescriptor = NULL;  
  4. s.bInheritHandle = TRUR;  
  5. //创建一个互斥对象,返回的句柄可继承 
  6. HANDLE hMutex = CreateMutex(&s, FALSE, NULL);

  然后在创建子进程时将入参bInheritHandles设置为TRUE就行了,像下面这样:

  1. CreateProcess(  
  2.     PCTSTR pszApplicationName,  
  3.     PTSTR pszCommandLine,  
  4.     PSECURITY_ATTRIBUTES psaProcess,  
  5.     PSECURITY_ATTRIBUTES pszThread,  
  6.     BOOL bInheritHandles, //设置为TRUE就行了 
  7.      DWORD dwCreationFlags,  
  8.     PVOID pvEnvironment,  
  9.     PCTSTR pszCurrentDirectory,  
  10.     LPSTARTUPINFO pStartupInfo,  
  11.     PPROCESS_INFOMATION pProcessInfomation);

  当把bInheritHandles设置为TRUE时,系统创建这个子进程后会把父进程中能够继承的所有句柄项拷贝到子进程的句柄表中,这样子进程就可以控制父进程所拥有的内核对象了,当然这个过程不是实时的,也就是说在创建了子进程后,如果父进程再创建了一个可继承的内核对象时,这个在子进程生成后创建的可继承内核对象是不会被这个子进程继承的。真绕口。。。简单点就是时过境迁,物是人非,过了这村就没这店了。

  ● 使用命名对象

  这个方法是个人都能想到,当你想找一个人的时候,首先想到的是他的名字(也可能是他的长相,好吧,就当我YY吧!),我们在创建内核对象时为他们命名就可以在其他进程需要使用这个内核对象时调用它的名字就行了。比如我上面那个创建互斥内核对象的函数CreateMutex(),它的原型其实是下面这样的:

  1. HANDLE CreateMutex(  
  2.     PSECURITY_ATTRIBUTES psa,  
  3.     BOOL bInitialOwner,  
  4.     PCTSTR pszName);

      第三种方式:

句柄复制

Windows内核对象句柄的继承小总结

对象句柄的继承   跨进程边界共享内核对象有三种常用的机制:为对象命名、复制对象句柄,还有就是使用对象句柄继承。   Windows支持“对象句柄的继承”,而不是支持对象的...

跨进程共享内核对象方法:命名对象

下面的所有函数都可以创建命名的内核对象: CreateMutex,CreateEvent,CreateFileMapping, CreateSemaphore,CreateWaitableTime...

Chapter03-跨进程共享内核对象

一、windows内核对象的基本概念 1.所谓内核对象,实质就是由系统内核在内存中分配的一个内存块,这个内存块只能由内核分配,也只能由内核访问。常见的内核对象如:文件对象,时间对象,文件映射对象,互斥...
  • tzs33
  • tzs33
  • 2015年01月17日 10:08
  • 171

进程共享内核对象之 复制内核对象句柄

进程共享内核对象的三种方式: 1.     内核对象句柄继承 2.     为内核对象命名 3.     复制内核对象句柄 今天写一下第三种方式。 跨进程边界共享内核对象可以使用Duplic...

windows笔记-跨越进程边界共享内核对象【对象句柄的继承性】

原文地址:http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813698.html 都是一些概念性的东西,看得可能会有点烦,不过看了...

windows笔记-跨越进程边界共享内核对象【复制对象句柄】

跨越进程边界共享内核对象有三种方法: 对象句柄的继承性命名对象复制对象句柄 复制对象句柄 共享跨越进程边界的内核对象的最后一个方法是使用 BOOL ...

windows笔记-跨越进程边界共享内核对象【复制对象句柄】

来自:http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813949.html 跨越进程边界共享内核对象有三种方法: 对象...

Windows进程内核对象句柄表

一个进程在初始化时,系统将为它分配一个句柄表。这个句柄表仅供内核对象使用,不适用于用户对象或GDI对象。 创建 一个进程首次初始化的时候,其句柄表为空。当进程内的一个线程调用一个会...

Windows进程的同步之内核对象-互斥量(Mutex)

原文  http://blog.csdn.net/anonymalias/article/details/9080881 我们知道进程间的同步操作都是要借助内核来完成的,和同一个进程中的线程同步只需...

Windows进程同步之信号量内核对象(Semaphore)

信号量内核对象主要包括三个部分:使用计数,最大资源计数,当前资源计数。 使用计数:和其他内核对象一样,用来标识使用该事件对象的不同线程个数;最大资源计数:表示信号量控制的最大资源的数目;当前资源...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows进程共享内核对象的3种方法
举报原因:
原因补充:

(最多只允许输入30个字)