當系統啟動後,建立乙個程序: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...