程序遍歷和程序間的操作

2021-09-25 07:29:08 字數 2407 閱讀 3765

程序遍歷前先獲取程序快照

**例子如下:具體api使用查csdn

//建立程序快照(獲取系統正在執行的程序資訊,執行緒資訊等)

//第二個引數乙個程序id號,用來指定要獲取哪乙個程序的快照,當獲取系統程序列表或獲取當前程序快照時可以設為0

if (hprocesssnap == invalid_handle_value)

processentry32 sprosnap;

sprosnap.dwsize = sizeof(sprosnap);

//從程序快照中獲取第乙個程序資訊

bool bret = process32first(hprocesssnap, &sprosnap);

if (bret)

while (bret);

}

執行緒和模組遍歷和程序遍歷類似

執行緒遍歷

createtoolhelp32snapshot(th32cs_snapthread, 0);//建立執行緒快照

thread32first(hsnapshot, &ppe);//獲取第乙個執行緒

thread32next(hsnapshot, &ppe);//獲取下乙個執行緒

模組遍歷

createtoolhelp32snapshot(th32cs_snapmodule, 0);//建立模組快照

module32first(hsnapshot, &ppe);//獲取第乙個模組

module32next(hsnapshot, &ppe);//獲取下乙個模組

視窗遍歷

hwnd hwnd = ::getdesktopwindow();//獲取桌面視窗控制代碼,因為桌面是最後乙個視窗

hwnd hnext = ::getwindow(hwnd, gw_child);//獲取桌面上乙個視窗控制代碼

do ;

::getwindowtext(hnext, szbuff, maxbyte);

dword dwprocid = 0;

dword dwthreadid = getwindowthreadprocessid(hnext, &dwprocid);

cstring csfmt;

csfmt.format(_t("procid:%d name:%s"),

dwprocid,

szbuff);

outputdebugstring(csfmt);

hnext = ::getnextwindow(hnext, gw_hwndnext);

} while (hnext != null);

程序間讀寫和修改記憶體屬性

int naddr = getdlgitemint(edt_addr);//從控制項獲取位址

//1. 查詢視窗

hwnd hwnd = ::findwindow(null, _t("testmemory"));

//2. 拿到程序id

dword dwprocessid;

::getwindowthreadprocessid(hwnd, &dwprocessid);

//3. 開啟程序

handle hprocess = ::openprocess(

process_all_access,

true,

dwprocessid);

//修改記憶體屬性

dword dwoldprotect = 0;

bool bret = virtualprotectex(

hprocess, //程序控制代碼

(lpvoid)naddr, //修改記憶體屬性的位址

1,//修改整個分頁(修改是按分頁單位修改的,寫1個位元組也會修改乙個分頁)

page_execute_readwrite,//修改為讀寫許可權

&dwoldprotect);

if (!bret)

//4. 寫入資料

char chbyte = 0xeb;

bret = writeprocessmemory(

hprocess, //程序控制代碼

(lpvoid)naddr, //寫入記憶體的位址

&chbyte, //寫入的資料

sizeof(chbyte), //寫入資料的大小

null);

if (!bret)

//還原原來的記憶體屬性

bret = virtualprotectex(

hprocess, //程序控制代碼

(lpvoid)naddr, //修改記憶體屬性的位址

1,//修改整個分頁

dwoldprotect,

&dwoldprotect);

程序間的操作

vfork 函式建立子程序時永遠是子程序先執行,父程序後執行,並且子程序必須要指定退出方式即exit 1 用fork來建立程序時子程序與父程序隨機執行,所以要避免子程序成為孤兒程序就需要乙個函式wait status 這樣就能保證父程序比子程序晚結束。殭屍程序 子程序結束之後沒有被父程序 孤兒程序 ...

Linux 程序間關係和守護程序

程序組是乙個或多個程序的集合。通常與乙個作業相關聯,可以接收來自同一終端的各種訊號。我們知道,每個程序都有乙個程序id存放在task struct中,程序組也有程序組id,是唯一的。乙個執行緒組擁有主線程,主線程id就是執行緒組id,類似地,程序組也有乙個組長程序,組長程序的id就是程序組id。組長...

作業系統的多程序組織 程序間切換

使用者使用計算機就是啟動了一堆程序 使用者管理計算機就是管理這一堆程序 即根據pcb 根據狀態形成不同的佇列放在不同的位置。多個程序如何組織呢?用pcb放在不同的佇列中 就緒 阻塞 用狀態轉化來推進多個程序的執行 排程選擇下乙個程序,得到下乙個程序的pcb,把上乙個程序的執行現場儲存起來,把下乙個程...