转载:https://blog.csdn.net/u012372584/article/details/78740365

1、

  1.  
    BOOL DuplicateHandle(
  2.  
    HANDLE hSourceProcessHandle,
  3.  
    HANDLE hSourceHandle,
  4.  
    HANDLE hTargetProcessHandle,
  5.  
    LPHANDLE lpTargetHandle,
  6.  
    DWORD dwDesiredAccess,
  7.  
    BOOL bInheritHandle,
  8.  
    DWORD dwOptions
  9.  
    );

作用:这个函数将一个进程A句柄表中的记录项(内核对象)复制到另一个进程B的句柄表中。如果B同时得到了此记录项(内核对象)的句柄值(一般通过进程间通信,A进程将记录项的句柄值传递给B进程),那么在B进程中就可以访问此记录项(内核对象)。

参数1:源进程A内核对象的句柄;
参数3:目标进程B内核对象的句柄;

进程句柄的获取:
1、如果进程是当前进程:GetCurrentProcess();
2、如果进程不是当前进程:OpenProcess(__in DWORD dwDesiredAccess,__in BOOL bInheritHandle,__in DWORD dwProcessId);其中dwProcessId可以在任务管理器中获得,或是通过进程间通信获得。
3、通过进程名称获取进程句柄:

  1.  
    HANDLE GetProcessHandle(LPCTSTR szName)
  2.  
    {
  3.  
    HANDLE hSanpshot;
  4.  
    hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  5.  
    if ( INVALID_HANDLE_VALUE == hSanpshot )
  6.  
    {
  7.  
    return NULL;
  8.  
    }
  9.  
     
  10.  
    PROCESSENTRY32 pe;
  11.  
    BOOL bOk;
  12.  
    pe.dwSize = sizeof(pe);
  13.  
     
  14.  
    bOk = Process32First (hSanpshot, &pe);
  15.  
    if (!bOk)
  16.  
    return NULL;
  17.  
     
  18.  
    do {
  19.  
    if ( !wcscmp (pe.szExeFile, szName) )
  20.  
    {
  21.  
    return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
  22.  
    }
  23.  
    bOk = Process32Next (hSanpshot, &pe);
  24.  
    }while (bOk);
  25.  
     
  26.  
    return NULL;
  27.  
    }

参数2:与参数1进程相关的任何类型内核对象的句柄;
参数4:HANDLE变量地址,用来接收复制得到的HANDLE值,可以通过进程间通信,将此值传递到目标进程B,
以用来通知进程B,可以通过此句柄值来访问复制来的内核对象。

参数5:TargetHandle句柄使用何种访问掩码(这个掩码是在句柄表中的一项):
      HANDLE_FLAG_INHERIT、HANDLE_FLAG_PROTECT_FROM_CLOSE;
参数6:是否拥有继承;
参数6:当设DUPLICATE_SAME_ACCESS时,表示于源的内核对象所有标志一样,此时wDesiredAccess可标志为0,
       当设DUPLICATE_CLOSE_SOURCE时,传输完后,关闭源中的内核对象句柄。

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

附上一个例子,来源:点击打开链接

将11.exe中的线程句柄复制,通过22.exe输入复制的句柄,结束11.exe中的线程

例子:22.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include
<iostream>
#include
<windows.h>
#include
<stdlib.h>
#include
<process.h>
using namespace std;
 
int main
(
void)
{
    HANDLE hRecv;
 
    cout
<< 
"请输入复制过来的句柄
: "
<<
endl;
    cin
>> hRecv;
 
    TerminateThread(hRecv,
0);
 
    system("pause");
    return 0;
}

例子:11.exe

