win32 4 程序建立 控制

2021-08-30 08:46:18 字數 3588 閱讀 5223

當系統啟動後,建立乙個程序:explorer.exe 也就是桌面程序.

當使用者雙擊某乙個exe時,explorer 程序使用createprocess函式建立被雙擊的exe,也就是說,我們在桌面上雙擊建立的程序都是explorer程序的子程序.

bool createprocess(

lptstr lpcommandline, // command line string

lpsecurity_attributes lpprocessattributes, // sd

lpsecurity_attributes lpthreadattributes, // sd

bool binherithandles, // handle inheritance option

dword dwcreationflags, // creation flags

lpvoid lpenvironment, // new environment block

lpctstr lpcurrentdirectory, // current directory name

lpstartupinfo lpstartupinfo, // startup information

lpprocess_information lpprocessinformation // process information

);

當程序的空間建立完畢,exe與匯入表中的dll都正確載入完畢後,會建立乙個執行緒

當執行緒得到cpu的時候,程式就正開始指向了,eip的初始值設定為:imagebase + oep

handle createthread(

psecurity_attributes psa,

dword cbstack,

pthread_start_routine pfnstartaddr,

pvoid pvparam,

dword fdwcreate,

pdword pdwthreadid);

當程序建立成功後,會將程序控制代碼、主線程控制代碼、程序id以及主線程id儲存在

typedef struct _process_information

process_information;

也就是,createprocess的最後乙個 out 引數

到此,整個程序建立結束

例項**:

startupinfo si = ;

process_information pi;

si.cb = sizeof(si);

tchar szcmdline = text(" ");

bool res = createprocess(

text("c://program files//internet explorer"),

szcmdline,

null,

null,

false,

create_new_console,

null,

null, &si, &pi);

用來設定要建立的應用程式的屬性,比如可以指定新建立的控制台程式的標題等待。

一般情況,只要為第乙個成員賦值就可以了.

si.cb = sizeof(si);
關於控制代碼和id

都是系統分配的乙個編號,控制代碼是客戶程式使用 id主要是系統排程時使用.

呼叫closehandle關閉程序或者執行緒控制代碼的時候,只是讓核心計數器減少乙個,並不是終止程序或者執行緒.程序或執行緒將繼續執行,直到它自己終止執行。

程序id與執行緒id 是不可能相同。但不要通過程序或者執行緒的id來操作程序或者執行緒,因為,這個編號是會重複使用的,也就是說,當你通過id = 100這個編號去訪問乙個程序的時候,它已經結束了,而且系統將這個編號賦給了另外乙個程序或者執行緒.

終止程序的三種方式:

void exitprocess(uint fuexitcode) //程序自己呼叫

bool terminateprocess(handle hprocess, uint fuexitcode); //終止其他程序

exitthread //終止程序中的所有執行緒,程序也會終止

獲取程序的退出碼:

bool getexitcodeprocess(handle hprocess, pdword pdwexitcode);

程序中剩餘的所有執行緒全部終止執行

程序指定的所有使用者物件均被釋放,所有核心物件均被關閉

程序核心物件的狀態變成收到通知的狀態

程序核心物件的使用計數遞減1

resumethread(ie_pi.hthread);//恢復執行

使用程序上下文改變程序

context contx;

contx.contextflags = context_full;

getthreadcontext(ie_pi.hthread, &contx);

//獲取入口點

dword dwentrypoint = contx.eax;

//獲取imagebase

char* baseaddress = (char *)contx.ebx + 8;

memset(szbuffer, 0, 256);

readprocessmemory(ie_pi.hprocess, baseaddress, szbuffer, 4, null);

resumethread(ie_pi.hthread);

Linux程序控制 程序建立

linux下建立程序的方式有三種,通過fork vfork clone系統呼叫實現程序的建立 1.fork fork函式用於建立乙個新的程序,其建立的程序和當前程序為父關係,子程序建立自己的task struct 之後初始化子程序的互斥變數 cpu定時器 自旋鎖 掛起訊號 程序資料結構等並且設定程序...

程序控制 程序建立 程序終止 程序等待 程式替換

程序建立 fork vfork vfork 的子程序不能在main函式中return退出 fork 和 vfork clone 同樣可以建立程序或者執行緒,它的引數更多,功能更強大 在核心中都是呼叫 do fork 實現程序的建立,只是引數不同 fork 要建立 pcb,虛擬位址空間,頁表 程序終止...

win32建立子程序方法

看到網上有乙個示例,我查了先關函式,做了一些注釋,自己學習下 include include include using namespace std pragma comment lib,ws2 32 int main 該結構用於指定新程序的主視窗特性 si.cb sizeof si process...