Win32ASM-進程學習【1】

? 關于一些進程的概念就不說了。。。

?

一創建進程GreateProcess

(1).當一個進程被創建時:

①.系統為進程創建一個內核對象,并將這個對象的計數設置為1,進程對象只是一個比較小的數據結構,可以通過進程句柄來引用

②.系統為進程創建一個虛擬地址空間,并將可執行文件裝載到這個地址空間中,系統同時處理可執行文件的導入表,將導入表中所有dll文件裝入.

每個dll被裝入的時候,dll入口函數被執行,如果入口函數返回初始化失敗信息的話 ,進程的初始化失敗.

可執行文件的每個dll都被看作單獨的模塊,都被分配了一個實例句柄(實例句柄在數值上等于模塊裝入到地址空間中的線性地址)

③.系統為進程建立一個主線程,主線程將從可執行文件的的入口地址開始執行

④.對于進程來說,每一個進程對應一個進程句柄和一個進程ID

?

(2).和創建進程有關的一些結構

①STARTUPINFO

typedef struct _STARTUPINFO {
? DWORD cb;????????????????????????????????????? ;結構的長度
? LPTSTR lpReserved;?????????????????????????? ;保留字段
? LPTSTR lpDesktop;??????????????????????????? ;NT下使用,指定桌面名稱
? LPTSTR lpTitle;????????????????????????????????? ;控制臺使用指定控制臺窗口標題
? DWORD dwX;?????????????????????????????????? ;當新進程使用CW_USEDEFAULT參數創建
? DWORD dwY;?????????????????????????????????? ;窗口的時候將使用這些位置和大小屬性
? WORD dwXSize;???????????????????????????????
? ORD dwYSize;
? DWORD dwXCountChars;?????????????????;控制臺程序使用,指定控制臺窗口行數
? DWORD dwYCountChars;?????????????????;
? DWORD dwFillAttribute;???????????????????;控制臺程序使用,指定控制臺窗口背景色
? DWORD dwFlags;?????????????????????????????;標志
? WORD wShowWindow;????????????????????;窗口的顯示方式
? WORD cbReserved2;
? LPBYTE lpReserved2;
? HANDLE hStdInput;??????????????????????? ;控制臺程序使用:幾個標準句柄
? ANDLE hStdOutput;
? HANDLE hStdError;
} STARTUPINFO,
?*LPSTARTUPINFO;

在需要指定新進程的窗口時,才需要手動填寫STARTUPINFO結構(比如需要控制臺程序的輸入輸出重定位時候,可以改寫hStdInput和hStdOutput字段)

在大多數情況下,并不需要新進程的窗口有什么特殊之處,這時只需要使用GetStartupInfo獲取當前進程的STARTUPINFO結構并使用他就可以了

invoke GetStartupInfo,addr stStartupInfo

?

②.PROCESS_INFOMATION

