Windows API之DuplicateHandle

Windows API之DuplicateHandle在进程之间共享内核对象句柄的一种方法 DuplicateHan 简单地说 该函数取得某个进程句柄表中的一个表项 然后把它拷贝到另一个进程的句柄表中 BOOLWINAPIDu inHANDLEhSou inHANDLEhSo

 

  在进程之间共享内核对象句柄的一种方法: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 #include #include #include #include using namespace std; unsigned __stdcall thread ( void * lpPragma); HANDLE GetProcessHandle(LPCTSTR szName); int main ( void ) { HANDLE hThread = NULL; hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0 , 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) 0, // 访问的方式 FALSE, // 得到的句柄能不能被得到的其的进程的子进程继承 DUPLICATE_SAME_ACCESS ); // 访问选项 if (bSucc) { cout << " 句柄复制成功, 其句柄值为: " << hTarget << endl; } cin. get (); return 0 ; } unsigned __stdcall thread ( void * lpPragma) { while ( 1 ) { Sleep ( 1000 ); cout << " Please terminal me! " << endl; } return 0 ; } HANDLE GetProcessHandle(LPCTSTR szName) { HANDLE hSanpshot = NULL; hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 ); 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 #include #include #include using namespace std; int main ( void ) { HANDLE hRecv = NULL; cout << " 请输入复制过来的句柄 : " << endl; cin >> hRecv; TerminateThread(hRecv, 0 ); cin. get (); return 0 ; }

Windows API之DuplicateHandle

   参考

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

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

转载于:https://www.cnblogs.com/MakeView660/p/7753516.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206311.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午4:00
下一篇 2026年3月19日 下午4:00


相关推荐

  • 广东电信 DNS 设置更改

    广东电信 DNS 设置更改因为未知原因(真的不知中国电信为何如此,有空打10000问问),原先广东电信用户可以使用的DNS服务器,如202.96.128.68202.96.128.110,不能使用了。因此,如果你的ADSL是使用路由方式共享上网的,并且手动设置了DNS服务器地址为以上ip,将会出现上不了网的情况。这就需要把DNS服务器地址更…

    2022年7月11日
    45
  • 算数平均数与几何平均数

    算数平均数与几何平均数算数平均数与几何平均数文章目录算数平均数与几何平均数一 算数平均数二 几何平均数 1 定义 2 几何意义三 二者关系一 算数平均数算数平均数分为简单算数平均数与加权算术平均数 简单算术平均 主要用于未分组的原始数据 设一组数据为 x1x 1×1 x2x 2×2 x3x 3×3 xkx kxk 得到简单算数平均 M x1 x2 x3 xkkM frac x 1 x 2 x 3 x k k M kx1 x2 x3 xk 加权算术平均 主要用于处理经分组整理的

    2026年3月19日
    2
  • NodeJS农产品在线交易平台01124-计算机毕设原创(免费领源码+带部署教程)

    NodeJS农产品在线交易平台01124-计算机毕设原创(免费领源码+带部署教程)

    2026年3月15日
    2
  • vmware linux安装_vm如何安装系统

    vmware linux安装_vm如何安装系统火眼发布Windows渗透工具包(CommandoVM)包含140个渗透工具工具下载地址:github.com/fireeye/commando-vmKaliLinux已成为攻击型安全专家的标配工具,但对需要原生Windows功能的渗透测试员来说,维护良好的类似工具集却是不存在的。安全服务公司火眼就是要改变这一现状。3月28日,该公司发布了一个包含超过140个开源Windows工具的…

    2022年10月1日
    4
  • 基于麦克风阵列的现有声源定位技术有_阵列原理

    基于麦克风阵列的现有声源定位技术有_阵列原理I目录一、绪论……………………………………………………………………………………………………………….11.1课题研究背景和意义………………………………………………..

    2026年2月18日
    4
  • 书包网小说多线程爬虫[通俗易懂]

    书包网小说多线程爬虫[通俗易懂]书包网是个很好的小说网站,提供了小说txt下载,并且网站后端高并发,不用担心随便抓一下把网站抓崩了既然如此,何不拿来练手爬虫项目呢。直接上代码把,此多线程爬虫支持爬取各种这样类似的网站,关键需要网站支持高并发,否则分分钟崩了。毕竟5分钟一本18mb的小说,属于超级快的那种了fromlxmlimportetreeimportrequestsfromthreadi…

    2022年6月15日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号