#include <iostream>
#include <windows.h>
#include <process.h>
#include <TlHelp32.h>
using namespace std; unsigned __stdcall thread (void * lpPragma);
HANDLE GetProcessHandle(LPCTSTR szName); int main (void)
{
HANDLE hThread;
hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL);
cout << "my thread handle: " << hThread << endl; HANDLE hTarget; //你是不是想说这里的hThread与调用DuplicateHandle相关?
if (DuplicateHandle (GetCurrentProcess(), hThread , GetProcessHandle(L"22.exe"), &hTarget, 0, FALSE, DUPLICATE_SAME_ACCESS ) )
cout << "句柄复制成功, 其句柄值为:" << hTarget << endl; cin.get();
return 0;
} unsigned __stdcall thread (void * lpPragma)
{
while (1)
{
Sleep (500);
cout << "terminal me" << endl;
} return 0;
} HANDLE GetProcessHandle(LPCTSTR szName)
{
HANDLE hSanpshot;
hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( INVALID_HANDLE_VALUE == hSanpshot )
{
return NULL;
} PROCESSENTRY32 pe;
BOOL bOk;
pe.dwSize = sizeof(pe); bOk = Process32First (hSanpshot, &pe);
if (!bOk)
return NULL; do {
if ( !wcscmp (pe.szExeFile, szName) )
{
return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
}
bOk = Process32Next (hSanpshot, &pe);
}while (bOk); return NULL;
}

DuplicateHandle进程间句柄复制的更多相关文章

  1. [转]Windows 下的进程间通讯及数据共享

    http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket, ...

  2. windows 进程间通讯方法

    Windows平台为我们提供了多种进程间通信的机制,主要包括:注册表方式.共享文件方式.共享内存方式.共享数据段.映射文件方式.管道方式. 剪贴板方式.消息方式.其中注册表方式需要增加注册表表项,而注 ...

  3. 输入系统:进程间双向通信(socketpair+binder)

    一.双向通信(socketpair) socketpair()函数用于创建一对无名的.相互连接的套接子,如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1]:否则返回-1,错误码保存于e ...

  4. Windows进程间的通信

    一.进程与进程通信   进程间通信(Interprocess Communication, IPC)是指不同的进程之间进行数据共享和数据交换. 二.进程间通信方式 1.  文件映射 注:文件映射是在多 ...

  5. 使用 WM_COPYDATA 在进程间共享数据

    开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...

  6. Windows进程间各种通信方式浅谈

    1 Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成. 多进程/多线程是Windows操作系 ...

  7. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

  8. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  9. C#进程间通讯或同步的框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下  0.背景简介 微软在 .NET 框架中提供了多种实用 ...

随机推荐

  1. openssl获取ssl证书,配置https

  2. jmeter源码环境(IDEA)

    jmeter源码环境(IDEA) jmeter 1. 本地环境 2. 下载源码 3. 下载依赖包 4. 导入IDEA 5. 运行 1. 本地环境 Windows7 java版本:1.8.0_191 a ...

  3. Javascript技能

    Javascript技能 说一说我对 Javascript 这门语言的一些总结(适合前端和后端研发) 基本认识 一些心得 思维脑图的链接(icloud 分享): https://www.icloud. ...

  4. java代码转python代码

    (1)安装工具(windows 环境下面) 先下载antlr: http://www.antlr3.org/download/antlr-3.1.3.tar.gz 链接:http://pan.baid ...

  5. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  6. db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码

    db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码 检测

  7. 《基于WEB的独立学院补考重修管理系统研究》论文笔记(二十)

    <基于WEB的独立学院补考重修管理系统研究>论文笔记(1) 一.基本信息 标题:基于WEB的独立学院补考重修管理系统研究 时间:2016 来源:南通大学杏林学院 关键词:WEB:补考重修管 ...

  8. vs下载代码

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012605477/article/details/62222919Visual Studio 20 ...

  9. 5 Successful Business Models for Web-Based Open-Source Projects

    https://handsontable.com/blog/articles/2016/3/5-successful-business-models-for-web-based-open-source ...

  10. Django REST framework视图

    混合类阶段(封装2次) 路由: url(r'school/$', views.SchoolView.as_view()), url(r'school/(?P<pk>\d+)/$', vie ...