Windows API之DuplicateHandle
在进程之间共享内核对象句柄的一种方法: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的更多相关文章
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- WinSpy涉及的windows api
WinSpy涉及的windows api WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄.窗口的属性.styles.类名子窗口.进程线程信息等查找功能.功能虽然不算强大,但涉 ...
- Windows API Finishing
input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- [windows菜鸟]Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- WINDOWS API 大全(二)
9. API之设备场景函数 CombineRgn 将两个区域组合为一个新区域CombineTransform 驱动世界转换.它相当于依顺序进行两次转换CreateCompatibleDC 创建一个与特 ...
- C# Windows API
API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...
- Windows API Hooking in Python
catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...
- 初识【Windows API】--文本去重
最近学习操作系统中,老师布置了一个作业,运用系统调用函数删除文件夹下两个重复文本类文件,Linux玩不动,于是就只能在Windows下进行了. 看了一下介绍Windows API的博客: 点击打开 基 ...
随机推荐
- Selenium——去掉Chrome正受到自动软件测试的控制
selenium打开chrome浏览器时,地址栏下方会出现该提示“Chrome正在受到自动测试软件的控制” public class BasicDriver { public WebDriver dr ...
- SpringMVC整合quartz,实现定时任务
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId& ...
- 淘宝Diamond架构分析
转载:http://blog.csdn.net/szwandcj/article/details/51165954 早期的应用都是单体的,配置修改后,只要通过预留的管理界面刷新reload即可.后来, ...
- python 创建类先执行metaclass父类__new__ > __init__>__call__ 然后再执行自己的__new__>__init__
class MyType(type): def __init__(self,*args,**kwargs): print("Mytype __init__",*args,**kwa ...
- Selenium webdriver Java 元素操作
本来这些东西网上一搜一大堆,但是本着收集的精神,整理一份放着吧!哈!哈!哈! 1. 输入框(text field or textarea) WebElement element = driver.fi ...
- linux 修改时间
实例:设置时间伟2008年8月8号12:00# date -s "2008-08-08 12:00:00"修改完后,记得执行clock -w,把系统时间写入CMOS date -s ...
- zh-cn en-uk表示语言(文化)代码与国家地区对照表
af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...
- 【DB2】经典SQL写法
1.环境准备 CREATE TABLE DataInfo( ID_1 ), ID_2 ) ) INSERT INTO DataInfo VALUES('A','Oracle'); INSERT INT ...
- [1-2] 把时间当做朋友(李笑来)Chapter 2 【开启自己的心智】 摘录
心智是可培养的.可发展的.甚至是可以重建的 早意识到,早些培养可以让自己起步更早些 审视一下我们自己,运用自己的心智,我们会知道每个人可以把自己划分为两部分:自己知道的与自己并不知道的.我们有的时候并 ...
- jmeter脚本开发-BeanShell Sampler与Debug Sampler
BeanShell支持java对象的调用,所以可直接通过BeanShell来调用java接口程序. BeanShell调用java接口例子 1.先编写两个简单的java类 创建java简单工程,并创建 ...