加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-05-25 20:45:07)
标签:

it

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

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有