1. 程式人生 > 其它 >Windows核心程式設計(六)程序-2

Windows核心程式設計(六)程序-2

技術標籤:Windows學習筆記

CreateProcess函式

使用CreateProcess函式來建立一個程序,首先還是建立一個Windows應用程式,並編輯以下程式碼:

# include<Windows.h>
int main()
{
	//建立程序的函式:CreateProcess
	CreateProcess();
	return 0;
}

其中的CreateProcess函式的結構如下:

WINAPI
CreateProcessW(
    _In_opt_ LPCWSTR lpApplicationName,
    _Inout_opt_ LPWSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCWSTR lpCurrentDirectory, _In_ LPSTARTUPINFOW lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation //建立的新程序視窗的相關資訊,用於返回
);

將游標放在該函式上,按F1鍵開啟幫助,即可看到有關該函式的說明:
在這裡插入圖片描述
網址連結

引數

現在開始對各個引數進行分析

lpApplicationName

表示要執行的模組的名稱。 在使用時填入的是該應用程式的路徑以及檔名,隨便找一個應用程式來進行實驗:,並填入到該函式的第一個引數中,同時要注意的是,由於該函式支援的是Unicode字元,所以要使用Unicode字元來進行填寫,同時要在所有的反斜槓前加上轉義字元,引數結果如下:

L"E:\\workspace\\x64dbg_2019_11_26\\release\\x96dbg.exe"

lpCommandLine

表示要執行的命令列,在編寫的時候可以直接把命令列傳進去,如果沒有命令列,就可以直接傳一個NULL,由於本次實驗的引數不需要命令列,則填寫的引數為NULL

lpProcessAttributes

該引數為一個指向程序安全特性的一個結構的指標,可以直接傳NULL,也可以傳入一個定義:

SECURITY_ATTRIBUTES psa = { sizeof(psa) };

傳入psa的地址 &psa

lpThreadAttributes

該引數與上一個引數類似,為執行緒的安全特性引數,傳輸方法同上,傳入一個定義:

SECURITY_ATTRIBUTES tsa = { sizeof(tsa) };

傳入tsa的地址&tsa

bInheritHandles

如果該引數為TRUE,則新程序將繼承呼叫程序中的每個可繼承控制代碼,如果該引數為FALSE,則不會繼承控制代碼,在本次實驗中傳入的是FALSE,不希望程式碼繼承控制代碼

dwCreationFlags

該引數為控制優先順序類別和流程建立的標誌,傳入的是給定的幾個巨集其中之一,這幾個巨集表示的是排程的優先順序以及建立的屬性,能填寫的流程建立標識連結,如果不需要的話可以傳入一個0

lpEnvironment

該引數為指向新程序的環境塊的指標,本次沒有使用到,所以傳入NULL,如果需要使用時,就需要對引數進行編寫

lpCurrentDirectory

該引數為程序當前目錄的完整路徑,如果該引數為NULL,則新程序將具有與呼叫程序相同的當前驅動器和目錄,本次傳入NULL

lpStartupInfo

該引數為指向STARTUPINFO或STARTUPINFOEX結構的指標 ,在使用時可以初始化一個結構:

STARTUPINFO si = { sizeof(si) };

傳入si的地址&si
該結構體的引數如下:

typedef struct _STARTUPINFOW {
    DWORD   cb;              //該結構體的位元組數
    LPWSTR  lpReserved;      //初始化為NULL
    LPWSTR  lpDesktop;       //表示名稱,要在那個桌面上啟動應用程式
    LPWSTR  lpTitle;         //控制檯標題,只能在控制檯介面使用
    DWORD   dwX;             //dwX和dwY是應用程式視窗在螢幕上的位置
    DWORD   dwY;
    DWORD   dwXSize;         //應用程式的高度與寬度,以畫素為單位
    DWORD   dwYSize;
    DWORD   dwXCountChars;   //指定子程序控制檯視窗的一個高度與寬度
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute; //子程序視窗的文字與背景色
    DWORD   dwFlags;
    WORD    wShowWindow;     //window視窗的顯示
    WORD    cbReserved2;     //保留欄位,初始化為0
    LPBYTE  lpReserved2;     //保留欄位,初始化為NULL
    HANDLE  hStdInput;       //這三個都是控制代碼,輸出,輸出以及錯誤的控制代碼
    HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFOW, *LPSTARTUPINFOW;

lpProcessInformation

該引數為指向PROCESS_INFORMATION結構的指標,表示輸出的結構,也是初始化一個結構:

PROCESS_INFORMATION pi;

並傳入pi的地址&pi
其結構如下:

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;    //程序控制代碼
    HANDLE hThread;     //執行緒控制代碼
    DWORD dwProcessId;  //程序ID
    DWORD dwThreadId;   //執行緒ID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

執行結果

引數寫完之後的結果如下:

# include<Windows.h>
int main()
{
	//建立程序的函式:CreateProcess
	SECURITY_ATTRIBUTES psa = { sizeof(psa) };
	SECURITY_ATTRIBUTES tsa = { sizeof(tsa) };
	STARTUPINFO si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	CreateProcess(L"E:\\workspace\\x64dbg_2019_11_26\\release\\x96dbg.exe",NULL,&psa,&tsa,FALSE,0,NULL,NULL,&si,&pi);
	return 0;
}

執行結果如下:
在這裡插入圖片描述
該程式正常執行

返回值

返回值為BOOL型別,表示建立是否成功