typedef struct _PROCESS_INFORMATION
?{?
HANDLE hProcess;?
HANDLE hThread;?
DWORD dwProcessId;
DWORD dwThreadId;??? 主線程句柄
PROCESS_INFORMATION,?
*LPPROCESS_INFORMATION;

?

(3).CreateProcess

BOOL WINAPI CreateProcess(
? __in_opt??????? LPCTSTR? lpApplicationName,
? __inout_opt? LPTSTR? lpCommandLine,
? __in_opt??????? LPSECURITY_ATTRIBUTES lpProcessAttributes,
? __in_opt??????? LPSECURITY_ATTRIBUTES lpThreadAttributes,
? __in??????????????? BOOL bInheritHandles,
? __in??????????????? DWORD dwCreationFlags,
? __in_opt?????? LPVOID lpEnvironment,
? __in_opt??????? LPCTSTR lpCurrentDirectory,
? __in??????????????? LPSTARTUPINFO lpStartupInfo,
? __out???????????? LPPROCESS_INFORMATION lpProcessInformation
);

①lpApplicationName

指向一個以0結尾的字符串,指明可執行文件名,如果這個參數為NULL,那么文件名可以在老婆CommandLine參數指定的命令行參數中包含

②lpCommandLine

用來指定命令行參數,如果 lpApplicationName為NULL,那么命令行參數的第一個組成部分用來指定可執行文件名;

如果2個參數都為空,那么lpApplicationName為文件名,lpCommandLine作為命令行參數

③lpProcessAtrributes

指向一個SECURITY_ATTRIBUTES結構,用來指定新進程的安全屬性,如果進程句柄不需要被其他子進程繼承,可以在這里使用NULL

④lpThreadAtrributes

指向一個SECURITY_ATTRIBUTES結構,用來指定新進程的安全屬性,如果進程句柄不需要被其他線程繼承,可以在這里使用NULL

⑤bInheritHandles

指定當前進程句柄是否可以被新進程繼承,如果指定為TRUE,那么可以繼承,一般在這里使用FALSE

⑥dwCreationFlags

創建標志,指定新進程的優先級以及其他標志,這個參數類似于CreateThread函數中的同名參數它可以是一些標志的組合,下面列舉一些常用的標志

CREATE_NEW_CONSOLE 如果新進程是控制臺程序,那么為他新建一個控制臺窗口,而不是使用父進程的窗口

CREATE_SUSPENED? 新建進程的主線程一開始處于掛起狀態需要以后用ResumeThread函數來恢復它的執行

DEBUG_PROCESS?????????????????????? ;調試有關

DEBUG_ONLY_THIS_PROCESS

HIGH_PRIORITY_CLASS?????????????? ;指定新進程的優先級

NORMAL_PRIORITY_CLASS

REALTIME_PRIORIY_CLASS

⑦lpEnvironment

指向新進程的環境變量塊,如果這個參數指定為NULL,表示讓Windows拷貝當前進程的環境塊當做子進程的環境塊,如果程序需要將修改過的環境塊傳給子進程,可以設置這個參數

⑧lpCurrentDirectory

指向一個字符路徑,用來指定子進程的當前驅動器和當前目錄,如果指定為NULL,子進程將引用父進程的當前路徑

⑨后面2個參數分別指向前面介紹的2個結構體

---------------------------------------------------------------------------------------------------------------------------------------------------

二.結束進程

(1)ExitProcess? dwExitCode

ExitProcess只能用來結束當前進程,不能用來結束其他進程,包括當前進程創建的子進程

?

(2)TerminateProcess hProcess,dwExitCode

這個函數不推薦使用,一般僅在很極端的條件下使用,(如任務管理器用來結束響應的進程)

因為目標進程無條件結束,沒有機會進行掃尾工作,同時目標進程使用的dll文件也不會收到結束通知,所以極有可能 造成數據丟失

?

當前進程被結束時,系統將做如下工作

①進程創建或打開的所有對象句柄被關閉

②進程的所有線程被終止

③進程和進程中所有的線程狀態被改為置位狀態,以便讓WaitForSingleObject函數正常的檢測

④進程對象中的退出碼字段從STILL_ACTIVE被改為指定的退出碼

?

(3)要檢測一個進程的退出碼可以使用

GetExitCodeProcess hProcess,lpExitCode

如果函數執行成功返回退出碼到lpExitCode

如果失敗返回STILL_ACTIVE到lpExitCode

通過檢測一個子進程的退出碼是否為STILL_ACTIVE,就可以得知子進程是否已經結束,但如果需要在父進程中等待子進程結束時,就沒有必要不停的檢測退出碼

可以使用WaitForSingleObject hProcess,dwMilliseconds

dwMilliseconds指定為INFINITE就可以了,表示子進程結束前函數不會返回

?

當一個進程被結束時,并不影響它所創建的子進程,進程對象也不會馬上從內存中刪除,因為可能其他進程還需要通過進程句柄檢測進程狀態,直到使用CloseHandle函數將進程句柄關閉以后,

進程對象才是真正的被刪除了,所以當不在使用進程句柄的時候,不要忘記關閉PROCESS_INFORMATION中的進程句柄 和主線程句柄

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Object-C,NSArraySortTest,數組排序3種方式

晚上回來,繼續寫Object-C的例子,今天不打算寫iOS可視化界面的程序,太累了。剛剛dady又電話過來,老一套,煩死了。其實,我一直一個觀點,無論發生什么事情,不要整天一副不開心的樣子。開…

android中listview的一些樣式設置

在Android中,ListView是最常用的一個控件,在做UI設計的時候,很多人希望能夠改變一下它的背景,使他能夠符合整體的UI設計,改變背景背很簡單只需要準備一張圖片然后指定屬性 android:background"drawable/bg"&…

Win32ASM-進程學習【2】

獲取運行中的句柄 1.從窗口句柄中獲取進程句柄 要對進程進行某種操作,就必須首先知道該進程的句柄或者進程ID 對于自己創建的子進程來說CreateProcess函數返回了子進程句柄和進程的ID 但是如果如果要對系統中運行的某個進程進行操作,那么首先獲取他們的句柄才行 如果知道某個…

完美解決IE8有兩個進程的問題

完美解決IE8有兩個進程的問題,照以下方法設置后就只有一個進程了,沒有什么負影響哦! 方法: 1、winR,在運行框里輸入:gpedit.msc,回車進入組策略設置。 2、依次展開:計算機配置——管…

【轉】gvim配置及相關插件安裝

0.準備軟件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Win32ASM-進程學習[3]-讀寫進程空間

invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesReadinvoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesWritten hProcess 指定將要被讀寫的目標進程句柄 lpBaseAddress 目標進程中被讀寫的起始線性地址. …

MongoDB使用記錄

安裝服務 使用以下命令將MongoDB安裝成為Windows服務。筆者的MongoDB目錄為D:\Program Files\mongodb mongod --logpath "D:\Program Files\mongodb\data\logs.txt" --logappend --dbpath "D:\Program Files\mongodb\data" --directoryperdb --serviceName…

OC基礎知識

Object C 語言基礎 第一節總括 這一節是對Objective-C(以后簡稱OC)的簡要介紹,目的是使讀者對OC有一個概括的認識。 1.面象的讀者 在閱讀本文之前,應具備使用與C類似的編程語言(如C,C,JAVA)的一些經驗,同時熟悉面向對象編程。 2.OC簡介 OC是以SmallTalk為基礎,建立…

Windows使用篩選器來處理異常

很久木有管博客了 最近也沒有學什么 Dos系統下發生異常后,系統會調用int 24h服務例程,然后根據中斷的返回值決定下一步要做什么,他會在屏幕上顯示ignore Retry Fail Abort 讓用戶選擇進而進行下一步操作 這樣的話 只要應用程序截取int 24h中斷,就可以隨意的"胡作非…

Android 高級編程 RecyclerView 控件的使用

RecyclerView 是Android 新添加的一個用來取代ListView的控件,它的靈活性與可替代性比listview更好。 看一下繼承關系: ava.lang.Object ?android.view.View ?android.view.ViewGroup ?android.support.v7.widget.RecyclerViewKnown Direct …

Android下點亮LED

http://blog.csdn.net/cpj_phone/article/details/43562551轉載于:https://www.cnblogs.com/Ph-one/p/4276974.html

SEH處理異常

Win32為每個線程定義了一個線程信息塊,其中保存了線程的一些屬性數據,線程信息塊的屬性被定義為NT_TIB結構 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberDa…

Asp.net MVC 4新項目中創建area的后續操作

Asp.net MVC 4新項目中創建area后,往往HomeController與area的HomeController路由發生混淆,需要手工設置一些地方避免mvc無法識別默認路由的狀況。 無廢話具體步驟: 1. 檢查早Global.asax和\App_Start\RouteConfig.cs中是否已經自動添加了Are…

55-混沌操作法之我見:一、逆勢操作.(2015.2.7)

混沌操作法之我見:一、逆勢操作 首先談談,均線以及鱷魚線。單獨的市場價格表達了t時刻價格的個體情況,均線表達了一段時間內價格的綜合情況。t時刻的價格與均線的比較,表達了考慮了過去以及當前綜合價格的比較情況,即t…

SEH鏈和展開操作

每次我們定義了一個新的SEH異常處理回調函數,EXCEPTION_REGISTRATION結構的prev字段都被要求填寫上一個EXCEPTION_REGISTRATION結構的地址,隨著應用程序對模塊的調用一層層深入下去的時候,那么最后回調函數會形成一個SEH鏈 當程序中有多個線程在運行的時候,每個線程中都會存在各…

spring的基本知識

首先是回顧一下spring的基本知識 1、controller 控制器(注入服務) 2、service 服務(注入dao) 3、repository dao(實現dao訪問) 4、component (把普通pojo實例化到spring容器中,相當于…

vs2010 EF4.0 訪問mysql

需要安裝mysql-connector-net-6.3.5 6.8.9的安裝完后在dbfirst里找不到對應的提供程序 鏈接字符串里需要 指定下編碼(如果不是gbk的話) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 變長參數的理解

C語言里面 提供了一些宏 可以使用變長參數 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判斷一個div的邊界是否超出另外一個div的邊界

摘要&#xff1a;本文簡單介紹jquery判斷一個div的邊界是否超出另外一個div的邊界&#xff0c;如果超出邊界做出相應的處理。 1、實現效果 判斷前 判斷后 2、實現思路 實現類似的判斷&#xff0c;主要是獲取兩個div在瀏覽器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式數據

//數據定義&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一條json數據&#xff1a;令str為[{"name":"21001","password":"21001"}] User usernew User()…