DuplicateHandle()复制句柄函数的用法
(2011-05-25 20:45:07)
标签:
it |
DuplicateHandle()复制句柄函数的用法
很多像我一样的菜鸟起初都不知道DuplicateHandle()的用法和为何要使用DuplicateHandle()函数,现在我在这里总结一下:
BOOL WINAPI DuplicateHandle( hSourceHandle:要传递的内核对象句柄 hTargetProcessHandle:目标进程内核句柄 lpTargetHandle:接收内核对象句柄的地址(先随便声明一个HANDLE) dwDesiredAccess:TargetHandle句柄使用何种访问掩码(这个掩码是在句柄表中的一项) bInheritHandle:是否拥有继承 dwOptions:当设DUPLICATE_SAME_ACCESS时,表示于源的内核对象所有标志一样,此时wDesiredAccess可标志为0 此函数能否成功调用还要看你是否有足够的权限去操作目标进程 通常目标进程的内核句柄是利用OpenProcess()得到的 HANDLE WINAPI OpenProcess( bInheritHandle:是否可继承 dwProcessId:这个ID可在资源管理器中找到,当然,我不提倡在哪里得到,或者你可以通过进程间通信的方法把PID从目标进程传给源进程 若DuplicateHandle()能成功执行,则利用进程通信把句柄值TargetHandle传给目标进程,让他知道利用该句柄使用内核对象 注意:不要试图在源进程中利用CloseHandle()关闭TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误关闭了,会产生不可预料的结果 好了,只要依照上面的做法,基本是可以正确用到DuplicateHandle()函数的 但很多菜鸟们都不知道为何要用复制句柄函数,我利用进程间通信把句柄传给目标进程不就行了吗? 这样的想法就大错特错了,我们表面上是在复制句柄值,实际上是把该句柄在源进程句柄表中的所有项复制到目标进程的句柄表中,而且使该内核对象的计数器+1了,如果只是简单的只传句柄值,目标进程的句柄表中是不会有所增加的 顺便一提,句柄表是各进程用来记录该进程的内核对象的. |