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

原文地址

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值