1. 程式人生 > >DuplicateHandle程序間控制代碼複製

DuplicateHandle程序間控制代碼複製

1、

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

作用:這個函式將一個程序A控制代碼表中的記錄項(核心物件)複製到另一個程序B的控制代碼表中。如果B同時得到了此記錄項(核心物件)的控制代碼值(一般通過程序間通訊,A程序將記錄項的控制代碼值傳遞給B程序),那麼在B程序中就可以訪問此記錄項(核心物件)。

引數1:源程序A核心物件的控制代碼;
引數3:目標程序B核心物件的控制代碼;

程序控制代碼的獲取:
1、如果程序是當前程序:GetCurrentProcess();
2、如果程序不是當前程序:OpenProcess(__in DWORD dwDesiredAccess,__in BOOL bInheritHandle,__in DWORD dwProcessId);其中dwProcessId可以在工作管理員中獲得,或是通過程序間通訊獲得。
3、通過程序名稱獲取程序控制代碼:

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;
}

引數2:與引數1程序相關的任何型別核心物件的控制代碼;
引數4:HANDLE變數地址,用來接收復製得到的HANDLE值,可以通過程序間通訊,將此值傳遞到目標程序B,
以用來通知程序B,可以通過此控制代碼值來訪問複製來的核心物件。

引數5:TargetHandle控制代碼使用何種訪問掩碼(這個掩碼是在控制代碼表中的一項):
      HANDLE_FLAG_INHERIT、HANDLE_FLAG_PROTECT_FROM_CLOSE;
引數6:是否擁有繼承;
引數6:當設DUPLICATE_SAME_ACCESS時,表示於源的核心物件所有標誌一樣,此時wDesiredAccess可標誌為0,
       當設DUPLICATE_CLOSE_SOURCE時,傳輸完後,關閉源中的核心物件控制代碼。

***但很多人都不知道為何要用複製控制代碼函式,我利用程序間通訊把控制代碼傳給目標程序不就行了嗎?
這樣的想法就大錯特錯了,我們表面上是在複製控制代碼值,實際上是把該控制代碼在源程序控制代碼表中的所有項複製到目標程序的控制代碼表中,而且使該核心物件的計數器+1了,如果只是簡單的只傳控制代碼值,目標程序的控制代碼表中是不會有所增加的。

附上一個例子,來源:點選開啟連結

將11.exe中的執行緒控制代碼複製,通過22.exe輸入複製的控制代碼,結束11.exe中的執行緒

例子:22.exe

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #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;
}

相關推薦

DuplicateHandle程序控制複製

1、 BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle,

程序模組控制

一、注意區別程序模組控制代碼和程序核心控制代碼 二、每個可執行檔案或者DLL檔案被裝入到某個程序地址空間後,都會有一個唯一的例項控制代碼,來表示裝入後的可執行檔案或者DLL,此時我們把這個可執行檔案或者DLL叫做程序地址空間中的一個模組。     &

獲得指定程序控制

環境是VC6.0  Win2000不能使用GetProcessHandleCount函式 /***************************************************************************/ GetProcessHand

windows核心程式設計-程序控制和如何獲得

程序控制代碼不同於程序核心物件的控制代碼 程序核心物件控制代碼:代表整個程序的 程序控制代碼:exe或者dll裝入某個程序的地址空間,有唯一的例項控制代碼,也可以叫做模組控制代碼 程序控制代碼的本質是程序模組在程序地址空間中的首地址! 一:GetModuleFileName

在DLL中獲取主程序視窗控制

有的時候難免需要在DLL中獲取主程序的視窗控制代碼,比如在DLL注入的時候等等。那麼如何在DLL中獲取主程序的視窗控制代碼呢?可以通過EnumWindows來實現。先通過GetCurrentProcessId獲取程序的PID,然後在EnumWindows中呼叫GetWind

伺服器記憶體線性增長,根據控制數查詢問題程序 伺服器記憶體佔用不斷的增加 & 工作管理員(PF使用率)不斷的增加:關注控制數(轉)

