1.進程內核對象
進程的定義:一個內核對象+一個地址空間。
進程與線程 :
- 進程是惰性的,從來不做事。全部事情讓線程做
- 進程可以有一個或多個線程。
- 進程一啓動就自動創建一個線程,這個線程稱爲主線程。
- 單CPU多線程同步運行,操作系統會輪詢調度給每個線程調度時間,從而營造“併發”運行假象。多CPU則可以實現真正併發。
2.進程實例句柄
任何加載到進程地址空間中的可執行文件或者DLL文件都被賦予了一個實例句柄。 在Windows中有很多需要傳入moudle的函數: DWORD WINAPI GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize );
如何獲得hModule句柄?
1.WinMain(HINSTACE hInstan, …),main函數第一個參數就是當前進程的實例句柄.
2.傳入NULL獲取當前進程文件的全路徑。
3.通過HMODULE GetModulehandle(PTCTSTR pszMoudle)獲取加載到進程中的dll句柄。
4.通過函數地址獲得當前module句柄 :
BOOL WINAPI GetModuleHandleExW(DWORD dwFlags, LPCWSTR ModuleName, HMODULE* phModule ); 在dwFlags傳入GET_MODULE_HANDLE_EX_FLAG_FROM_ADRESS標識,將當前函數地址作爲第二個參數傳入,即可獲得當前鏈接庫module.
3.進程命令行和環境變量
系統在創建進程時,會傳一個命令行給進程,該命令行幾乎總是非空的。
第一個標記總是用於創建該進程的可執行性文件名稱。許多類型的應用程序會忽略該標記後傳給主函數。例如C運行庫執行GUI程序時。
可以通過GetCommoandLine()函數獲取命令行,我們可以通過命令行實現進程間的通信。
進程環境變量
進程都有與之關聯的環境塊,由該進程分配的內存,用於存儲環境變量,如下字符串:
用戶登錄Windows時,系統會創建外殼程序,並將一組環境字符串與之關聯,主要通過如下注冊表讀取: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment HKEY_CURRENT_USER\Environment
修改電腦環境變量生效:
增加或改動環境變量,爲了保證更改對所有應用程序生效,需要註銷重新登錄。
部分進程(資源管理器、任務欄等)可以接受WM_SETTINGCHANGE消息,可以發送該消息是指立即生效,如下: SendMessage(HWND_BROADCAST, WM_SETTINGCHAGE,0,TEXT(“Environment”))
進程環境變量的繼承與修改
通常,子進程會集承父進程的環境變量,不過也可以在創建子進程時指定繼承的環境變量。 我們平時創建的應用程序都是外殼進程的子進程,因此自動繼承了“我的電腦的環境變量”。
因爲環境變量是在進程內部分配的內存,因此我們可以再進程中修改環境變量,而不影響器父進程,windows函數如下: SetEnvironmentVariable(PTSCTR pszName, PCTSTR pszValue);
可以增加、修改或刪除某個環境變量的值,刪除時將pszValue設爲NULL。
4.進程驅動器和目錄
當前驅動器和目錄:
操作系統內部記錄着一個進程的當前驅動器和目錄,可以通過GetCurrentDirectory和SetCurrentDirectory()兩個函數獲取和設置當前目錄。
進程的當前目錄:
系統記錄着進程的當前驅動器和目錄,但是未記錄各個驅動器的當前目錄。
其通過進程的環境變量記錄,例如一個進程可以有如下環境變量:
=C:=C:\Program Files =D:=D:\Aaa
上面表明進程在C盤下的當前目錄爲\Program Files,在D盤下的當前目錄Aaa 。
舉例: 當前進程當前目錄爲C:\Program Files,而我們調用CreateFile打開D:1.txt,那麼系統就會查找環境變量=D:,如果該環境變量存在,且是Aaa那麼就嘗試打開D:\Aaa\1.txt,如果不存在該環境變量或不打開失敗則嘗試打開D盤根目錄下的1.txt文件。
設置或獲得指定盤符的當前目錄
GetFullPathName(“C:”, MAX_PATH, szDir, NULL);
通過設置環境變量值或c運行庫函數_chdir(),設置指定盤符的當前目錄。