1.進程:
進程是一個正在運行的程序的實例,由兩部分組成:一個是操作系統用來管理進程的內核對象,一個是地址空間,包含所有可執行模塊或dll模塊的代碼和數據,還包含動態分配的內存空間,如線程堆棧和堆。
進程是不活躍的,必須由線程來執行進程空間地址中的代碼,每個線程都有它自己的一組CPU寄存器和自己的堆棧,每個進程至少有一個線程,如果沒有線程執行進程空間地址的代碼,進程就沒有存在的意義了,系統會回收沒有現成的進程。
2.windows應用程序和main函數:
windows支持兩種應用程序,一個是圖形界面程序(GUI),一個是控制檯用戶界面程序(CUI),系統根據鏈接開關,來判定是那種類型的程序,如果鏈接開關室/SUBSYSTEM:CONDOLE表示CUI,如果是/SUBSYSTEM:WINDOWS是GUI程序,兩種鏈接開關,間接決定應用程序啓動時進入哪個進入點函數,進入點函數有4個:
WinMain,wWinMain, main, wmain。如果設置了鏈接開關,GUI會找WinMain或wWinMain,如果是CUI找main或wmain,如果找不到對應的函數,就會報錯,啓動失敗。如果靈活一點就不設置鏈接開關,應用程序會根據代碼中的入口點函數,自動確定程序的類型。使用VS的同學可以在鏈接->系統->子系統中設置。
3.進程的實例句柄:
研究下進程創建的流程:首先加載每個可執行文件(exe)或dll文件,這些文件都被賦予一個獨一無二的實例句柄,系統分配實例句柄後,可以通過函數:HMODULE GetModuleHandle(OCTSTR pszModule):來獲取實例句柄,這個實例句柄比較特殊,返回了系統將可執行文件的映像加載到進程地址空間時使用的基本地址空間,所以通過此函數可以獲取加載的基地址。此函數的使用爲傳遞要獲取的可執行文件的名字,或者傳遞NULL,傳遞NULL表示要獲取調用此代碼的基地址。下面帖下代碼:
4.進程的命令行:
當一個新進程創建時,他要傳遞一個名兩行,可以通過函數PTSTR GetCommandLine();獲取該命令行。
5.進程環境變量:
環境變量可以替代長字符創等,類似系統層面的define定義。每個進程都有一個與他有關的環境塊,環境塊是進程的地址空間中分配的一個內存塊,一般都是a = b,中間=表示環境變量a用於表示b。
6.當前進程的目錄:
可以通過函數:DWORD GetCurrentDirectory( DWORD cchCurDir, PTSTR pszCurDir),獲取當前目錄
7.終止程序運行:
a.通過主程序進入點函數返回,b.通過一個線程調用ExitProcess函數,c.另一個線程調用TerminateProcess函數。
當進程終止運行時,下列操作將啓動運行:
1).進程中剩餘的所有線程全部終止運行
2).進程指定的所有用戶對象和GDI對象均被釋放,所有內核對象均被關閉,如果其他進程打開了這些句柄,那麼內核對象不會撤銷。
3).進程的退出代碼將從STILL_ACTIVE改爲傳遞給ExitProcess或TeminateProcess的代碼。
4).進程內核對象的狀態變成收到通知的狀態。
5).進程內核對象的使用計數減1.
書籍引用:Windows核心編程