轉自:https://blog.csdn.net/bxhj3014/article/details/2082255
一、進程的概念
進程是是一個正在運行的程序的實例,是系統分配資源的單位(線程是執行的單位),包括內存,打開的文件、處理機、外設等,進程由兩部分組成:
1. 進程的內核對象:即我們通常所講的PCB(進程控制塊),該結構只能由該內核訪問,他是操作系統用來管理進程的一個數據結構,操作系統通過該數據結構來感知和管理進程;它的成員負責維護進程的各種信息,包括進程的狀態(創建、就緒、運行、睡眠、掛起、僵死等)、消息隊列等;同時也是系統用來存放關於進程的統計信息的地方。
2. 進程的地址空間:包含所有可執行模塊或DLL模塊的代碼和數據,以及動態內存分配的空間,如線程堆棧和堆分配的空間。共有4G,0-2G為用戶區,2-4G為系統區。
二、進程的創建過程
1、系統創建進程內核對象(PCB進程控制塊)。
2、系統為新進程創建虛擬地址空間,幫將可執行文件或任何必要的DLL文件的代碼和數據加載到該進程的地址空間。
3、系統為新進程的主線程創建一個線程內核對象(TCB線程控制塊)。
4、通過執行C/C++運行期啟動代碼,該主線程開始運行。
注:在Windows環境下,盡量用多線程而不是多進程。
三、與進程相關的API
1、創建進程
BOOL CreateProcess(
PCTSTR psApplicationName, //可執行文件的名字
PTSTR pszCommandLine, //命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //進程對象的安全性
PSECURITY_ATTRIBUTES psaThread, //線程對象的安全性
BOOL bInheritHandles, //句柄可繼承性
DWORD fdwCreate, //標識符(優先級)
PVOID pvEnvironment, //指向環境字符串
PCTSTR pszCurDir, //子進程當前目錄
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo); //進程線程句柄及ID
2、打開進程 (獲取hProcessId對應的進程的內核對象句柄)
HANDLE OpenProcess(
DWORD dwDesiredAccess, //訪問安全屬性
BOOL bInheritHandle, //繼承屬性
DWORD hProcessId); //進程ID
3、終止進程
(1)主線程的進入點函數返回
(2)進程自己終止自己
VOID ExitProcess(
UINT fuExitCode); //退出代碼
(3)終止自身進程或其他進程
BOOL TerminateProcess(
HANDLE hProcess, //進程句柄
UINT fuExitCode); //退出代碼
4、獲取進程的可執行文件或DLL對應的句柄
HMODULE GetModuleHandle(
PCTSTR pszModule); //模塊名稱
注:當參數傳NULL時獲取的是進程的地址空間中可執行文件的基地址。
5、找出某個指定窗口的創建者(線程或進程),返回創建者的ID。哪個線程創建了這個窗口,返回的就是這個線程的id號 (進程只有一個線程的話,那么線程標志符與進程標志符就是指同一個標志符)。
HANDLE GetWindowThreadProcessId(
HWND hWnd, //窗口句柄
LPDWORD lpdwProcessId); //指向創建該窗口的進程或線程的ID
6、獲取進程的運行時間
Bool GetProcessTimes(
HANDLE hProcess, //進程句柄
PFILETIME pftCreationTime, //創建時間
PFILETIME pftExitTime, //退出時間
PFILETIME pftKernelTime, //內核時間
PFILETIME pftUserTime); //用戶時間
注:返回的時間適用於某個進程中的所有線程(甚至已經終止運行的線程)。
7、獲取當前進程的一個偽句柄
HANDLE GetCurrentProcess();
注:該函數獲取當前進程的偽句柄,通常情況值為-1,只能標識當前進程內核對象, 可以復制,但不可繼承。不必調用CloseHandle()函數來關閉這個句柄。
偽句柄只能用於進程內部,如果你想得到實際得句柄,在進程間進行通訊,必需要進行轉化,調用DuplicateHandle,注意,得實句柄使用完成以后,你必須要調用CloseHandle去關閉.
8、將進程的偽句柄轉換為實句柄
HANDLE DuplicateHandle(
GetCurrentProcess(),
GetCurrentProcess(),
GetCurrentProcess(),
&hProcess,
0,
FALSE ,
DUPLICATE_SAME_ACCESS);
注:實例句柄必須要調用CloseHandle()函數來關閉這個句柄,否則有句柄泄露。
9、獲取當前進程ID
DWORD GetCurrentProcessId();
10、獲取進程優先級
DWORD GetPriorityClass(HANDLE hProcess);
11、修改進程的優先級類
BOOL SetPriorityClass(
HANDLE hProcess, //進程句柄
DWORD fdwPriority); //相對進程優先級
注1:相對線程優先級
實時: REALTIME_PRIORITY_CLASS
高: HIGH_PRIORITY_CLASS
高於正常; ABOVE_NORMAL_PRIORITY_CLASS
正常: NORMAL_PRIORITY_CLASS
低於正常: BELOW_NORMAL_PRIORITY_CLASS
空閑: IDLE_PRIORITY_CLASS
注2:只要擁有進程的句柄和足夠的權限,就能夠修改系統中運行的任何進程的優 先級類。
12、獲取指定進程已經打開的句柄的數量
BOOL GetProcessHandleCount(
HANDLE hProcess, //句柄
PDWORD pdwHandleCount); //句柄計數
13、獲取環境變量
DWORD GetEnvironmentVariable(
LPCTSTR lpName, //環境變量的名字
LPTSTR lpValue, //存放返回字符串的緩沖區
DWORD cchValue); //緩沖區的大小
注:返回值為返回字符串的長度,當緩存不足時返回所需字符串的長度。常用的系統環境變量如下:
1 WINDIR: //系統目錄 - C:\WINDOWS 2 SYSTEMROOT: //系統目錄 - C:\WINDOWS 3 SYSTEMDRIVE: //系統根目錄 - C: 4 HOMEDRIVE: //當前用戶根目錄 - C: 5 USERPROFILE: //當前用戶目錄 - C:\Users\Kandy 6 HOMEPATH: //當前用戶路徑 - \Users\Kandy 7 TMP: //當前用戶臨時文件夾 - C:\Users\Kandy\AppData\Local\Temp 8 TEMP: //當前用戶臨時文件夾 - C:\Users\Kandy\AppData\Local\Temp 9 APPDATA: //當前用戶數據文件夾 - C:\Users\Kandy\AppData\Roaming 10 PROGRAMFILES: //程序默認安裝目錄 - C:\Program Files (x86) 11 COMMONPROGRAMFILES: //文件通用目錄 - C:\Program Files (x86)\Common Files 12 USERNAME: //當前用戶名 - Kandy 13 ALLUSERSPROFILE: //所有用戶文件目錄 - C:\ProgramData 14 OS: //操作系統名 - Windows_NT 15 COMPUTERNAME: //計算機名 - KANDY-PC 16 NUMBER_OF_PROCESSORS: //處理器個數 - 4 17 PROCESSOR_ARCHITECTURE: //處理器芯片架構 - x86 18 PROCESSOR_LEVEL: //處理器型號 - 6 19 PROCESSOR_REVISION: //處理器修訂號 - 3c03 20 USERDOMAIN: //包含用戶帳號的域 - KANDY-PC 21 COMSPEC: //C:\WINDOWS\system32\cmd.exe 22 PATHEXT: //執行文件類型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 23 PATH: //搜索路徑
14、設置環境變量
DWORD SetEnvironmentVariable(
LPCTSTR lpName, //環境變量的名字
LPCTSTR lpValue); //存放變量值字符串的緩沖區
注:當環境變量lpName不存在,且lpValue不為空時,將創建一個新的環境變量。