DuplicateHandle

DuplicateHandle()复制句柄函数的用法

很多像我一样的菜鸟起初都不知道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()得到的 
HANDLE WINAPI OpenProcess(    __in   DWORD dwDesiredAccess,    __in   BOOL bInheritHandle,    __in   DWORD dwProcessId ); dwDesiredAccess:决定你拥有该进程的操作权限,如果要成功用到则要填PROCESS_ALL_ACCESS或PROCESS_DUP_HANDLE 
 
bInheritHandle:是否可继承 
 
dwProcessId:这个ID可在资源管理器中找到,当然,我不提倡在哪里得到,或者你可以通过进程间通信的方法把PID从目标进程传给源进程 
 
 
 
DuplicateHandle()能成功执行,则利用进程通信把句柄值TargetHandle传给目标进程,让他知道利用该句柄使用内核对象 
 
注意:不要试图在源进程中利用CloseHandle()关闭TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误关闭了,会产生不可预料的结果 
 
 
 
好了,只要依照上面的做法,基本是可以正确用到DuplicateHandle()函数的 
 
但很多菜鸟们都不知道为何要用复制句柄函数,我利用进程间通信把句柄传给目标进程不就行了吗? 
 
这样的想法就大错特错了,我们表面上是在复制句柄值,实际上是把该句柄在源进程句柄表中的所有项复制到目标进程的句柄表中,而且使该内核对象的计数器+1了,如果只是简单的只传句柄值,目标进程的句柄表中是不会有所增加的 
 
顺便一提,句柄表是各进程用来记录该进程的内核对象的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值