DuplicateHandle 函数的使用----翻译

来源:互联网 发布:淘宝店铺宝贝详情模板 编辑:程序博客网 时间:2024/05/29 16:46

原文地址

https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724251(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 来创建对于同一个文件有同样的访问权限的句柄。

       DuplicateHanlde 可以被任意d进程调用,只要你有相应的访问权限。
       此函数可以用来在32-bit 和 64-bit 进程之间进行句柄的拷贝。句柄大小被适当设置。

  • 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;}
原创粉丝点击