在进程之间共享内核对象句柄的一种方法: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
  );

  hSourceProcessHandle:源进程内核句柄(即负责传递内核对象句柄的进程句柄)
  hSourceHandle:要传递的内核对象句柄
  hTargetProcessHandle:目标进程内核句柄
  lpTargetHandle:接收内核对象句柄的地址(先随便声明一个HANDLE)
  dwDesiredAccess:TargetHandle句柄使用何种访问掩码(这个掩码是在句柄表中的一项)
  bInheritHandle:是否拥有继承
  dwOptions:当设DUPLICATE_SAME_ACCESS时,表示于源的内核对象所有标志一样,此时wDesiredAccess可标志为0 当设DUPLICATE_CLOSE_SOURCE时,传输完后,关闭源中的内核对象句柄
  此函数能否成功调用还要看你是否有足够的权限去操作目标进程
  通常目标进程的内核句柄是利用OpenProcess()得到的

  注意:不要试图在源进程中利用CloseHandle()关闭TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误关闭了,会产生不可预料的结果!
 

   不知道为何要用复制句柄函数,我利用进程间通信把句柄传给目标进程不就行了吗?
    这样的想法就大错特错了,我们表面上是在复制句柄值,实际上是把该句柄在源进程句柄表中的所有项复制到目标进程的句柄表中,而且使该内核对象的计数器+1了,如果只是简单的只传句柄值,目标进程的句柄表中是不会有所增加的。

  下面例子演示在ApiDuplicateHandleSource.exe中创建一个线程,将该线程句柄复制到ApiDuplicateHandle.exe中去,在进程ApiDuplicateHandle.exe中结束该线程。

// ApiDuplicateHandleSource.cpp
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <tchar.h>
#include <TlHelp32.h> using namespace std; unsigned __stdcall thread (void * lpPragma);
HANDLE GetProcessHandle(LPCTSTR szName); int main (void)
{
HANDLE hThread = NULL;
hThread = (HANDLE)_beginthreadex(NULL, , thread, NULL, , NULL);
cout << "My thread handle is " << hThread << endl; HANDLE hTarget = NULL;
BOOL bSucc = FALSE;
//你是不是想说这里的hThread与调用DuplicateHandle相关?
bSucc = DuplicateHandle (GetCurrentProcess(), //当前进程的源进程句柄
hThread, //当前进程中存在的线程资源句柄(内核对象)
GetProcessHandle(_T("ApiDuplicateHandle.exe")), //目标进程的句柄
&hTarget, //要得到的目的句柄(Out)
, //访问的方式
FALSE, //得到的句柄能不能被得到的其的进程的子进程继承
DUPLICATE_SAME_ACCESS ); //访问选项
if (bSucc)
{
cout << "句柄复制成功, 其句柄值为:" << hTarget << endl;
} cin.get();
return ;
} unsigned __stdcall thread (void * lpPragma)
{
while ()
{
Sleep ();
cout << "Please terminal me!" << endl;
} return ;
} HANDLE GetProcessHandle(LPCTSTR szName)
{
HANDLE hSanpshot = NULL;
hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if ( INVALID_HANDLE_VALUE == hSanpshot )
{
return NULL;
} PROCESSENTRY32 pe;
BOOL bOk = FALSE;
pe.dwSize = sizeof(pe); bOk = Process32First (hSanpshot, &pe);
if (!bOk)
return NULL; do
{
if ( !_tcscmp (pe.szExeFile, szName) )
{
return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
}
bOk = Process32Next (hSanpshot, &pe);
}
while (bOk); return NULL;
}
// ApiDuplicateHandle.cpp
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
#include <process.h> using namespace std; int main (void)
{
HANDLE hRecv = NULL; cout << "请输入复制过来的句柄 : " << endl;
cin >> hRecv; TerminateThread(hRecv, ); cin.get();
return ;
}

  参考

  http://www.cnblogs.com/staring-hxs/p/3576927.html

  http://blog.sina.com.cn/s/blog_4cfc933d0100rsrv.html

Windows API之DuplicateHandle的更多相关文章

  1. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  2. WinSpy涉及的windows api

    WinSpy涉及的windows api WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄.窗口的属性.styles.类名子窗口.进程线程信息等查找功能.功能虽然不算强大,但涉 ...

  3. Windows API Finishing

    input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...

  4. Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  5. [windows菜鸟]Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  6. WINDOWS API 大全(二)

    9. API之设备场景函数 CombineRgn 将两个区域组合为一个新区域CombineTransform 驱动世界转换.它相当于依顺序进行两次转换CreateCompatibleDC 创建一个与特 ...

  7. C# Windows API

    API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...

  8. Windows API Hooking in Python

    catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...

  9. 初识【Windows API】--文本去重

    最近学习操作系统中,老师布置了一个作业,运用系统调用函数删除文件夹下两个重复文本类文件,Linux玩不动,于是就只能在Windows下进行了. 看了一下介绍Windows API的博客: 点击打开 基 ...

随机推荐

  1. DEDECMS之0day入侵总结

    1.查看dedecms最后升级版本:http://xxx.com/data/admin/ver.txt 2.利用网上公开之0day进行对应版本之入侵 ps:dedecms默认CMS后台:http:// ...

  2. gflops

    这个网站最棒了 http://kyokojap.myweb.hinet.net/gpu_gflops/

  3. Storm如何保证消息不丢失

    storm保证从spout发出的每个tuple都会被完全处理.这篇文章介绍storm是怎么做到这个保证的,以及我们使用者怎么做才能充分利用storm的可靠性特点. 一个tuple被"完全处理 ...

  4. Selenium——去掉Chrome正受到自动软件测试的控制

    selenium打开chrome浏览器时,地址栏下方会出现该提示“Chrome正在受到自动测试软件的控制” public class BasicDriver { public WebDriver dr ...

  5. 2015 Multi-University Training Contest 1记录

    1001 OO's Sequence 分析: 对于例子,能够得到,我们要求的是(1,1)(1,2)(1,3)(1,4)(1,5)(2,2)(2,3)(2,4)(2,5)(3,3)(3,4)(3,5)( ...

  6. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何让文本框可以输入,文本框可以编辑

    选中一个文本框,然后在属性中双击输入配置的OnMouseDown事件(也可以是别的事件,但都是通过这种方法)   在左侧点击写变量,然后输入类型改成VisuDialos.Numpad(数字键盘方式), ...

  7. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何快速调整大量控件的位置

    打开元素列表,然后直接从顶部按住Shift批量选中控件即可     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的 ...

  8. java集合框架小结

    总结例如以下: 1.假设要求线程安全的, 使用Vector.Hashtable 2.假设不要求线程安全,应该使用ArrayList.LinkedList.HashMap 3.假设要求有映射关系,键值对 ...

  9. python——3.x的异常处理 请注意了

    以前的python2.x的时候:try:        fp=urllib.request.urlopen(blogurl)    except Exception, e:        print  ...

  10. 梳理caffe代码blob(三)

    贯穿整个caffe的就是数据blob: #ifndef CAFFE_BLOB_HPP_ #define CAFFE_BLOB_HPP_ #include <algorithm> #incl ...