原文地址
https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms(v=vs.85).aspx
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
源进程句柄,PROCESS_DUP_HANDLE 权限打开- hSourceHandle
源句柄- hTargetProcessHandle
目标进程句柄,同样的权限- lpTargetHandle
指向用于接收生成的句柄的内存空间,在目标进程的环境中是合法的。
如果为NULL,执行复制操作,但是返回对应的句柄值。新编码的程序不建议这样使用。
- dwDesiredAccess
请求的权限,如果dwOptions 指定DUPLICATE_SAME_ACCESS 标志,否则,可以指定的标志的类型依赖于要被复制的句柄对应的对象的类型。- bInheritHandle
可继承?- dwOptions
DUPLICATE_CLOSE_SOURCE—->关闭源
DUPLICATE_SAME_ACCESS—–>同样的权限- 返回值
成功返回值非0- remarks
复制句柄引用相同的源对象。因此,任何对于对象的改变都体现到相同的句柄。例如,复制文件句柄,当前文件位置是相同的。如果想不同,调用CreateFile 来创建对于同一个文件有同样的访问权限的句柄。
- Duplicate Handle 可以拷贝的句柄有以下类型:
AccessToken,Changenotification,CommunicationsDevice,Consoleinput,consolescreenbuffer,Desktop,Event,File,Filemapping,Job,Mailslot,Mutex,Pipe,Process,Registrykey,Semaphore,Thread,Timer,Transaction,Windowstation.- 不可以复制以下类型的对象:
I/O 完成端口,套接字(应该使用WSADuplicateSocket)- dwDesiredAccess 指定了新句柄的访问权限。这涉及到对象的访问权限的问题。在某些情况下,新生成的句柄可以有比之前的句柄更多的访问权限。然而,其它的情况下,不可以超过原来的权限,比如文件句柄,之前是只读,新生成的权限不可以是读写权限。
- 为了在源进程的环境中关闭一个句柄,使用下面的方法调用DuplicateHandle 函数:
DuplicateHandle(hSourceProcessHandle,hSourceHandle,NULL,NULL,0,FALSE,DUPLICATE_CLOSE_SOURCE);- 代码示例
#include <windows.h> DWORD CALLBACK ThreadProc(PVOID pvParam); int main() { HANDLE hMutex = CreateMutex(NULL, FALSE, NULL); HANDLE hMutexDup, hThread; DWORD dwThreadId; DuplicateHandle(GetCurrentProcess(), hMutex, GetCurrentProcess(), &hMutexDup, 0, FALSE, DUPLICATE_SAME_ACCESS); hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID) hMutexDup, 0, &dwThreadId); // Perform work here, closing the handle when finished with the // mutex. If the reference count is zero, the object is destroyed. CloseHandle(hMutex); // Wait for the worker thread to terminate and clean up. WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return 0; } DWORD CALLBACK ThreadProc(PVOID pvParam) { HANDLE hMutex = (HANDLE)pvParam; // Perform work here, closing the handle when finished with the // mutex. If the reference count is zero, the object is destroyed. CloseHandle(hMutex); return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218641.html原文链接:https://javaforall.net