伺服器修改成nignx+xxfm之後 訪問速度變快了很多。但是伺服器記憶體每天線性增長30M左右。 網上找了很多資料都不行。根據這篇文章伺服器記憶體佔用不斷的增加 & 工作管理員(PF使用率)不斷的增加:關注控制代碼數(轉) 檢視所有程序的控制代碼數,發現xxfm.exe程序的控制代碼數有3萬多,

lsof-檢視程序控制

  [email protected]:~# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1

C# 呼叫win32API 獲取程序控制 有毛用???

private void button2_Click(object sender, EventArgs e) { Process[] ProceddingCon = Process.GetProcesses(); //獲得所有程序 Int

根據程序ID 獲取視窗控制

 using namespace System;using namespace System::Diagnostics;using namespace System::ComponentModel; Process *m_pCurProcess = Process::GetProcessById(

VMware複製ubuntu16虛擬機器時提示控制無效解決方法

第一步: 找到如下圖所示檔案:(Ubuntu16-32為虛擬機器名稱,每個人設定的不一樣,注意) 第二步: 以記事本開啟第一步找到的檔案 第三步: 修改下面圖示的一行程式碼,將"TRUE"改為"

C++通過程序名獲取程序控制

記錄下一段,比較常用的程式碼。 // 強殺定期刪除程序 void CDogThread::Quit() { // 結束強殺定期刪除程序 HANDLE hProcess = GetProcessHa

C++根據程序獲取主視窗的控制

原帖網址:http://www.cnblogs.com/ylhome/archive/0001/01/01/1529681.html // processenum.cpp : Defines the entry point for the console applica

程序控制HANDLE獲得程序主視窗的控制HWND

一個程序可以擁有很多主視窗,也可以不擁有主視窗,所以這樣的函式是不存在的,所幸的是,相反的函式是有的。所以我們可以呼叫EnumWindows來判斷所有的視窗是否屬於這個程序。  typedef struct tagWNDINFO  ​{  ​DWORD dwProc

用C#呼叫Windows API和其它程序通訊及C# 獲得另外一程式 控制控制該程式 控制其透明 窗體大小

作者:邊城浪子◎2005-01-16 關鍵字:  C#,API,FindWindow,FindWindowEx,SendMessage,程序,登錄檔 設計初衷:公司為了便於網路管理,使用了IEEE 802.1X的網路訪問控制,這樣每次開機需要輸入兩次登入密碼,於是我就研究了

獲得執行緒或者程序的真實控制的方法

上章我們講到偽控制代碼帶來的一系列麻煩,那麼怎麼辦呢 一個方法是使用duplicateHandle把偽控制代碼轉化程實控制代碼 DuplicateHandle原本是程序間複製控制代碼的函式,原理其實

根據程序控制 獲得可執行檔案路徑 的幾種方法

通過程序控制代碼,獲得可執行檔案的路徑,主要有以下幾種方法: 第一種方法:也是最常用的方法,是通過GetModuleFileNameEx函式獲得可執行檔案的模組路徑,這個函式從Windows NT 4.0開始到現在的Vista系統都能使用,向後相容性比較好。 【函式

FastReport呼叫程序控制,設定視窗置頂

應用場景 在使用第三方列印外掛,FastReport時,選擇列印xps,點選列印,彈出檔案另存為對話方塊,但是此對話方塊不會出現在軟體的最前面,而且會一直佔用程序,點選軟體介面出現假死情況。 解決方案 思路1.設定關閉列印進度視窗,此視窗會一直置頂,而且取消按鈕失效2.列印

AutoIt3 使用程序名獲取視窗控制

背景 需要用AutoIt3控制QQ音樂播放器,首先要獲取QQ音樂的視窗控制代碼 問題 WinGetHandle方法不能滿足要求 QQ音樂的Title會根據當前播放的歌曲動態改變

Windows程序控制數限制

GDIProcessHandleQuota項設定GDI控制代碼數量,預設值為2710(16進位制)/10000(10進位制),該值的允許範圍為 256 ~ 16384 ,將其調整為大於預設的10000的值。如果您的系統配置了2G或更多內容,不妨將其設定為允許的最大值 16384(10進位制);USERProc

列舉指定程序核心物件控制的C原始碼

Step 1: Enumerating handlesCall NtQuerySystemInformation with SystemHandleInformation (16). This will give you a list of handles opened