DuplicateHandle用法


The DuplicateHandlefunction creates a duplicate handle. The returned duplicate is in the caller's process space.(從當前進程復制句柄到其他進程空間)

示例代碼:

 1 //ALL of the following code is executed by Process S.
 2 //Create a mutex object accessible by Process S.
 3 HANDLE hObjProcessS = CreateMutex(NULL, FALSE, NULL);
 4 
 5 //Open a handle to Process T's kernel object.
 6 HANDLE hProcessT = OpenProcess(PROCESS_ALL_ACCESS,
 7    FALSE, dwProcessIdT);
 8 
 9 //An uninitilized handle relative to Process T.
10 HANDLE hObjProcessT;
11 
12 //Give Process T accesss to our mutex object
13 DuplicateHandle(GetCurrentProcess(),
14    hObjProcessS,
15    hProcessT,
16    &hObjProcessT, 0, FALSE,
17    DUPLICATE_SAME_ACCESS);
18 
19 //Use some IPC mechanism to get the handle
20 //valuein hOnjProcess S into Process T
21 //We nolonger need to communicate with Process T.
22 //[Mailslot, pipe, share memory, socket. etc.]
23 //傳遞句柄的值到其他進程
24 CloseHandle(hProcessT);
25 
26 //WhenProcess S no longer needs to Use the mutex,
27 //itshould close it.
28 CloseHandle(hObjProcessS);

內核對象的句柄會在新進程中,產生一條記錄,並且該內核對象計數增加。
根據引用計數,這里會引出該函數的一種巧妙用法,文件鎖定或者叫文件占坑,原理如下:

向系統進程中,復制打開的文件句柄,內核對象在所有引用未刪除時不會銷毀。

示例代碼:

 1 #include <windows.h>
 2 
 3 BOOL OccupyFile( LPCTSTR lpFileName );
 4 
 5 int main()
 6 {
 7     OccupyFile("c:\\duplicateHandle_Test.txt");
 8 
 9     return 0;
10 }
11 
12 void RaiseToDebugP()
13 {
14     HANDLE hToken;
15     HANDLE hProcess = GetCurrentProcess();
16     if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
17     {
18         TOKEN_PRIVILEGES tkp;
19         if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
20         {
21             tkp.PrivilegeCount = 1;
22             tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
23             
24             BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
25         }
26         CloseHandle(hToken);
27     }    
28 }
29 
30 BOOL OccupyFile( LPCTSTR lpFileName )
31 {
32     BOOL    bRet;
33     
34     RaiseToDebugP();
35 
36     HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4為system pid
37 
38     if ( hProcess == NULL )
39     {
40         hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);        // OS-2K is 8
41         
42         if ( hProcess == NULL )
43             return FALSE;
44     }
45 
46     HANDLE hFile;
47     HANDLE hTargetHandle;
48 
49     hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);    
50 
51 
52     if ( hFile == INVALID_HANDLE_VALUE )
53     {
54         CloseHandle( hProcess );
55         return FALSE;
56     }
57 
58     bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle, 
59         0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
60 
61     CloseHandle( hProcess );
62 
63     return bRet;
64 } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM