DuplicateHandle

DuplicateHan Lon lpTargetHan

DuplicateHandle
VB聲明
Declare Function DuplicateHandle Lib "kernel32" Alias "DuplicateHandle" (ByVal hSourceProcessHandle As Long, ByVal hSourceHandle As Long, ByVal hTargetProcessHandle As Long, lpTargetHandle As Long, ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwOptions As Long) As Long
說明
在指出一個現有系統對象當前句柄的情況下,為那個對象創建一個新句柄。當前句柄可能位於一個不同的進程
返回值
Long,非零表示成功,零表示失敗。會設定GetLastError
參數表
參數 類型及說明
hSourceProcessHandle Long,擁有源句柄的那個進程的句柄。如源句柄從屬於當前進程,則使用GetCurrentProcess
hSourceHandle Long,指定對象的現有句柄。
hTargetProcessHandle Long,即將擁有新對象句柄的一個進程的句柄。如源句柄從屬於當前進程,則使用GetCurrentProcess
lpTargetHandle Long,指定用於裝載新句柄的一個長整型變數
dwDesiredAccess Long,新句柄要求的安全訪問級別。如dwOptions已指定了DUPLICATE_SAME_ACCESS,那么忽略這裡的設定。可以進行的訪問由對象的類型決定,它們在不同系統對象的訪問常數表里進行了總結
bInheritHandle Long,如新句柄可由hSourceProcessHandle的子進程繼承,則為TRUE
dwOptions Long,下列常數的一個或兩個:
DUPLICATE_SAME_ACCESS 新句柄擁有與原始句柄相同的安全訪問特徵
DUPLICATE_CLOSE_SOURCE 原始句柄已經關閉。即使發生錯誤。它也要關閉
註解
在一個進程中,這個函式可根據位於不同進程內的現有句柄創建一個新句柄。可以從這兩個進程中發出對這個函式的調用。進程必須提供PROCESS_DUP_HANDLE訪問許可權,否則函式執行不能成功
句柄可以重複的對象包括控制台、檔案(包括通信設備)、檔案映射、事件、可等待計時器、互斥體、管道、進程、註冊表項、信號機以及執行緒
VC聲明
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
說明:
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:源進程核心句柄(即負責傳遞核心對象句柄的進程句柄)hSourceHandle:要傳遞的核心對象句柄hTargetProcessHandle:目標進程核心句柄lpTargetHandle:接收核心對象句柄的地址(先隨便聲明一個HANDLE)dwDesiredAccess:TargetHandle句柄使用何種訪問掩碼(這個掩碼是在句柄表中的一項)bInheritHandle:是否擁有繼承dwOptions:當設DUPLICATE_SAME_ACCESS時,表示於源的核心對象所有標誌一樣,此時wDesiredAccess可標誌為0
當設DUPLICATE_CLOSE_SOURCE時,傳輸完後,關閉源中的核心對象句柄此函式能否成功調用還要看你是否有足夠的許可權去操作目標進程通常目標進程的核心句柄是利用OpenProcess()得到的HANDLE WINAPI OpenProcess(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in DWORD dwProcessId
);
dwDesiredAccess:決定你擁有該進程的操作許可權,如果要成功用到則要填PROCESS_ALL_ACCESS或PROCESS_DUP_HANDLE
bInheritHandle:是否可繼承
dwProcessId:這個ID可在資源管理器中找到,當然,我不提倡在哪裡得到,或者你可以通過進程間通信的方法把PID從目標進程傳給源進程
若DuplicateHandle()能成功執行,則利用進程通信把句柄值TargetHandle傳給目標進程,讓他知道利用該句柄使用核心對象
注意:不要試圖在源進程中利用CloseHandle()關閉TargetHandle,因為這個TargetHandle句柄值並不屬於源進程的句柄表中的,若錯誤關閉了,會產生不可預料的結果

相關詞條

相關搜尋

熱門詞條

聯絡我們