獲取真正的進程/線程句柄

来源:http://www.cnblogs.com/wanhuan/archive/2016/04/16/5398991.html
-Advertisement-
Play Games

首先在開始正文之前先介紹最簡單的獲取進程/線程句柄方法。那就是可以在創建進程/線程時獲取句柄。 創建進程/線程是獲取句柄。 //進程創建函數 BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_... ...


首先在開始正文之前先介紹最簡單的獲取進程/線程句柄方法。那就是可以在創建進程/線程時獲取句柄。

創建進程/線程是獲取句柄。

//進程創建函數

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

參數好多啊,如果想瞭解參數的具體含義可以去查看MSDN,本文不對這些參數進行詳解,但是最後一個參數除外,通過它可以獲得進程和主線程的內核句柄和ID。先來看一下PPROCESS_INFORMATION結構:

typedef struct _PROCESS_INFORMATION{

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessID;

DWORD dwThreadID;

}PROCESS_INFORMATION;

在創建進程之前,我們首先要自己定義一個PROCESS_INFORMATION變數,然後使用它的地址調用CreateProcess()函數,CreateProcess函數在返回之前會出事化結構成員。這樣我們就可以的到進程與主線程的句柄和ID了。

PROCESS_INFORMATION pi;

CreateProcess(……,&pi);

接下來就可以通過pi來獲取進程與主線程的句柄和ID。

//創建線程函數

HANDLE CreateThread(

PSECURITY_ATTRIBUTES psa,

DWORD cbStackSize,

PTHREAD_START_ROUTINE pfnStartAddr,

PVOID pvParam,

DWORD dwCreateFlags,

PDWORD pdwThreadID

);

該函數的返回值就是創建的新線程的句柄,最後一個參數即為線程ID。

接下來介紹一下在Windows系統中如何獲取進程/線程的偽句柄。

Windows提供了兩個函數來獲取進程/線程的偽句柄。

HANDLE GetCurrentProcess(); //獲取進程偽句柄

HANDLE GetCurrentThread(); //獲取線程偽句柄

調用這兩個函數會返回進程/線程內核對象的一個偽句柄,不會在進程句柄表中新建句柄,同時也不會增加進程/線程內核對象計數。

當然如果使用偽句柄進行CloseHandle()函數調用,CloseHandle會忽略此次調用。

接下來介紹將偽句柄轉換為真實句柄。

//複製內核對象句柄函數

BOOL DuplicateHandle(

HANDLE hSourceProcess,

HANDLE hSource,

HANDLE hTargetProcess,

HANDLE phTarget,

DWORD dwDesiredAccess,

BOOL bInheritHandle,

DWORD dwOptions

);

這個函數獲得一個進程句柄表中的一個記錄項,然後在另一個句柄表中創建這個記錄項的副本。

第一個參數hSourceProcess和第三個參數hTargetProcess是內核對象句柄,而且必須是進程內核對象。

第二個參數hSource可以是任何類型內核對象的句柄,但是必須和第一個參數所代表的進程相關。

第四個參數用來接收複製的句柄值。

最後三個參數用來指定內核對象在目標進程中的句柄表項,使用何種訪問許可權和繼承標誌。

若最後一個參數指定為DUPLICATE_SAME_ACCESS,表明複製後的句柄與原句柄具有相同的訪問許可權。

//獲取線程句柄

HANDLE hThread;

DuplicateHandle(

GetCurrentProcess(),

GetCurrentThread(),

GetCurrentProcess(),

&hThread,

0,

FALSE,

DUPLICATE_SAME_ACCESS

);

//獲取進程句柄

HANDLE hProcess;

DuplicateHandle(

GetCurrentProcess(),

GetCurrentProcess(),

GetCurrentProcess(),

&hProcess,

0,

FALSE,

DUPLICATE_SAME_ACCESS

);

可以看到,獲取進程和線程句柄只是傳入DuplicateHandle()的第二個參數不同。但是這個函數會增加內核對象計數,所以在使用完句柄後需要調用CloseHandle()使句柄計數減一。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在iOS開發中如果涉及到虛擬物品的購買,就需要使用IAP服務,我們今天來看看如何實現。 在實現代碼之前我們先做一些準備工作,一步步來看。 1、IAP流程 IAP流程分為兩種,一種是直接使用Apple的伺服器進行購買和驗證,另一種就是自己假設伺服器進行驗證。由於國內網路連接Apple伺服器驗證非常慢, ...
  • Sets是存儲無序的相同類型的值,你可以在順序不重要的情況下使用Sets來替代數組,或者當你需要同一個值在集合中只出現一次時。 一、Sets類型語法 寫作Set<Element>,Element是sets允許存儲的類型 創建並初始化一個空的set 如果可以推斷出它元素的類型也可以寫作 通過數組字面量 ...
  • 在學習開源中國ios 源碼時,發現其實現view controllers 的paging的方法如下: 第一、定義一個容器類的view controller,類似於UIPageViewController. 該vc的主要由兩部分組成: a 一個title view,用來表明當前內容是什麼,並且能夠相應 ...
  • 電工助手 on the App Store 新首頁,比之前的更有層次感。 重新做按鈕的陰影,縮小了陰影半徑。黑色按鈕文字比灰色好。 1. 首頁UI優化 2. 過渡動畫、界面顯示調整 3. 提升穩定性 這次審核更快,星期五下午5點左右提交,星期天上午Ready for Sale。 電工助手 on th ...
  • 現在,內核已經被我們載入進記憶體了,該是跳入保護模式的時候了。 首先是GDT以及對應的選擇子,我們只定義三個描述符,分別是一個0~4GB的可執行段、一個0~4GB的可讀寫段和一個指向顯存開始地址的段: 在之前學習保護模式時,大部分描述符的段基址都是運行時計算後填入相應位置的,因為那時我們的程式是由BI ...
  • 微信是一個在開發中經常會使用到的平臺,比如微信登錄、授權、支付、分享。今天我們來看看如何在自己的應用裡面集成微信授權。 1、微信授權的定義 微信OAuth2.0授權登錄讓微信用戶使用微信身份安全登錄第三方應用或網站,在微信用戶授權登錄已接入微信OAuth2.0的第三方應用後,第三方可以獲取到用戶的接 ...
  • 設備管理員 Device Admin 獲取DevicePolicyManager對象,通過getSystemService(DEVICE_POLICY_MANAGER),設備策略管理器 調用DevicePolicyManager對象的lockNow()方法,鎖定,此時會報 安全異常 新建一個類MyA ...
  • 在整型信號量機制中,信號量被定義為一個整形變數。除初始化外,僅能通過兩個標準的原子操作Wait(S)和Signal(S)來訪問。其通常分別被稱為P、V操作。 描述如下: P操作:S=S-1;如果S小於0,則進程進入等待狀態,否則繼續執行。 V操作:S=S+1;如果S>=0,則喚醒等待隊列中的一個等待 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...