跨进程共享内核对象方法之三:复制对象句柄

  实现该方法使用的是Duplicatehandle函数。

bool DuplicateHandle(
   HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
PHANDLE phTargethandle
DWORD ddwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);


  这个函数的功能是获得进程句柄表的一个记录项,然后在另一个进程中创建这个记录项的副本。第一个和第三个参数分别标识源进程和目标进程内核对象句柄。第二个参数标识要复制的内核对象句柄,它可以指向任何类型的内核对象。第四个参数是一个目标句柄的地址,用来接收复制到的HANDLE值。

  函数将源进程中的句柄信息复制到目标进程所标识的句柄表中。第五第六个参数用以指定此内核对象句柄在目标进程句柄表中应该使用何种访问掩码和继承标志。

  dwOption参数可以是DUPLICATE_SAME_ACCESS和DUPLICATE_CLOSE_SOURCE任一个。如果是DUPLICATE_SAME_ACCESS标志,将向DuplicateHandle函数表明我们希望目标句柄拥有与源进程句柄一样的访问掩码,此时会忽略dwDesiredAccess。如果是DUPLICATE_CLOSE_SOURCE标志,会关闭源进程的句柄,此时将一个内核对象从一个进程复制到另一个进程,但是内核对象的使用计数不受影响。

  GetCurrentProcess可以返回当前进程的句柄,但是它是一个伪句柄。其值为-1,GetCurrentThread返回的也是伪句柄其值为-2,它们并不在句柄表中而仅仅代表当前进程和当前线程。

  这一章很抽象,原来学习的时候读了很多遍也不是很明白,后来干脆跳过去了,一段时间的学习之后再回来看看,发现竟然非常简单。所以有时候学习不能钻牛角尖该跳过跳过。随着学习的深入,你所站的高度、看问题的角度都会不一样。理解起来也会更容易!!!