内核对象之三 跨边界共享内核对象对象

上一篇 / 下一篇  2008-11-18 11:00:42 / 个人分类:Windows编程相关

  内核对象是进程局部的,但有时候我们又希望不同的进程可以共享同一个内核对象,我们
有3中进制来实现:使用对象句柄继承、复制对象句柄、为对象命名。

  1、对象句柄继承
  如果进程A和进程B存在父子关系(假设A为父进程),他们就可以通过对象句柄继承来实现
共享内核对象。首先A进程在创建某个内核对象的时候,必须指定该内核对象的句柄是可继承的,
这通过传递安全属性参数来做到,然后A在通过CreateProcess()创建B的时候将允许集成父进程
内核对象设置成true,这样,在CreateProcess()中,父进程会扫描自身的允许继承的内核对象
的句柄,将他们复制到子进程中同样的位置(就是说他们在进程的内核对象句柄表中的索引
完全相同,不可避免的,肯定有很多浪费的空间)。这样,A,B就共享了内核对象的句柄值。
但是,这种做法是有缺陷的:

     (1)子进程继承的句柄只是父进程在创建内核对象的时候指定的可继承其句柄的内核对象句柄。
     (2)如果父进程创建了子进程后,又创建了一个可继承句柄的内核对象,子进程是无法得到这个
          内核对象的句柄的,也就是说子进程继承的只是他被创建之前的父进程的可继承内核对象句柄。
     (3)子进程虽然继承了内核对象的句柄,但是他不知道自己继承了任何句柄,所以,我们要通过
          其他的方式向子进程传递这些句柄值。比如,可以将句柄值作为命令行参数传递给子进程,或
          父进程设置环境变量,子进程通过GetEnvironmentVariable或的环境变量的值,另外就是
          可以让父进程给子进程发送关于句柄值的消息。

  最后一种方法存在这这个问题,就是父进程应该在子进程完全初始化之后才应该跟它进行交互,
这个问题更一般的说法是:应用程序想要发送消息给一个窗口或进程,但是却不知道这个窗口或进程
什么时候初始化完毕。WaitForInputIdle()解决了这个问题,他会等待目标进程空闲或等待超时。

  2.为对象命名
  我不准备详细学习这种机制,一是他比较麻烦,另外,我暂时想不到他会与我想在从事的自动化
有什么交集。
  3.复制对象句柄
  跨进程边界共享内核对象的最后一种机制是DuplicateHandle().
  BOOL WINAPI DuplicateHandle(
  __in          HANDLE hSourceProcessHandle,
  __in          HANDLE hSourceHandle,
  __in          HANDLE hTargetProcessHandle,
  __out         LPHANDLE lpTargetHandle,
  __in          DWORD dwDesiredAccess,
  __in          BOOL bInheritHandle,
  __in          DWORD dwOptions
  );
  DuplicateHandle()可以用在3个不同进程中,如进程C调用DuplicateHandle()将进程A的内核对象
句柄复制给了进程T,不过这种机制更多的发生在两个进程中:
  //create a handle by process S.
  HANDLE hObjInProcessS=CreateMutex(NULL,FALSE,NULL);

  //get handle to Process T's kernel object
  HANDLE hProcessT=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessIdT);
 
  //we use this represent duplicated handle in Process T.
  HANDLE hObjInProcessT;

  DuplicateHandle(GetCurrentProcess(),hObjInProcessS,hProcessT,&hObjInProcessT,0,FALSE,DUPLICATE_SAME_ACCESS);
 
  //we should't do this,because process S has no permission to close handle belong to process T.
  CloseHandle(hObjInProcessT);

  //close handle when no longer need it.
  CloseHandle(hObjInProcessS);

  我们可以用这种机制实现下面的要求:进程S打开了某个文件影像,他希望进程T可以访问这个影像,但仅限于读,我们只要在赋值句柄的时候把访问权限设置为只读就可以了。


TAG: Windows编程相关

 

评分:0

我来说两句

Open Toolbar