首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Win32 程式運作原理(二):進程、執行緒、記憶體空間與核心物件深度解析

     編輯:關於C語言

Win32 程式運作原理(二):進程、執行緒、記憶體空間與核心物件深度解析

學習《Windows 程式設計》筆記,整理核心觀念與程式碼範例。

核心觀念貼士

  1. 每進程擁有私有虛擬位址空間,執行緒僅能存取所屬進程記憶體。
  2. 4GB 空間前 2GB (0x00000000-0x7FFFFFFF) 給使用者模式,後 2GB 給核心模式。
  3. 位址空間分使用者空間(私有)與系統空間(共享,含核心代碼、驅動、I/O 緩衝)。
  4. 處理器特權級 0~3 環,Windows 使用 Ring 0(核心)與 Ring 3(使用者)。
  5. 核心物件為使用者模式與核心模式交互的基本介面,提供命名、共享、保護、參考計數四大功能。
  6. 應用程式必須透過 API 存取核心物件,建立時回傳控制碼,進程相關,可用 DuplicateHandle 跨進程共享。
  7. 進程 = 進程核心物件(管理統計) + 私有虛擬位址空間(代碼、資料、堆、堆疊)。
  8. 程式為靜態指令集合,進程為執行期容器。
  9. 執行緒為進程內獨立執行實體,主執行緒由 OS 建立,可建立輔助執行緒。
  10. 主控台程式入口為 main,實際由 C/C++ 執行期啟動程式呼叫並初始化執行期庫。
  11. CreateProcess 建立進程:建立核心物件(計數=1)、虛擬空間、載入代碼、建立主執行緒、啟動執行期→呼叫 main。成功回傳 TRUE。
  12. 父/子進程關係,STARTUPINFO 傳遞顯示資訊(影響 GUI 視窗狀態)。

程式碼範例解析

1. CreateProcess — 啟動 cmd.exe

char szCommandLine[] = "cmd";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = TRUE;
BOOL bRet = CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE,
    CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (bRet) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess);
    printf("PID: %d, TID: %d\n", pi.dwProcessId, pi.dwThreadId); }

2. ProcessList — 列舉系統進程

HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32 = { sizeof(pe32) };
BOOL bMore = Process32First(hSnap, &pe32);
while (bMore) {
    printf("Name: %s, PID: %u\n", pe32.szExeFile, pe32.th32ProcessID);
    bMore = Process32Next(hSnap, &pe32);
}
CloseHandle(hSnap);

3. TerminateProcess — 依 PID 結束進程

BOOL TerminateProcessFromId(DWORD dwId) {
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
    BOOL ret = h ? TerminateProcess(h, 0) : FALSE;
    CloseHandle(h); return ret;
}

4. Testor — 供記憶體修改器測試的目標程式

int g_nNum; int main() { int i=198; g_nNum=1003;
while(1) { printf("i=%d, addr=%08lX; g_nNum=%d, addr=%08lX\n", ++i, &i, --g_nNum, &g_nNum); getchar(); } }

5. MemRepair — 記憶體修改器(掃描、鎖定、修改)

啟動 Testor,首次掃描目標值,顯示位址列表;再次掃描縮小範圍;最終以 WriteProcessMemory 修改指定位址值。核心函式:CompareAPage(逐頁比對)、FindFirst/FindNext、WriteMemory。完整代碼見文中。

總結

本章釐清進程/執行緒/記憶體/核心物件關係,實作進程建立、列舉、終止與跨進程記憶體操作,奠定 Windows 系統程式開發基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved