這幾天在摸程序的相關函式,本來想說寫二、三篇就結束,不過發現其實東西還蠻多的,所以先發個簡介出來,基本上所有的東西在 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