一個線程調用CreateProcess時,系統將建立一個進程內核對象,其初始使用計數爲1.進程內核對象不是進程自己,而是操做系統用來管理這個進程的一個小型數據結構——能夠把進程內核對象想象成由進程統計信息構成的一個小型數據結構。而後,系統爲新進程建立一個虛擬地址空間,並將可執行文件(和全部必要的DLL)的代碼及數據加載到進程的地址空間安全
而後,系統爲新進程的主線程建立一個線程內核對象(其使用計數爲1)。和進程內核對象同樣,線程內核對象也是一個小型數據結構,操做系統用它來管理這個線程。這個主線程一開始就會執行C/C++運行時的啓動例程,它是由連接器設爲應用程序入口的,最終會調用應用程序WinMain,wWinMain、main或wmain函數。若是系統成功建立了新進程和主線程,CreateProcess將返回TRUE數據結構
BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
lpApplicationName:指定新進程要使用的可執行文件的名稱函數
lpCommandLine:指定要傳給新進程的命令行字符串,lpCommandLine是一個非「常量字符串」的地址。在內部,CreateProcess實際上會修改咱們傳給它的命令行字符串。但在CreateProcess返回以前,它會將這個字符串還原爲原來的樣子;鑑於此,若命令行字符包含在文件映像的只讀部分,就會引發訪問違例。CreateProcess會檢查字符串中的第一個標記,並假定此標記是咱們想運行的可執行文件的名稱操作系統
lpProcessAttributes:進程內核對象安全屬性,若爲NULL,將指定默認的安全描述符;若爲非NULL,當lpProcessAttributes->bInheritHandle爲TRUE時,子進程將繼承父進程中全部可繼承的句柄;當lpProcessAttributes->bInheritHandle爲FALSE時,子進程講沒法繼承父進程中的任何句柄命令行
lpThreadAttributes:主線程內核對象安全屬性,若爲NULL,將指定默認的安全描述符;若爲非NULL,當lpThreadAttributes->bInheritHandle爲TRUE時,父進程的主線程內核對象將被繼承;當lpThreadAttributes->bInheritHandle爲FALSE時,父進程的主線程內核對象不可繼承,無論傳給lpProcessAttributes->bInheritHandle的值是多少線程
bInheritHandles:指定子進程是否能繼承父進程中可繼承的內核對象,若爲TRUE則可繼承,若爲FALSE則不可繼承調試
dwCreationFlags:標識了影響新進程建立方式的標誌(flag)。多個標誌可使用按位或起來,以便同時指定多個標誌組合code
IDLE_PRIORITY_CLASS:低orm
BELOW_NORMAL_PRIORITY_CLASS:標準對象
ABOVE_NORMAL_PRIORITY_CLASS:高於標準
HIGH_PRIORITY_CLASS:高
REALTIME_PRIORITY_CLASS:實時
DEBUG_PROCESS:父進程但願調試子進程以及子進程未來生成的全部進程
DEBUG_ONLY_THIS_PROCESS:只有在關係最近的子進程中發生特定事件時,父進程纔會獲得通知
CREATE_SUSPENDED:建立新進程的同時掛起其主線程。這樣一來,父進程就能夠修改子進程地址空間中的內存,更改子進程的主線程優先級,或者在進程執行任何代碼以前,將此進程添加到一個做業(job)中。父進程修改好子進程以後,能夠調用ResumeThread函數來容許子進程執行代碼
DETACHED_PROCESS:阻止一個基於CUI的進程訪問其父進程的控制檯窗口,並告訴系統將它的輸出發送到一個新的控制檯窗口,若是一個基於CUI的進程是由另外一個基於CUI的進程建立的,那麼默認狀況下,新進程將使用父進程的控制檯窗口
CREATE_NEW_CONSOLE:爲新進程建立一個新的控制檯窗口。若是同時指定DETACHED_PROCESS和CREATE_NEW_CONSOLE,會致使一個錯誤
CREATE_NO_WINDOWS:不要爲應用程序建立人和控制檯窗口。可使用這個標誌來執行沒有用戶界面的控制檯應用程序
CREATE_NEW_PROCESS_GROUP:修改用戶按Ctrl+C或Ctrl+Break時得到通知的進程列表
CREATE_DEFAULT_ERROR_MODE:新進程不會進程父進程的錯誤模式而使用默認的錯誤模式
CREATE_UNICODE_ENVIRONMENT:子進程的環境塊應包含Unicode字符。進程的環境塊默認包含的是ANSI字符串
CREATE_FORCEDOS:強制系統運行一個嵌入在16位OS/2應用程序中的MS-DOS應用程序
CREATE_BREAKAWAY_FROM_JOB:標誌容許一個做業中的進程生成一個和做業無關的進程
EXTENDED_STARTUPINFO_PRESENT:標誌向操做系統代表傳給lpStartupInfo參數的是一個STARTUPINFOEX結構
fdwCreate參數還容許咱們指定一個優先級類(priority class),對大多數程序都不該該這樣作——系統會爲新進程分配一個默認的優先級類,可指定的優先級以下(由低到高):
lpEnvironment:指向一塊內存,其中包含新進程要使用的環境字符串
lpCurrentDirectory:子進程的當前驅動器和目錄
lpStartupInfo:指向一個STARTUPINFO或STARTUPINFOEX結構,一般狀況下是使用默認便可(將全部成員初始化爲0,並將cb成員設爲此結構的大小)
lpProcessInformation:[out],指向一個PROCESS_INFORMATION結構,函數在返回以前,會初始化這個結構體。如前所述,建立一個新的進程,會致使系統建立一個進程內核對象和一個線程內核對象。在建立時,系統會爲每一個對象指定一個初始的使用計數1.而後,在CreateProcess返回以前,它會使用徹底訪問權限打開進程對象和線程對象,並將與之相關的句柄放入lpProcessInformation的hProcess和hThread成員中。當CreateProcess在內部打開這些對象時,每一個對象的使用計數變爲2。這意味着系統要想釋放進程對象,進程必須終止(使用計數遞減1),並且父進程必須調用CloseHandle(使用計數再次遞減1,變爲0)。相似地,要想釋放線程對象,線程必須終止並且父進程必須關閉到線程對象的句柄
CreateProcess在進程徹底初始化好以前就返回TRUE。這意味着操做系統加載程序(loader)還沒有嘗試定位全部必要的DLL。若是一個DLL找不到或者不能正確初始化,進程就會終止。由於CreateProcess返回TRUE,因此父進程不會不會注意到任何初始化問題
若失敗則返回FALSE