這幾天在摸程序的相關函式,本來想說寫二、三篇就結束,不過發現其實東西還蠻多的,所以先發個簡介出來,基本上所有的東西在 MSDN 上都找得到,只是要花時間去理解、去看而已。沒學過作業系統,查過網路上一些資料、翻一些書後,整理述敘如下(發現有誤也請更正):

1. program: 程式,一群程式碼集合,事實上它是死的,一直放在電腦的某個角落。

2. process: 行程,有些書籍又稱 job(工作),由 program 執行時所產生之個體。一個程式如果可以多次執行的話就有多個 process。然而每個 process 所佔用的記憶體空間並不相同;即使這二個 process 是由同一個 program 所產生,不過他們所佔用之 memory space 仍為不同。生死過程主要為新生(new)、就緒(ready)、執行(running)、等待(wating)、終結(terminated)。其中 ready、running、waiting 這三個階段可能不只經歷一次,有興趣詳情再查看作業系統相關資料。

3. thread: 執行緒,也是 CPU 基本之執行單元,同一 process 之每個 thread,可共享其程式碼、資料、檔案等系統資源。一個 process 有一個以上之 thread,若有二個以上的 thread 則稱為 multi-thread。由於系統內有多個 process 同時存在,但CPU一時間只能處理一個 process,為使執行效果自然,故交付某些 process 競爭特質去搶 CPU 使用權,具搶進 CPU 特性的就叫 thread 。

4. module: 模組,這裡的模組的確也不好解釋,一個 process 是由多個模組所組成,而這些模組大多是動態連結檔(dll) 或執行檔 (exe) 。

5. heap: 堆積,但建議不要翻它。這裡的 Heaps 和資料結構上的 heap 代表意義不同,但有程式經驗的人多少都聽過這個名詞。白話的說,heap 將它想像成一塊大塊的記憶體,是由作業系統所保留的 memory pool,若 process 前來索取就分一點給它,用完了就收回來。

現在開始介紹一些 win32 API 之 process 相關函式,主要有二個 header (tlhelp32.h 與 psapi.h) 可以達成,而這二個目前我寫的結果都是可行的。另外有個專有名詞 - snapshot,這裡我將翻成 "快照",如果覺得翻得不好的話請見諒。

--------------- 分隔線 --------------- 分隔線 ---------------  分隔線 --------------- 

1. 使用 tlhelp32.h

這個 header 裡面提供的 function 大致上有下面這些,有些使用前要先連 toolhelp.lib。

(1) CreateToolhelp32Snapshot 
      - 建立目前 process、thread、module 之快照。

(2) Heap32First

      - 獲取 process 裡分配第一個 block 之 heap 訊息。

(3) Heap32Next

      - 獲取 process 裡分配下一個 block 之  heap 訊息。

(4) Heap32ListFirst

      - 獲取特定 process 裡分配之第一個 heap 訊息。

(5) Heap32ListNext
      - 獲取特定 process 裡分配之下一個 heap 訊息。

(6) Module32First
      - 獲取 process 裡相關之第一個 module。

(7) Module32Next
      - 獲取 process 裡相關之下一個 module。

(8) Process32First
      - 獲取系統裡第一個 process 訊息。

(9) Process32Next
      - 獲取系統裡下一個  process 訊息

(10) Thread32First
      - 獲取 process 裡第一個 thread 訊息

(11) Thread32Next
      -  獲取 process 裡下一個 thread 訊息

(12) Toolhelp32ReadProcessMemory
      - 讀取其它 process 記憶體

2. 使用 psapi.h

這個 header 裡提供的 function 與 tlhelp32.h 差不多,但大多時候用 tlhelp32.h 就夠。使用時大多函式使用時都還要連到 psapi.lib。以下對於 pagefile 譯為分頁;workset 譯為工作集。

(1) QueryWorkingSet
      - 提供特定 process 裡工作集之相關資訊。

(2) QueryWorkingSetEx
      - 提供特定 process 裡工作集之額外相關資訊。

(3) EmptyWorkingSet
      - 盡可能移除 process 裡之工作集。

(4) GetWsChanges
      - 最後一次加到 process 裡之工作集之相關資訊。

(5) GetWsChangesEx
      - 最後一次加到 process 裡之工作集之額外相關資訊。

(6) InitializeProcessForWsWatch
      - 初始化監控 process 裡之工作集。

--------------------------------------------------------------

(7) EnumDeviceDrivers
      - 提供系統 device driver 之 load address。

(8) GetDeviceDriverBaseName
      - 提供 device drive 之 base name

(9) GetDeviceDriverFileName
      - 提供 device drive 之 file name

--------------------------------------------------------------

往下講之前先說明,這類型的函式如果用到 PerformanceInfo ,基本上就是存在相關 struct 裡面,該 struct 提供了記憶體使用資訊、分頁資訊、Cache 資訊、process資訊、thread 資訊等。

(10) EnumPageFiles
      - 系統裡對於每個已安裝之分頁(pagefile)呼叫 callback routine 。(列舉 pagefile)

(11) GetPerformanceInfo
      - 取得 performance 資訊。

(12) GetMappedFileName
      - 取得特定 process 裡之 memory-map 檔名。調用失敗傳回 0

(13) GetProcessImageFileName
      - 取得特定 process 裡之執行檔名

(14) GetProcessMemoryInfo
      - 取得特定 process 裡記憶體使用量。

--------------------------------------------------------------

(15) EnumProcesses
      - 列舉系統裡之 process,並提供其相關資訊。

(16) EnumProcessModules
      - 列舉 process 裡之 module,並提供其相關資訊。

(17) EnumProcessModulesEx
      - 列舉 process 裡之 module,並提供其額外相關資訊。

(18) GetModuleBaseName
      - 取得 process 裡 module 之 base name

(19) GetModuleFileNameEx
      - 取得 process 裡之 module 檔名。

(20) GetModuleInformation
      - 取得 process 裡之 module 資訊。

--------------- 分隔線 --------------- 分隔線 ---------------  分隔線 --------------- 

整理這篇花了我許多時間,不是只有單純的從 MSDN 去翻成中文,不然也不會翻得這麼差。其中還查了許多觀念和名詞,限於篇幅這些就不放上來了。不過光是看完這些函式簡介,大概可以知道那些外掛、插件是怎麼做的,目前推測應有三種方法左右,於此便不再多談。

參考資料:

1. The Windows Process Tool Help Library Win32 Programming

2. Win32 Thread Attribute Support

3. MSDN - ToolHelp Function

4. MSDN - PSAPI Function

edisonx 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 路人甲
  • very good!

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