DuplicateHandle进程间句柄复制
转载:https://blog.csdn.net/u012372584/article/details/78740365
1、
- BOOL DuplicateHandle(
- HANDLE hSourceProcessHandle,
- HANDLE hSourceHandle,
- HANDLE hTargetProcessHandle,
- LPHANDLE lpTargetHandle,
- DWORD dwDesiredAccess,
- BOOL bInheritHandle,
- DWORD dwOptions
- );
作用:这个函数将一个进程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、通过进程名称获取进程句柄:
- 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;
- }
参数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#include#include#includeusing namespace std;int mainvoid){ HANDLE hRecv; cout"请输入复制过来的句柄<< cin TerminateThread(hRecv, 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进程间句柄复制的更多相关文章
- [转]Windows 下的进程间通讯及数据共享
http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket, ...
- windows 进程间通讯方法
Windows平台为我们提供了多种进程间通信的机制,主要包括:注册表方式.共享文件方式.共享内存方式.共享数据段.映射文件方式.管道方式. 剪贴板方式.消息方式.其中注册表方式需要增加注册表表项,而注 ...
- 输入系统:进程间双向通信(socketpair+binder)
一.双向通信(socketpair) socketpair()函数用于创建一对无名的.相互连接的套接子,如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1]:否则返回-1,错误码保存于e ...
- Windows进程间的通信
一.进程与进程通信 进程间通信(Interprocess Communication, IPC)是指不同的进程之间进行数据共享和数据交换. 二.进程间通信方式 1. 文件映射 注:文件映射是在多 ...
- 使用 WM_COPYDATA 在进程间共享数据
开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...
- Windows进程间各种通信方式浅谈
1 Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成. 多进程/多线程是Windows操作系 ...
- 一个进程间同步和通讯的 C# 框架
转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NE ...
- c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...
- C#进程间通讯或同步的框架引荐
这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下 0.背景简介 微软在 .NET 框架中提供了多种实用 ...
随机推荐
- Linux一些服务的启动命令
http:服务service httpd start 启动 service httpd restart 重新启动 service httpd stop 停止服务 启动ssh服务 # /etc/init ...
- appium+python自动化63-使用Uiautomator2报错问题解决
前言 appium desktop V1.7.1版本使用命令行版本启动appium后,使用Uiautomator2定位toast信息报错:appium-uiautomator2-server-v0.3 ...
- 第六周测试补交 多线程代码和sumN
1.多线程代码 要求:编译运行多线程程序,提交编译和运行命令截图 2.sumN 要求:1-N求和的截图
- 转 OJDBC驱动版本区别 [ojdbc14.jar,ojdbc5.jar跟ojdbc6.jar的区别]
OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别] 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解 ...
- Flume架构以及应用介绍(转)
在具体介绍本文内容之前,先给大家看一下Hadoop业务的整体开发流程: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出 ...
- djiango-异步发送邮件--celery
安装 pip install celery==4.2.0 # celery4.x支持django1.11以上版本 试了好几个版本 就4.2.0能发送成功 1.项目目录里新建一个celery的包cele ...
- 五大开源 Web 代理服务器横评:Squid、Privoxy、Varnish、Polipo、Tinyproxy
https://linux.cn/article-7119-1.html Web 代理软件转发 HTTP 请求时并不会改变数据流量.它们可以配置成透明代理,而无需客户端配置.它们还可以作为反向代理放在 ...
- JavaScript基础04——数组的创建及方法
数组的概念及定义 数组的概念: 一组数据,数据的组和 哪些数据的组和,只要是数据(所有数据),就可以放在数组中 数组的意义: 可以同时操作多个数据 数组 ...
- git的搭建和使用
目录: 1.git与github介绍2.下载安装Git-20-64-bit.exe3.Git常用命令 git与github介绍 Git是什么 Git是一个开源的[分布式][版本控制系统],用于敏捷高效 ...
- 洛谷 P1508 Likecloud-吃、吃、吃 题解
P1508 Likecloud-吃.吃.吃 题目背景 问世间,青春期为何物? 答曰:"甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!" 题目描述 正处在某一特定时期之中的李大水牛由于消化 ...