DuplicateHandle函数复制对象句柄。
BOOL DuplicateHandle(
HANDLE 【hSourceProcessHandle】, | //处理与句柄进行复制 |
HANDLE 【hSourceHandle】, | // handle to duplicate |
HANDLE 【hTargetProcessHandle】, | //处理以复制到 |
LPHANDLE 【lpTargetHandle】, | //指向重复句柄的指针 |
DWORD 【dwDesiredAccess】, | //访问重复句柄 |
BOOL 【bInheritHandle】, | //处理继承标志 |
DWORD 【dwOptions】 | //可选操作 |
); |
参数
【hSourceProcessHandle】
标识包含要复制的句柄的过程。手柄必须具有PROCESS_DUP_HANDLE访问权限。有关详细信息,请参阅过程对象.
【hSourceHandle】
标识要复制的句柄。这是一个在源进程的上下文中有效的开放对象句柄。有关可以复制句柄的对象的列表,请参阅以下备注部分。
【hTargetProcessHandle】
标识接收重复句柄的过程。句柄必须具有PROCESS_DUP_HANDLE权限。
【lpTargetHandle】
指向接收重复句柄值的变量。该句柄值在目标进程的上下文中有效。如果【lpTargetHandle】为NULL,该函数将重复句柄,但不会将重复的句柄值返回给调用者。
【dwDesiredAccess】
指定新句柄所请求的访问。如果【dwOptions】参数指定了DUPLICATE_SAME_ACCESS标志,则忽略此参数。否则,可以指定的标志取决于要复制其句柄的对象的类型。对于可以为每个对象类型指定的标志,请参阅以下备注部分。请注意,新句柄可以具有比原始句柄更多的访问权限。
【bInheritHandle】
指示句柄是否可继承。如果为TRUE,则重复句柄可以由目标进程创建的新进程继承。如果为FALSE,则不能继承新的句柄。
【dwOptions】
指定可选操作。此参数可以为零,或以下标志的任意组合:
值 | 含义 |
DUPLICATE_CLOSE_SOURCE | 关闭源句柄。无论返回的任何错误状态如何,都会发生这种情况。 |
DUPLICATE_SAME_ACCESS | 忽略【dwDesiredAccess】参数。重复句柄与源句柄具有相同的访问权限。 |
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
可以通过源进程或目标进程调用DuplicateHandle.也可以在源和目标进程相同的地方调用它。例如,进程可以使用DuplicateHandle创建可继承句柄的不可重复的副本,或者具有不同于原始句柄的访问权限的句柄。
复制过程使用GetCurrentProcess函数来获取自己的句柄。要获得其他进程句柄,可能需要使用某种形式的进程间通信(例如,命名管道或共享内存)来将进程标识符传递给复制进程。该标识符然后在OpenProcess函数中使用以打开句柄。
如果调用DuplicateHandle的进程不是目标进程,则复制进程必须使用进程间通信将重复句柄的值传递给目标进程。
重复句柄与源句柄相同的对象句柄。这意味着对象的状态对于两个句柄都是相同的。例如,两个句柄的文件句柄的当前文件标记总是相同的。
DuplicateHandle可以对以下类型的对象重复句柄:
目的 | 描述 |
控制台输入 | 当指定CONIN $时,手柄由CreateFile函数返回,或者在指定STD_INPUT_HANDLE时由GetStdHandle函数返回。控制台手柄可以重复使用,只能在相同的过程中使用。 |
控制台屏幕缓冲区 | 当指定CONOUT $时,手柄由CreateFile函数返回,或者在指定STD_OUTPUT_HANDLE时由GetStdHandle函数返回。控制台手柄可以重复使用,只能在相同的过程中使用。 |
事件 | 句柄由CreateEvent或OpenEvent函数返回。 |
文件或通讯设备 | 句柄由CreateFile函数返回。 |
文件映射 | 手柄由CreateFileMapping功能返回。 |
互斥 | 手柄由CreateMutex或OpenMutex功能返回。 |
管 | 命名管道句柄由CreateNamedPipe或CreateFile函数返回。匿名管道句柄由CreatePipe函数返回。 |
处理 | 手柄由CreateProcess,GetCurrentProcess或OpenProcess功能返回。 |
注册表项 | 手柄由RegCreateKey,RegCreateKeyEx,RegOpenKey或RegOpenKeyEx功能返回。请注意,RegConnectRegistry函数返回的注册表项处理不能用于调用DuplicateHandle. |
信号 | 句柄由CreateSemaphore或OpenSemaphore函数返回。 |
线 | 手柄由CreateProcess,CreateThread,CreateRemoteThread或GetCurrentThread功能返回 |
除了STANDARD_RIGHTS_REQUIRED之外,可以在【dwDesiredAccess】参数中为不同的对象类型指定以下访问标志。请注意,新句柄可以具有比原始句柄更多的访问权限。但是,在某些情况下,DuplicateHandle无法创建具有比原始句柄更多访问权限的重复句柄。例如,使用GENERIC_READ访问创建的文件句柄不能重复,以便它具有GENERIC_READ和GENERIC_WRITE访问权限。
以下访问标志的任意组合对通信设备,控制台输入,控制台屏幕缓冲区,文件和管道的句柄都有效:
访问 | 描述 |
GENERIC_READ | 启用阅读访问。 |
GENERIC_WRITE | 启用写访问。 |
以下访问标志的任意组合对文件映射对象有效:
访问 | 描述 |
FILE_MAP_ALL_ACCESS | 指定文件映射对象的所有可能的访问标志。 |
FILE_MAP_READ | 允许将对象映射到允许读取访问的内存中。 |
FILE_MAP_WRITE | 允许将对象映射到允许写入访问的内存中。对于写入访问,当由CreateFileMapping函数创建文件映射对象时,必须指定PAGE_READWRITE保护。 |
以下访问标志的任意组合对于互斥对象是有效的:
访问 | 描述 |
MUTEX_ALL_ACCESS | 指定互斥体对象的所有可能的访问标志。 |
SYNCHRONIZE | 仅限Windows NT:允许使用任何等待功能中的互斥量句柄来获取互斥体的所有权,或者在ReleaseMutex??函数中释放所有权。 |
以下访问标志的任意组合对信号量对象有效:
访问 | 描述 |
SEMAPHORE_ALL_ACCESS | 指定信号量对象的所有可能的访问标志。 |
SEMAPHORE_MODIFY_STATE | 使用ReleaseSemaphore函数中的信号量句柄来修改信号量的计数。 |
SYNCHRONIZE | 仅限Windows NT:启用任何等待功能中的信号量句柄等待信号量的状态信号。 |
以下访问标志的任意组合对事件对象有效:
访问 | 描述 |
EVENT_ALL_ACCESS | 指定事件对象的所有可能的访问标志。 |
EVENT_MODIFY_STATE | 启用SetEvent和ResetEvent功能中的事件句柄来修改事件的状态。 |
SYNCHRONIZE | 仅限Windows NT:启用任何等待功能中的事件句柄等待事件的状态发信号。 |
以下访问标志的任何组合对注册表项的句柄都有效:
值 | 含义 |
KEY_ALL_ACCESS | 指定注册表项的所有可能的标志。 |
KEY_CREATE_LINK | 启用使用句柄创建到注册表项对象的链接。 |
KEY_CREATE_SUB_KEY | 启用使用句柄创建注册表项对象的子项。 |
KEY_ENUMERATE_SUB_KEYS | 启用使用句柄枚举注册表项对象的子项。 |
KEY_EXECUTE | 相当于KEY_READ。 |
KEY_NOTIFY | 启用使用该句柄来请求注册表项的更改通知或注册表项的子项。 |
KEY_QUERY_VALUE | 启用使用句柄查询注册表项对象的值。 |
KEY_READ | 结合STANDARD_RIGHTS_READ,KEY_QUERY_VALUE,KEY_ENUMERATE_SUB_KEYS和KEY_NOTIFY值。 |
KEY_SET_VALUE | 启用使用句柄来创建或设置注册表项对象的值。 |
KEY_WRITE | 结合STANDARD_RIGHTS_WRITE,KEY_SET_VALUE和KEY_CREATE_SUB_KEY值。 |
以下访问标志的任何组合对进程对象都有效:
访问 | 描述 |
PROCESS_ALL_ACCESS | 指定进程对象的所有可能的访问标志。 |
PROCESS_CREATE_PROCESS | 内部使用 |
PROCESS_CREATE_THREAD | 使能CreateRemoteThread函数中的进程句柄可以在进程中创建一个线程。 |
PROCESS_DUP_HANDLE | 允许将进程句柄用作DuplicateHandle函数中的源或目标进程来复制句柄。 |
PROCESS_QUERY_INFORMATION | 启用GetExitCodeProcess和GetPriorityClass函数中的进程句柄来读取进程对象中的信息。 |
PROCESS_SET_INFORMATION | 启用SetPriorityClass功能中的进程句柄来设置进程的优先级。 |
PROCESS_TERMINATE | 启用TerminateProcess功能中的进程句柄来终止进程。 |
PROCESS_VM_OPERATION | 启用VirtualProtectEx和WriteProcessMemory功能中的进程句柄来修改进程的虚拟内存。 |
PROCESS_VM_READ | 启用ReadProcessMemory功能中的进程句柄从进程的虚拟内存读取。 |
PROCESS_VM_WRITE | 启用使用WriteProcessMemory函数中的进程句柄来写入进程的虚拟内存。 |
SYNCHRONIZE | 仅限Windows NT:启用任何等待功能中的进程句柄等待进程终止。 |
以下访问标志的任意组合对线程对象有效:
访问 | 描述 |
SYNCHRONIZE | 仅限Windows NT:启用任何等待功能中的线程句柄等待线程终止。 |
THREAD_ALL_ACCESS | 指定线程对象的所有可能的访问标志。 |
THREAD_DIRECT_IMPERSONATION | 内部使用 |
THREAD_GET_CONTEXT | 启用使用GetThreadContext函数中的线程句柄来读取线程的上下文。 |
THREAD_IMPERSONATE | 内部使用 |
THREAD_QUERY_INFORMATION | 启用使用GetExitCodeThread,GetThreadPriority和GetThreadSelectorEntry函数中的线程句柄从线程对象读取信息。 |
THREAD_SET_CONTEXT | 使用SetThreadContext函数中的线程句柄设置线程的上下文。 |
THREAD_SET_INFORMATION | 启用SetThreadPriority函数中的线程句柄设置线程的优先级。 |
THREAD_SET_THREAD_TOKEN | 内部使用 |
THREAD_SUSPEND_RESUME | 启用SuspendThread或ResumeThread功能中的线程句柄来挂起或恢复线程。 |
THREAD_TERMINATE | 使用TerminateThread函数中的线程句柄终止线程。 |
也可以看看
CloseHandle, CreateEvent, CreateFile, CreateFileMapping, CreateMutex, CreateNamedPipe, CreatePipe, CreateProcess, CreateRemoteThread, CreateSemaphore, CreateThread, GetCurrentProcess, GetExitCodeProcess, GetExitCodeThread, GetPriorityClass, GetStdHandle, GetThreadContext, GetThreadPriority, GetThreadSelectorEntry, OpenEvent, OpenMutex, OpenProcess, OpenSemaphore, ReadProcessMemory, RegConnectRegistry, RegCreateKey, RegCreateKeyEx, RegOpenKey, RegOpenKeyEx, ReleaseMutex, ReleaseSemaphore, ResetEvent, ResumeThread, SetEvent, SetPriorityClass, SetThreadContext, SetThreadPriority, SuspendThread, TerminateProcess, TerminateThread, VirtualProtectEx, WriteProcessMemory