學習《Windows 程式設計》筆記,整理核心觀念與程式碼範例。
DuplicateHandle 跨進程共享。main,實際由 C/C++ 執行期啟動程式呼叫並初始化執行期庫。CreateProcess 建立進程:建立核心物件(計數=1)、虛擬空間、載入代碼、建立主執行緒、啟動執行期→呼叫 main。成功回傳 TRUE。STARTUPINFO 傳遞顯示資訊(影響 GUI 視窗狀態)。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); }
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);
BOOL TerminateProcessFromId(DWORD dwId) {
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
BOOL ret = h ? TerminateProcess(h, 0) : FALSE;
CloseHandle(h); return ret;
}
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(); } }
啟動 Testor,首次掃描目標值,顯示位址列表;再次掃描縮小範圍;最終以 WriteProcessMemory 修改指定位址值。核心函式:CompareAPage(逐頁比對)、FindFirst/FindNext、WriteMemory。完整代碼見文中。
本章釐清進程/執行緒/記憶體/核心物件關係,實作進程建立、列舉、終止與跨進程記憶體操作,奠定 Windows 系統程式開發基礎。