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

Win32 組合語言教程:進程建立與終止完整實作

     編輯:組合語言

前言

進程是 Windows 執行程式的基本單位,擁有獨立虛擬位址空間、程式碼、資料與核心物件。本文說明進程結構、CreateProcess 參數詳解、進程狀態查詢與強制終止,並提供 MASM 範例實作選單驅動的進程建立/終止控制。

進程與執行緒關係

  • 進程 = 位址空間 + 資源 + 至少一條執行緒
  • Windows 建立進程時自動創建主執行緒,從模組入口點開始執行
  • 進程可呼叫 CreateThread 增加執行緒;CreateProcess 則建立全新進程

CreateProcess 參數完整解析

CreateProcess proto lpApplicationName:DWORD,
                    lpCommandLine:DWORD,
                    lpProcessAttributes:DWORD,
                    lpThreadAttributes:DWORD,
                    bInheritHandles:DWORD,
                    dwCreationFlags:DWORD,
                    lpEnvironment:DWORD,
                    lpCurrentDirectory:DWORD,
                    lpStartupInfo:DWORD,
                    lpProcessInformation:DWORD
參數說明常用值
lpApplicationName執行檔完整路徑(可為 NULL)NULL 或 "C:\Path\App.exe"
lpCommandLine命令列字串(若 lpApplicationName=NULL 則必含檔名)"notepad.exe readme.txt"
lpProcessAttributes / lpThreadAttributes安全屬性NULL(預設)
bInheritHandles子進程是否繼承父進程開啟控制碼FALSE
dwCreationFlags建立旗標:優先權、除錯、暫停啟動等NORMAL_PRIORITY_CLASS
lpEnvironment環境區塊指標NULL(繼承父進程)
lpCurrentDirectory子進程目前目錄NULL(繼承父進程)
lpStartupInfoSTARTUPINFO 結構,控制視窗外觀GetStartupInfo 填充
lpProcessInformation輸出 PROCESS_INFORMATION 結構接收 hProcess, hThread, dwProcessId, dwThreadId

PROCESS_INFORMATION 結構

PROCESS_INFORMATION STRUCT
  hProcess      HANDLE ?  ; 進程控制碼(非唯一識別碼)
  hThread       HANDLE ?  ; 主執行緒控制碼
  dwProcessId   DWORD ?   ; 進程 ID(系統唯一)
  dwThreadId    DWORD ?   ; 主執行緒 ID
PROCESS_INFORMATION ENDS

注意:進程控制碼非唯一識別碼,不可用於跨程序比對身分;進程 ID 才是唯一值。

進程狀態查詢與終止

  • GetExitCodeProcess(hProcess, &ExitCode):ExitCode == STILL_ACTIVE (259) 表進程仍在執行。
  • TerminateProcess(hProcess, uExitCode):強制終止,不會通知已載入 DLL,可能導致資源洩漏,僅作最後手段。
  • 使用完控制碼必須 CloseHandle 釋放核心物件參考計數。

範例程式:選單控制 msgbox.exe 進程

主視窗選單提供「Create Process」與「Terminate Process」。啟動時呼叫 CreateProcess 執行 msgbox.exe,終止前以 GetExitCodeProcess 確認存活。WM_INITMENUPOPUP 動態啟用/灰化選單項反映進程狀態。

關鍵程式碼片段

WM_INITMENUPOPUP:選單狀態同步

.ELSEIF uMsg==WM_INITMENUPOPUP
  invoke GetExitCodeProcess, processInfo.hProcess, ADDR ExitCode
  .if eax==TRUE
    .if ExitCode==STILL_ACTIVE
      invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_GRAYED
      invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_ENABLED
    .else
      invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_ENABLED
      invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_GRAYED
    .endif
  .else
    invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_ENABLED
    invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_GRAYED
  .endif

WM_COMMAND - 建立進程

.if ax==IDM_CREATE_PROCESS
  .if processInfo.hProcess!=0
    invoke CloseHandle, processInfo.hProcess
    mov processInfo.hProcess, 0
  .endif
  invoke GetStartupInfo, ADDR startInfo
  invoke CreateProcess, ADDR programname, NULL, NULL, NULL, FALSE,
      NORMAL_PRIORITY_CLASS, NULL, NULL, ADDR startInfo, ADDR processInfo
  invoke CloseHandle, processInfo.hThread   ; 不需主執行緒控制碼,立即關閉

WM_COMMAND - 終止進程

.elseif ax==IDM_TERMINATE
  invoke GetExitCodeProcess, processInfo.hProcess, ADDR ExitCode
  .if ExitCode==STILL_ACTIVE
    invoke TerminateProcess, processInfo.hProcess, 0
  .endif
  invoke CloseHandle, processInfo.hProcess
  mov processInfo.hProcess, 0

實作要點總結

  1. STARTUPINFO 重用:GetStartupInfo 取得父進程啟動參數,傳給子進程保持一致外觀。
  2. 控制碼管理:主執行緒控制碼若不需等待執行緒結束,應立即 CloseHandle;進程控制碼需保留以供後續查詢/終止,最後於 WM_DESTROY 或終止時關閉。
  3. 錯誤處理:範例簡化省略 CreateProcess 返回值檢查,實務上必須驗證。
  4. TerminateProcess 副作用:DLL 不會收到 DLL_PROCESS_DETACH,可能遺留共享記憶體、檔案鎖定等資源,僅在必要時使用。

總結

掌握 CreateProcess 複雜參數、PROCESS_INFORMATION 欄位語意、進程狀態查詢與終止機制,並養成嚴格的控制碼管理習慣,是開發多進程 Windows 應用程式的基礎能力。

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