微軟開放的win32 api 接口沒有提供掛起進程和恢復進程的接口,原本第一個想到的解決方式是遍歷進程下的所有線程,而後掛起。可是線程是否掛起,什麼時機掛起最終是由windows的線程調度器決定的,這樣手動去處理,可能會出現沒法預料的問題,爲保穩妥須要另尋他法。windows
其實windows應用層部分的最底層並不是api接口層,win32 api 是調用可執行體層(非內核層)實現功能的,其模塊名爲Ntdll,該模塊提供了應用層調用內核模塊的功能,實現了安全的從ring3到ring0的的過程。選一個版本的WDK(微軟官網能夠自由獲取)安裝,能夠找到相關的函數定義,咱們用NtSuspendProcess和NtResumeProcess兩個函數。如今咱們有了模塊名和函數名,經過win32 api 獲取模塊中函數的地址便可調用。api
第一步,定義函數指針類型typedef LONG(NTAPI *NTProcessCtrl)(HANDLE hProcess)(由於要調用的兩個函數聲明相同,全部使用一個類型便可);安全
第二步,經過GetProcAddress和GetModuleHandle兩個函數獲取地址,例:(NTProcessCtrl)GetProcAddress(GetModuleHandle(TEXT("ntdll")), "NtSuspendProcess");函數
第三步,沒有第三步,獲取到函數指針後調用便可。線程
備註:ntdll 函數是非公開的,因此可能會發生變化,須要注意。指針