DuplicateHandle


功能:將一個進程內的偽句柄,轉化為可以用來進程間通信的實句柄

BOOL DuplicateHandle(
  HANDLE hSourceProcessHandle,
  HANDLE hSourceHandle,
  HANDLE hTargetProcessHandle,
  LPHANDLE lpTargetHandle,
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  DWORD dwOptions
);

第一個參數是當前的源進程句柄,

第二參數是當前的資源句柄,

第三個是目標進程的句柄,

第四個是你要得到的目的句柄,這里應該是一個變量,使用指針,DuplicateHandle函數會將得到的句柄設置到這個參數上,

第五個是訪問的方式,

第六個參數是得到的句柄能不能被得到的其的進程的子進程繼承。

如果第七個參數是DUPLICATE_SAME_ACCESS flag標志,那么這個參數將被忽略,

1. DuplicateHandle獲得一個進程句柄表中的一個記錄項,然后在另一個進程的句柄表中創建這個記錄項的一個副本。

2. DuplicateHandle 中dwOptions參數可以指定DUPLICATE_SAME_ACCESS和DUPLICATE_CLOSE_SOURCE標志。如果指定DUPLICATE_SAME_ACCESS標志將希望目標句柄擁有與源進程的句柄一樣的訪問掩碼。如果指定DUPLICATE_CLOSE_SOURCE標志,會關閉源進程的句柄。使用這個標志,內核對象計數不會受到影響。

3. DuplicateHandle 函數與繼承一樣,目標進程並不知道它現在能訪問一個新的內核對象,所以源進程以某種方式通知目標進程。與繼承不一樣的是,源進程不能使用命令行參數或更改目標進程的環境變量。

4. 可以利用DuplicateHandle修改內核對象的訪問權限

5.絕對不能使用CloseHandle函數關閉通過phTargetHandle參數返回的句柄。

 

 

將11.exe中的線程句柄復制,通過22.exe輸出復制的句柄,結束11.exe中的線程

例子:22.exe

#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <process.h>
using namespace std;

int main (void)
{
	HANDLE hRecv;

	cout << "請輸入復制過來的句柄 : "<< endl;
	cin >> hRecv;

	TerminateThread(hRecv, 0);

	system("pause");
	return 0;
}

例子:11.exe

#include <iostream>
#include <windows.h>
#include <process.h>
#include <TlHelp32.h>
using namespace std;

unsigned __stdcall thread (void * lpPragma);
HANDLE GetProcessHandle(LPCTSTR szName);

int main (void)
{
    HANDLE hThread;
    hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL);
    cout << "my thread handle: " << hThread << endl;

    HANDLE hTarget;


    //你是不是想說這里的hThread與調用DuplicateHandle相關?
    if (DuplicateHandle (GetCurrentProcess(), hThread , GetProcessHandle(L"22.exe"), &hTarget, 0, FALSE, DUPLICATE_SAME_ACCESS ) )
        cout << "句柄復制成功, 其句柄值為:" << hTarget << endl;

    cin.get();
    return 0;
}

unsigned __stdcall thread (void * lpPragma)
{
    while (1)
    {
        Sleep (500);
        cout << "terminal me" << endl;
    }

    return 0;
}

HANDLE GetProcessHandle(LPCTSTR szName)
{
    HANDLE hSanpshot;
    hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if ( INVALID_HANDLE_VALUE == hSanpshot )
    {
        return NULL;
    }

    PROCESSENTRY32 pe;
    BOOL bOk;
    pe.dwSize = sizeof(pe);

    bOk = Process32First (hSanpshot, &pe);
    if (!bOk)
        return NULL;

    do {
        if ( !wcscmp (pe.szExeFile, szName) )
        {
            return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
        }
        bOk = Process32Next (hSanpshot, &pe);
    }while (bOk);

    return NULL;
}

 


免責聲明!

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



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