版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Windows程序設(shè)計基礎(chǔ)Windows程序設(shè)計基礎(chǔ)32位處理器有3種工作模式:實模式:重啟以后到載入WINDOWS以前都是實模式,純32位windows是不能進入實模式的。保護模式:保護模式提供的保護機制管理和維護自己,保護主要指對存儲器的保護。進入保護模式是每個32位系統(tǒng)必須的。虛擬86模式:為了讓以前的16位程序能在32位下運行,32位處理器就提供了虛擬86模式。第二章win32程序運行原理2.1CPU的保護模式和Windows系統(tǒng)32位處理器有3種工作模式:第二章win32程序運行原理擴展模式:1)兼容模式:該模式下,64位操作系統(tǒng)運行在32位兼容環(huán)境,能正常運行16,32位應用程序就像基本的保護模式一樣,訪問32位地址空間,但不能運行純16位實模式程序(就是不能運行虛擬86模式程序了)。
2)64位模式:在該模式下,處理器完全執(zhí)行64位指令,使用64位地址空間和64操作數(shù),運行16,32位程序必須切換到兼容模式。64位處理器系統(tǒng)管理模式:當SMI引腳為有效進入系統(tǒng)管理模式,首先保存當前的CPU上下文。它有獨立的地址空間,用來執(zhí)行電源管理或系統(tǒng)安全方面的指令。(基本模式)擴展模式:64位處理器系統(tǒng)管理模式:當SMI引腳為有效進入系32位處理器對多任務(wù)操作系統(tǒng)的支持性主要體現(xiàn)在1)在硬件上為任務(wù)之間的切換提供了良好的條件2)實現(xiàn)了多任務(wù)隔離,“進程”地址空間獨立在windows下,任務(wù)被進程取代,進程就是正在運行的應用程序的實例。但是占用cpu時間片的不是進程,而是線程。Windows的多任務(wù)實現(xiàn)32位處理器對多任務(wù)操作系統(tǒng)的支持性主要體現(xiàn)在W虛擬內(nèi)存保護模式下,32位處理器有32根地址線,處理器尋址范圍(0x00000000—0xFFFFFFFF)(232,4GB)。
32位機器上的RAM的大小很難達到4GB,windows為每個進程分配4GB的地址空間主要依靠cpu的支持。cpu在保護模式下支持虛擬內(nèi)存。它可以幫助操作系統(tǒng)將磁盤空間當作內(nèi)存空間來使用。虛擬內(nèi)存保護模式下,32位處理器有32根地址線,各進程內(nèi)的地址空間安排2GB的系統(tǒng)空間2GB的用戶空間0xFFFFFFFF0x800000000x7FFFFFFF0x00000000整個系統(tǒng)共用每個進程私有各進程內(nèi)的地址空間安排2GB的系統(tǒng)空間2GB的用戶空間0xF
用戶空間部分是進程私有地址空間,進程不能以任何方式讀、寫其他進程此部分空間中的數(shù)據(jù)。對所有應用程序,大量進程數(shù)據(jù)被保存在塊空間中而相互獨立,所以應用程序很少被其他程序打斷,使系統(tǒng)更加穩(wěn)定。
系統(tǒng)空間部分放置操作系統(tǒng)的代碼,包括內(nèi)核代碼、設(shè)備驅(qū)動代碼、設(shè)備I/O緩沖區(qū)等。系統(tǒng)空間部分在所有的進程中是共享的。在32位系統(tǒng)中,這些數(shù)據(jù)結(jié)構(gòu)被完全的保護起來,如果試圖訪問這部分內(nèi)存,訪問線程會遇到一個訪問異常。兩種地址空間區(qū)別用戶空間部分是進程私有地址空間,進程不能以任何方32位處理器共定義了4種(0-3)特權(quán)級別,或稱環(huán)。0是最高級(特權(quán)級),3級是最低級(用戶級)。為了阻止應用程序訪問或者修改關(guān)鍵的系統(tǒng)數(shù)據(jù),windows提供了兩種訪問模式:內(nèi)核模式(使用0級):系統(tǒng)程序的代碼在此模式下運行用戶模式(使用3級):用戶程序的代碼在此模式下運行內(nèi)核模式和用戶模式32位處理器共定義了4種(0-3)特權(quán)級別,或稱CPU支持的特權(quán)級類別應用程序常規(guī)擴展系統(tǒng)服務(wù)內(nèi)核級別0級別1級別2級別3在實模式下,沒有級別之分.在保護模式下,CPU有4個特權(quán)級別.
CPU支持的特權(quán)級類別應用程序常規(guī)擴展系統(tǒng)服務(wù)內(nèi)核級別0級別
雖然每個進程都有自己的4G地址空間。但內(nèi)核模式下的系統(tǒng)和設(shè)備驅(qū)動程序共用一塊虛擬地址空間。即整個系統(tǒng)共用的2G部分。虛擬內(nèi)存中的每一頁的頁屬性中都有訪問模式標記,它標識了哪一個模式下的代碼才有權(quán)限訪問該頁。系統(tǒng)地址空間的頁僅僅能夠從內(nèi)核模式訪問,所有用戶地址空間的頁都從用戶模式訪問。
當應用程序調(diào)用一個系統(tǒng)函數(shù)的時候,用戶的應用程序會從用戶模式切換到內(nèi)核模式去執(zhí)行。例如:Win32函數(shù)ReadFile最終會調(diào)用Windows內(nèi)部的從文件中讀取數(shù)據(jù)的程序代碼,因為這些代碼訪問了系統(tǒng)內(nèi)部的數(shù)據(jù),所以他們必須運行在內(nèi)核模式下。雖然每個進程都有自己的4G地址空間。但內(nèi)核模式下
內(nèi)核模式:研究WDM(WindowsDriverModel)設(shè)備驅(qū)動類
用戶模式:SDK程序設(shè)計兩種模式下的程序設(shè)計內(nèi)核模式:兩種模式下的程序設(shè)計
內(nèi)核對象是系統(tǒng)提供的用戶模式下代碼與內(nèi)核模式下代碼進行交互的基本接口。軟件開發(fā)人員會經(jīng)常的創(chuàng)建、打開和操作內(nèi)核對象。2.2內(nèi)核對象
為了管理應用程序,系統(tǒng)有必要維護一些不允許用戶應用程序直接訪問的數(shù)據(jù)。一個內(nèi)核對象就是一塊內(nèi)核分配的內(nèi)存,它只能被運行在內(nèi)核模式下的代碼訪問。內(nèi)核對象記錄的數(shù)據(jù)在整個系統(tǒng)中只有一份,故也稱系統(tǒng)資源。內(nèi)核對象是系統(tǒng)提供的用戶模式下代碼與內(nèi)核模式下代
內(nèi)核對象和普通的數(shù)據(jù)結(jié)構(gòu)間的最大區(qū)別是其內(nèi)部數(shù)據(jù)結(jié)構(gòu)是隱藏的,必須調(diào)用一個對象服務(wù)才能從此對象中得到數(shù)據(jù),或者是向其輸入數(shù)據(jù),而不能直接讀或者改變對象的內(nèi)部數(shù)據(jù)。增加這些限制來保證內(nèi)核對象包含一致的狀態(tài)。引入內(nèi)核對象,系統(tǒng)可方便的完成以下任務(wù):1)為系統(tǒng)資源提供可識別的名字。2)在進程之間共享資源和數(shù)據(jù)。3)保護資源不被未經(jīng)認可的代碼訪問。4)跟蹤對象的引用情況。在不被使用時,釋放占有空間。內(nèi)核對象和普通的數(shù)據(jù)結(jié)構(gòu)間的最大區(qū)別是其內(nèi)部數(shù)據(jù)
內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)僅能從內(nèi)核模式訪問,所以直接在內(nèi)存中定位這些數(shù)據(jù)結(jié)構(gòu)對應用程序來說是不可能的。應用程序必須使用API函數(shù)訪問內(nèi)核對象。調(diào)用函數(shù)創(chuàng)建內(nèi)核對象時,函數(shù)會返回標識此內(nèi)核對象的句柄。為了使系統(tǒng)穩(wěn)定,這些句柄和進程有關(guān),就是僅對創(chuàng)建該內(nèi)核對象的進程有效。若要多個進程共享一個內(nèi)核對象,要調(diào)用DuplicateHandle函數(shù)復制一個進程句柄傳給其他進程即可。對象句柄內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)僅能從內(nèi)核模式訪問,所以直接在
內(nèi)核對象是進程內(nèi)的資源,使用計數(shù)屬性指明進程對特定內(nèi)核對象的引用次數(shù),第一次創(chuàng)建內(nèi)核對象時,系統(tǒng)為進程分配內(nèi)核對象資源,并將該內(nèi)核對象的使用計數(shù)屬性初始化為1。打開一次使用計數(shù)加1,關(guān)閉,系統(tǒng)將使用計數(shù)減1,當系統(tǒng)發(fā)現(xiàn)引用次數(shù)是0時,它就會自動關(guān)閉資源。使用計數(shù)內(nèi)核對象是進程內(nèi)的資源,使用計數(shù)屬性指明進程對特2.3進程的創(chuàng)建進程和線程進程是一個正在運行的程序,它擁有自己的虛擬地址空間,擁有自己的代碼、數(shù)據(jù)和其他系統(tǒng)資源,如進程創(chuàng)建的文件、管道、同步對象等。一個進程也包含了一個或者多個運行在此進程內(nèi)的線程。線程是進程內(nèi)執(zhí)行代碼的獨立實體。沒有它,進程中的程序代碼是不可能執(zhí)行的。操作系統(tǒng)創(chuàng)建進行后會創(chuàng)建一個線程執(zhí)行進程中的代碼,稱主線程,它在運行過程中創(chuàng)建其他線程,一般將主線程創(chuàng)建的線程稱為該進程的輔助線程。2.3進程的創(chuàng)建進程和線程進程是一個正在運行的進程是不活潑的,一個進程要完成任何事情,必須有一個運行在它的地址空間中的線程。此線程負責執(zhí)行該進程地址空間的代碼。每個進程至少擁有一個在它的地址空間中運行的線程。對一個不包含任何線程的進程來說,它是沒有理由繼續(xù)存在下去的,系統(tǒng)會自動銷毀該進程和它的地址空間。進程是不活潑的,一個進程要完成任何事情,必須有一進程和程序程序:一連串靜態(tài)的指令進程:一個容器,它包含一系列運行在這個程序?qū)嵗舷挛闹械木€程使用的資源。進程和程序程序:一連串靜態(tài)的指令Win32進程的兩個組成部分進程內(nèi)核對象:操作系統(tǒng)使用此內(nèi)核對象來管理該進程。這個內(nèi)核對象也是操作系統(tǒng)存放進程統(tǒng)計信息的地方。私有的虛擬地址空間:此地址空間包含了所有可執(zhí)行的或者是DLL模塊的代碼和數(shù)據(jù),它也是程序動態(tài)申請內(nèi)存的地方,比如說線程堆棧和進程堆。Win32進程的兩個組成部分進程內(nèi)核對象:操作系統(tǒng)使用此內(nèi)核
應用程序必須有一個入口函數(shù),它在程序開始運行時被調(diào)用??刂婆_應用程序入口函數(shù)是main。intmain(intargc,char*argv[])
應用程序的啟動過程應用程序必須有一個入口函數(shù),它在程序開始運行時被開始主線程調(diào)用C/C++運行期啟動函數(shù)N操作系統(tǒng)調(diào)用CreateProcess函數(shù)創(chuàng)建新的進程系統(tǒng)創(chuàng)建一個進程內(nèi)核對象,使用計數(shù)初始化為1系統(tǒng)為進程創(chuàng)建主線程成功調(diào)用程序入口函數(shù)mainY結(jié)束系統(tǒng)為新進程創(chuàng)建虛擬地址空間,加載應用程序運行時需要代碼和數(shù)據(jù)開始主線程調(diào)用C/C++運行期啟動函數(shù)N操作系統(tǒng)調(diào)用CreaCreateProcess函數(shù)WIN32API函數(shù)CreateProcess用來創(chuàng)建一個新的進程和它的主線程,這個新進程運行指定的可執(zhí)行文件。
函數(shù)原型:
BOOLCreateProcess
(
LPCTSTRlpApplicationName,
//可執(zhí)行文件名稱
LPTSTRlpCommandLine,
//指定要傳遞給執(zhí)行模塊的參數(shù)
LPSECURITY_ATTRIBUTESlpProcessAttributes,//進程安全性
LPSECURITY_ATTRIBUTESlpThreadAttributes,
//進程安全性
BOOLbInheritHandles,
//指定當前進程中的可繼承句柄是否可被新進程繼承
DWORDdwCreationFlags,//指定新進程的優(yōu)先級及其他創(chuàng)建標志
LPVOIDlpEnvironment,
//指定新進程使用的環(huán)境變量
LPCTSTRlpCurrentDirectory,
//指定新進程使用的當前目錄
LPSTARTUPINFOlpStartupInfo,
//指定新進程中主窗口的位置、大小和句柄等
LPPROCESS_INFORMATIONlpProcessInformation//返回新進程的標志信息);
CreateProcess函數(shù)WIN32API函數(shù)CreatlpApplicationName:指向一個NULL結(jié)尾的、用來指定可執(zhí)行模塊的字符串。
這個字符串可以是可執(zhí)行模塊的絕對路徑,也可以是相對路徑,在后一種情況下,函數(shù)使用當前驅(qū)動器和目錄建立可執(zhí)行模塊的路徑。
這個參數(shù)可以被設(shè)為NULL,在這種情況下,可執(zhí)行模塊的名字必須處于lpCommandLine參數(shù)的最前面并由空格符與后面的字符分開。
這個被指定的模塊可以是一個Win32應用程序。如果適當?shù)淖酉到y(tǒng)在當前計算機上可用的話,它也可以是其他類型的模塊(如MS-DOS或OS/2)。lpApplicationName:指向一個NULL結(jié)尾的、lpCommandLine:指向一個NULL結(jié)尾的、用來指定要運行的命令行。
這個參數(shù)可以為空,那么函數(shù)將使用參數(shù)指定的字符串當作要運行的程序的命令行。
如果lpApplicationName和lpCommandLine參數(shù)都不為空,那么lpApplicationName參數(shù)指定將要被運行的模塊,lpCommandLine參數(shù)指定將被運行的模塊的命令行。新運行的進程可以使用GetCommandLine函數(shù)獲得整個命令行。C語言程序可以使用argc和argv參數(shù)。lpCommandLine:指向一個NULL結(jié)尾的、用來指定如果lpApplicationName參數(shù)為空,那么這個字符串中的第一個被空格分隔的要素指定可執(zhí)行模塊名。如果文件名不包含擴展名,那么.exe將被假定為默認的擴展名。如果文件名以一個點(.)結(jié)尾且沒有擴展名,或文件名中包含路徑,.exe將不會被加到后面。如果文件名中不包含路徑,Windows將按照如下順序?qū)ふ疫@個可執(zhí)行文件:
1.當前應用程序的目錄。
2.父進程的目錄。
3.Windows95:Windows系統(tǒng)目錄,可以使用GetSystemDirectory函數(shù)獲得。
WindowsNT:32位Windows系統(tǒng)目錄??梢允褂肎etSystemDirectory函數(shù)獲得,目錄名是SYSTEM32。
4.在WindowsNT中:16位Windows系統(tǒng)目錄。不可以使用Win32函數(shù)獲得這個目錄,但是它會被搜索,目錄名是SYSTEM。
5.Windows目錄??梢允褂肎etWindowsDirectory函數(shù)獲得這個目錄。
6.列在PATH環(huán)境變量中的目錄。
如果被創(chuàng)建的進程是一個以MS-DOS或16位Windows為基礎(chǔ)的應用程序,lpCommandLine參數(shù)應該是一個以可執(zhí)行文件的文件名作為第一個要素的絕對路徑,因為這樣做可以使32位Windows程序工作的很好,這樣設(shè)置lpCommandLine參數(shù)是最強壯的。如果lpApplicationName參數(shù)為空,那么這個字符dwCreationFlags:指定附加的、用來控制優(yōu)先級和進程的創(chuàng)建的標志。以下的創(chuàng)建標志可以以除下面列出的方式外的任何方式組合后指定。值:CREATE_DEFAULT_ERROR_MODE
含義:新的進程不繼承調(diào)用進程的錯誤模式。值:CREATE_NEW_CONSOLE
含義:新的進程將使用一個新的控制臺,而不是繼承父進程的控制臺。這個標志不能與DETACHED_PROCESS標志一起使用。值:CREATE_NEW_PROCESS_GROUP
含義:新進程將使一個進程樹的根進程。進程樹種的全部進程都是根進程的子進程。dwCreationFlags:指定附加的、用來控制優(yōu)先級和值:CREATE_SUSPENDED
含義:新進程的主線程會以暫停的狀態(tài)被創(chuàng)建,直到調(diào)用ResumeThread函數(shù)被調(diào)用時才運行。
值:CREATE_UNICODE_ENVIRONMENT
含義:如果被設(shè)置,由lpEnvironment參數(shù)指定的環(huán)境塊使用Unicode字符,如果為空,環(huán)境塊使用ANSI字符。值:CREATE_SUSPENDED
含義:新進程的主線程會優(yōu)先級:HIGH_PRIORITY_CLASS
含義:指示這個進程將執(zhí)行時間臨界的任務(wù),所以它必須被立即運行以保證正確。這個優(yōu)先級的程序優(yōu)先于正常優(yōu)先級或空閑優(yōu)先級的程序。一個例子是Windows任務(wù)列表,為了保證當用戶調(diào)用時可以立刻響應,放棄了對系統(tǒng)負荷的考慮。確保在使用高優(yōu)先級時應該足夠謹慎,因為一個高優(yōu)先級的CPU關(guān)聯(lián)應用程序可以占用幾乎全部的CPU可用時間。
優(yōu)先級:IDLE_PRIORITY_CLASS
含義:指示這個進程的線程只有在系統(tǒng)空閑時才會運行并且可以被任何高優(yōu)先級的任務(wù)打斷。例如屏幕保護程序??臻e優(yōu)先級會被子進程繼承。
優(yōu)先級:NORMAL_PRIORITY_CLASS
含義:指示這個進程沒有特殊的任務(wù)調(diào)度要求。
優(yōu)先級:REALTIME_PRIORITY_CLASS
含義:指示這個進程擁有可用的最高優(yōu)先級。一個擁有實時優(yōu)先級的進程的線程可以打斷所有其他進程線程的執(zhí)行,包括正在執(zhí)行重要任務(wù)的系統(tǒng)進程。例如,一個執(zhí)行時間稍長一點的實時進程可能導致磁盤緩存不足或鼠標反映遲鈍。
優(yōu)先級:HIGH_PRIORITY_CLASS
STARTUPINFO結(jié)構(gòu)typedefstruct{ DWORDcb;//本結(jié)構(gòu)長度,總是應該被設(shè)為sizeof(STARTUPINFO) LPTSTRlpReserved;//保留字段 LPTSTRlpDesktop;//指定桌面名稱 LPTSTRlpTitle;//控制臺應用程序用,指定控制臺窗口標題 DWORDdwX;//指定新創(chuàng)建窗口的位置坐標和大小信息 DWORDdwY; DWORDdwXSize; DWORDdwYSize; DWORDdwXCountChars;//控制臺程序用,指定控制臺窗口的行數(shù) DWORDdwYCountChars; DWORDdwFillAttribute;//控制臺程序用,指定控制臺窗口的背景色
DWORDdwFlags;//標志,它的值決定STARTUPINFO結(jié)構(gòu)中那些成員的值有效 WORDwShowWindow;//窗口的顯示方式 WORDcbReserved2; LPBYTElpReserved2; HANDLEhStdInput;//控制臺程序使用,幾個標準句柄 HANDLEhStdOutput; HANDLEhStdError;}STARTUPINFO,*LPSTARTUPINFO;STARTUPINFO結(jié)構(gòu)typedefstruct{PROCESS_INFORMATION結(jié)構(gòu)typedstruct{HANDLEhProcess;//新建進程的內(nèi)核句柄HANDLEhThread;//新建進程中主線程的內(nèi)核句柄DWORDdwProcessId;//新建進程的IDDWORDdwThreadId;//新建進程的主線程ID}PROCESS_INFORMATION,*LPPROCESS_INFORMATION;PROCESS_INFORMATION結(jié)構(gòu)typedstr獲取系統(tǒng)進程首先使用CreateToolhelp32Snapshot函數(shù)給當前系統(tǒng)內(nèi)執(zhí)行的進程拍快照,也就獲得一個進程列表,這個列表中記錄著進程的ID、進程對應的可執(zhí)行文件的名稱和創(chuàng)建該進程的進程ID等數(shù)據(jù)。然后使用Process32First函數(shù)和Process32Next函數(shù)遍歷快照中記錄的列表。2.4進程的控制獲取系統(tǒng)進程2.4進程的控制PROCESSENTRY32結(jié)構(gòu)typedefstruct{DWORDdwSize;//結(jié)構(gòu)的長度,必須預先設(shè)置DWORDdwUsage;//進程的引用計數(shù)
DWORDth32ProcessID;//進程ID
DWORDth32DefaultHeapID;//進程默認堆的IDDWORDth32ModuleID;//進程模塊的IDDWORDcntThreads;//進程創(chuàng)建的線程數(shù)DWORDthParentProcessID;//進程的父線程IDLONGpcPriClassBase;//進程創(chuàng)建的線程的基本優(yōu)先級DWORDdwFlags;//內(nèi)部使用CHARszExeFile[MAX_PATH];//進程對應的可執(zhí)行文件名}PROCESSENTRY32;PROCESSENTRY32結(jié)構(gòu)typedefstruc終止當前進程--ExitProcess函數(shù)終止進程就是結(jié)束程序的執(zhí)行,讓它從內(nèi)存中卸載。終止原因:1)主線程的入口函數(shù)返回。2)進程中一個線程調(diào)用了ExitProcess函數(shù)3)此進程中的所有線程都結(jié)束了。4)其他進程中的一個線程調(diào)用了
TerminateProcess函數(shù)。終止當前進程--ExitProcess函數(shù)終止其他進程--TerminateProcess函數(shù)對一個進程操作前,必須首先取得該進程的進程句柄。CreateProcess函數(shù)創(chuàng)建進程后返回一個進程句柄。對已存在進程,用OpenProcess函數(shù)取得這個進程的訪問權(quán)限。終止其他進程--TerminateProcess函數(shù)保護進程保護進程不被其他進程非法關(guān)閉。1)防止被其他進程檢測到。2)防止此進程被其他進程關(guān)閉。
WPE(截獲網(wǎng)絡(luò)數(shù)據(jù)軟件)檢測系統(tǒng)進程:ToolHelp,ProcessStatus函數(shù)HOOK掉系統(tǒng)對這些函數(shù)的調(diào)用HOOK掉其他進程對TerminateProcess函數(shù)的調(diào)用。保護進程2.5游戲內(nèi)存修改器(實例)實現(xiàn)原理BOOLReadProcessMemory( HANDLEhProcess,//待讀進程的句柄 LPCVOIDlpBaseAddress,//目標進程中待讀內(nèi)存的起始地址 LPVOIDlpBuffer,//用來接收讀取數(shù)據(jù)的緩沖區(qū) DWORDnSize,//要讀取的字節(jié)數(shù) LPDWORDlpNumberOfBytesRead//用來供函數(shù)返回實際讀取的字節(jié)數(shù));WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);2.5游戲內(nèi)存修改器(實例)實現(xiàn)原理BOOLReadPrOSVERSIONINFO結(jié)構(gòu)Typedefstruct_OSVERSIONINFO{ DWORDdwOSVersionInfoSize,//本結(jié)構(gòu)的大小,必須在調(diào)用之前設(shè)置DWORDdwMajorVersion,//操作系統(tǒng)的主版本號 DWORDdwMinorVersion,//操作系統(tǒng)的次版本號 DWORDdwBuildNumber,//操作系統(tǒng)的編譯版本號 DWORDdwPlatformId//操作系統(tǒng)平臺??梢允荲ER_PLATFORM_WIN32_NT(2000系列)等
TCHARszCSDVersion[128];//指定安裝在系統(tǒng)上的最新服務(wù)包,例如”ServicePack4”等}OSVERSIONINFO;OSVERSIONINFO結(jié)構(gòu)Typedefstruct_結(jié)束結(jié)束Windows程序設(shè)計基礎(chǔ)Windows程序設(shè)計基礎(chǔ)32位處理器有3種工作模式:實模式:重啟以后到載入WINDOWS以前都是實模式,純32位windows是不能進入實模式的。保護模式:保護模式提供的保護機制管理和維護自己,保護主要指對存儲器的保護。進入保護模式是每個32位系統(tǒng)必須的。虛擬86模式:為了讓以前的16位程序能在32位下運行,32位處理器就提供了虛擬86模式。第二章win32程序運行原理2.1CPU的保護模式和Windows系統(tǒng)32位處理器有3種工作模式:第二章win32程序運行原理擴展模式:1)兼容模式:該模式下,64位操作系統(tǒng)運行在32位兼容環(huán)境,能正常運行16,32位應用程序就像基本的保護模式一樣,訪問32位地址空間,但不能運行純16位實模式程序(就是不能運行虛擬86模式程序了)。
2)64位模式:在該模式下,處理器完全執(zhí)行64位指令,使用64位地址空間和64操作數(shù),運行16,32位程序必須切換到兼容模式。64位處理器系統(tǒng)管理模式:當SMI引腳為有效進入系統(tǒng)管理模式,首先保存當前的CPU上下文。它有獨立的地址空間,用來執(zhí)行電源管理或系統(tǒng)安全方面的指令。(基本模式)擴展模式:64位處理器系統(tǒng)管理模式:當SMI引腳為有效進入系32位處理器對多任務(wù)操作系統(tǒng)的支持性主要體現(xiàn)在1)在硬件上為任務(wù)之間的切換提供了良好的條件2)實現(xiàn)了多任務(wù)隔離,“進程”地址空間獨立在windows下,任務(wù)被進程取代,進程就是正在運行的應用程序的實例。但是占用cpu時間片的不是進程,而是線程。Windows的多任務(wù)實現(xiàn)32位處理器對多任務(wù)操作系統(tǒng)的支持性主要體現(xiàn)在W虛擬內(nèi)存保護模式下,32位處理器有32根地址線,處理器尋址范圍(0x00000000—0xFFFFFFFF)(232,4GB)。
32位機器上的RAM的大小很難達到4GB,windows為每個進程分配4GB的地址空間主要依靠cpu的支持。cpu在保護模式下支持虛擬內(nèi)存。它可以幫助操作系統(tǒng)將磁盤空間當作內(nèi)存空間來使用。虛擬內(nèi)存保護模式下,32位處理器有32根地址線,各進程內(nèi)的地址空間安排2GB的系統(tǒng)空間2GB的用戶空間0xFFFFFFFF0x800000000x7FFFFFFF0x00000000整個系統(tǒng)共用每個進程私有各進程內(nèi)的地址空間安排2GB的系統(tǒng)空間2GB的用戶空間0xF
用戶空間部分是進程私有地址空間,進程不能以任何方式讀、寫其他進程此部分空間中的數(shù)據(jù)。對所有應用程序,大量進程數(shù)據(jù)被保存在塊空間中而相互獨立,所以應用程序很少被其他程序打斷,使系統(tǒng)更加穩(wěn)定。
系統(tǒng)空間部分放置操作系統(tǒng)的代碼,包括內(nèi)核代碼、設(shè)備驅(qū)動代碼、設(shè)備I/O緩沖區(qū)等。系統(tǒng)空間部分在所有的進程中是共享的。在32位系統(tǒng)中,這些數(shù)據(jù)結(jié)構(gòu)被完全的保護起來,如果試圖訪問這部分內(nèi)存,訪問線程會遇到一個訪問異常。兩種地址空間區(qū)別用戶空間部分是進程私有地址空間,進程不能以任何方32位處理器共定義了4種(0-3)特權(quán)級別,或稱環(huán)。0是最高級(特權(quán)級),3級是最低級(用戶級)。為了阻止應用程序訪問或者修改關(guān)鍵的系統(tǒng)數(shù)據(jù),windows提供了兩種訪問模式:內(nèi)核模式(使用0級):系統(tǒng)程序的代碼在此模式下運行用戶模式(使用3級):用戶程序的代碼在此模式下運行內(nèi)核模式和用戶模式32位處理器共定義了4種(0-3)特權(quán)級別,或稱CPU支持的特權(quán)級類別應用程序常規(guī)擴展系統(tǒng)服務(wù)內(nèi)核級別0級別1級別2級別3在實模式下,沒有級別之分.在保護模式下,CPU有4個特權(quán)級別.
CPU支持的特權(quán)級類別應用程序常規(guī)擴展系統(tǒng)服務(wù)內(nèi)核級別0級別
雖然每個進程都有自己的4G地址空間。但內(nèi)核模式下的系統(tǒng)和設(shè)備驅(qū)動程序共用一塊虛擬地址空間。即整個系統(tǒng)共用的2G部分。虛擬內(nèi)存中的每一頁的頁屬性中都有訪問模式標記,它標識了哪一個模式下的代碼才有權(quán)限訪問該頁。系統(tǒng)地址空間的頁僅僅能夠從內(nèi)核模式訪問,所有用戶地址空間的頁都從用戶模式訪問。
當應用程序調(diào)用一個系統(tǒng)函數(shù)的時候,用戶的應用程序會從用戶模式切換到內(nèi)核模式去執(zhí)行。例如:Win32函數(shù)ReadFile最終會調(diào)用Windows內(nèi)部的從文件中讀取數(shù)據(jù)的程序代碼,因為這些代碼訪問了系統(tǒng)內(nèi)部的數(shù)據(jù),所以他們必須運行在內(nèi)核模式下。雖然每個進程都有自己的4G地址空間。但內(nèi)核模式下
內(nèi)核模式:研究WDM(WindowsDriverModel)設(shè)備驅(qū)動類
用戶模式:SDK程序設(shè)計兩種模式下的程序設(shè)計內(nèi)核模式:兩種模式下的程序設(shè)計
內(nèi)核對象是系統(tǒng)提供的用戶模式下代碼與內(nèi)核模式下代碼進行交互的基本接口。軟件開發(fā)人員會經(jīng)常的創(chuàng)建、打開和操作內(nèi)核對象。2.2內(nèi)核對象
為了管理應用程序,系統(tǒng)有必要維護一些不允許用戶應用程序直接訪問的數(shù)據(jù)。一個內(nèi)核對象就是一塊內(nèi)核分配的內(nèi)存,它只能被運行在內(nèi)核模式下的代碼訪問。內(nèi)核對象記錄的數(shù)據(jù)在整個系統(tǒng)中只有一份,故也稱系統(tǒng)資源。內(nèi)核對象是系統(tǒng)提供的用戶模式下代碼與內(nèi)核模式下代
內(nèi)核對象和普通的數(shù)據(jù)結(jié)構(gòu)間的最大區(qū)別是其內(nèi)部數(shù)據(jù)結(jié)構(gòu)是隱藏的,必須調(diào)用一個對象服務(wù)才能從此對象中得到數(shù)據(jù),或者是向其輸入數(shù)據(jù),而不能直接讀或者改變對象的內(nèi)部數(shù)據(jù)。增加這些限制來保證內(nèi)核對象包含一致的狀態(tài)。引入內(nèi)核對象,系統(tǒng)可方便的完成以下任務(wù):1)為系統(tǒng)資源提供可識別的名字。2)在進程之間共享資源和數(shù)據(jù)。3)保護資源不被未經(jīng)認可的代碼訪問。4)跟蹤對象的引用情況。在不被使用時,釋放占有空間。內(nèi)核對象和普通的數(shù)據(jù)結(jié)構(gòu)間的最大區(qū)別是其內(nèi)部數(shù)據(jù)
內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)僅能從內(nèi)核模式訪問,所以直接在內(nèi)存中定位這些數(shù)據(jù)結(jié)構(gòu)對應用程序來說是不可能的。應用程序必須使用API函數(shù)訪問內(nèi)核對象。調(diào)用函數(shù)創(chuàng)建內(nèi)核對象時,函數(shù)會返回標識此內(nèi)核對象的句柄。為了使系統(tǒng)穩(wěn)定,這些句柄和進程有關(guān),就是僅對創(chuàng)建該內(nèi)核對象的進程有效。若要多個進程共享一個內(nèi)核對象,要調(diào)用DuplicateHandle函數(shù)復制一個進程句柄傳給其他進程即可。對象句柄內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)僅能從內(nèi)核模式訪問,所以直接在
內(nèi)核對象是進程內(nèi)的資源,使用計數(shù)屬性指明進程對特定內(nèi)核對象的引用次數(shù),第一次創(chuàng)建內(nèi)核對象時,系統(tǒng)為進程分配內(nèi)核對象資源,并將該內(nèi)核對象的使用計數(shù)屬性初始化為1。打開一次使用計數(shù)加1,關(guān)閉,系統(tǒng)將使用計數(shù)減1,當系統(tǒng)發(fā)現(xiàn)引用次數(shù)是0時,它就會自動關(guān)閉資源。使用計數(shù)內(nèi)核對象是進程內(nèi)的資源,使用計數(shù)屬性指明進程對特2.3進程的創(chuàng)建進程和線程進程是一個正在運行的程序,它擁有自己的虛擬地址空間,擁有自己的代碼、數(shù)據(jù)和其他系統(tǒng)資源,如進程創(chuàng)建的文件、管道、同步對象等。一個進程也包含了一個或者多個運行在此進程內(nèi)的線程。線程是進程內(nèi)執(zhí)行代碼的獨立實體。沒有它,進程中的程序代碼是不可能執(zhí)行的。操作系統(tǒng)創(chuàng)建進行后會創(chuàng)建一個線程執(zhí)行進程中的代碼,稱主線程,它在運行過程中創(chuàng)建其他線程,一般將主線程創(chuàng)建的線程稱為該進程的輔助線程。2.3進程的創(chuàng)建進程和線程進程是一個正在運行的進程是不活潑的,一個進程要完成任何事情,必須有一個運行在它的地址空間中的線程。此線程負責執(zhí)行該進程地址空間的代碼。每個進程至少擁有一個在它的地址空間中運行的線程。對一個不包含任何線程的進程來說,它是沒有理由繼續(xù)存在下去的,系統(tǒng)會自動銷毀該進程和它的地址空間。進程是不活潑的,一個進程要完成任何事情,必須有一進程和程序程序:一連串靜態(tài)的指令進程:一個容器,它包含一系列運行在這個程序?qū)嵗舷挛闹械木€程使用的資源。進程和程序程序:一連串靜態(tài)的指令Win32進程的兩個組成部分進程內(nèi)核對象:操作系統(tǒng)使用此內(nèi)核對象來管理該進程。這個內(nèi)核對象也是操作系統(tǒng)存放進程統(tǒng)計信息的地方。私有的虛擬地址空間:此地址空間包含了所有可執(zhí)行的或者是DLL模塊的代碼和數(shù)據(jù),它也是程序動態(tài)申請內(nèi)存的地方,比如說線程堆棧和進程堆。Win32進程的兩個組成部分進程內(nèi)核對象:操作系統(tǒng)使用此內(nèi)核
應用程序必須有一個入口函數(shù),它在程序開始運行時被調(diào)用。控制臺應用程序入口函數(shù)是main。intmain(intargc,char*argv[])
應用程序的啟動過程應用程序必須有一個入口函數(shù),它在程序開始運行時被開始主線程調(diào)用C/C++運行期啟動函數(shù)N操作系統(tǒng)調(diào)用CreateProcess函數(shù)創(chuàng)建新的進程系統(tǒng)創(chuàng)建一個進程內(nèi)核對象,使用計數(shù)初始化為1系統(tǒng)為進程創(chuàng)建主線程成功調(diào)用程序入口函數(shù)mainY結(jié)束系統(tǒng)為新進程創(chuàng)建虛擬地址空間,加載應用程序運行時需要代碼和數(shù)據(jù)開始主線程調(diào)用C/C++運行期啟動函數(shù)N操作系統(tǒng)調(diào)用CreaCreateProcess函數(shù)WIN32API函數(shù)CreateProcess用來創(chuàng)建一個新的進程和它的主線程,這個新進程運行指定的可執(zhí)行文件。
函數(shù)原型:
BOOLCreateProcess
(
LPCTSTRlpApplicationName,
//可執(zhí)行文件名稱
LPTSTRlpCommandLine,
//指定要傳遞給執(zhí)行模塊的參數(shù)
LPSECURITY_ATTRIBUTESlpProcessAttributes,//進程安全性
LPSECURITY_ATTRIBUTESlpThreadAttributes,
//進程安全性
BOOLbInheritHandles,
//指定當前進程中的可繼承句柄是否可被新進程繼承
DWORDdwCreationFlags,//指定新進程的優(yōu)先級及其他創(chuàng)建標志
LPVOIDlpEnvironment,
//指定新進程使用的環(huán)境變量
LPCTSTRlpCurrentDirectory,
//指定新進程使用的當前目錄
LPSTARTUPINFOlpStartupInfo,
//指定新進程中主窗口的位置、大小和句柄等
LPPROCESS_INFORMATIONlpProcessInformation//返回新進程的標志信息);
CreateProcess函數(shù)WIN32API函數(shù)CreatlpApplicationName:指向一個NULL結(jié)尾的、用來指定可執(zhí)行模塊的字符串。
這個字符串可以是可執(zhí)行模塊的絕對路徑,也可以是相對路徑,在后一種情況下,函數(shù)使用當前驅(qū)動器和目錄建立可執(zhí)行模塊的路徑。
這個參數(shù)可以被設(shè)為NULL,在這種情況下,可執(zhí)行模塊的名字必須處于lpCommandLine參數(shù)的最前面并由空格符與后面的字符分開。
這個被指定的模塊可以是一個Win32應用程序。如果適當?shù)淖酉到y(tǒng)在當前計算機上可用的話,它也可以是其他類型的模塊(如MS-DOS或OS/2)。lpApplicationName:指向一個NULL結(jié)尾的、lpCommandLine:指向一個NULL結(jié)尾的、用來指定要運行的命令行。
這個參數(shù)可以為空,那么函數(shù)將使用參數(shù)指定的字符串當作要運行的程序的命令行。
如果lpApplicationName和lpCommandLine參數(shù)都不為空,那么lpApplicationName參數(shù)指定將要被運行的模塊,lpCommandLine參數(shù)指定將被運行的模塊的命令行。新運行的進程可以使用GetCommandLine函數(shù)獲得整個命令行。C語言程序可以使用argc和argv參數(shù)。lpCommandLine:指向一個NULL結(jié)尾的、用來指定如果lpApplicationName參數(shù)為空,那么這個字符串中的第一個被空格分隔的要素指定可執(zhí)行模塊名。如果文件名不包含擴展名,那么.exe將被假定為默認的擴展名。如果文件名以一個點(.)結(jié)尾且沒有擴展名,或文件名中包含路徑,.exe將不會被加到后面。如果文件名中不包含路徑,Windows將按照如下順序?qū)ふ疫@個可執(zhí)行文件:
1.當前應用程序的目錄。
2.父進程的目錄。
3.Windows95:Windows系統(tǒng)目錄,可以使用GetSystemDirectory函數(shù)獲得。
WindowsNT:32位Windows系統(tǒng)目錄??梢允褂肎etSystemDirectory函數(shù)獲得,目錄名是SYSTEM32。
4.在WindowsNT中:16位Windows系統(tǒng)目錄。不可以使用Win32函數(shù)獲得這個目錄,但是它會被搜索,目錄名是SYSTEM。
5.Windows目錄??梢允褂肎etWindowsDirectory函數(shù)獲得這個目錄。
6.列在PATH環(huán)境變量中的目錄。
如果被創(chuàng)建的進程是一個以MS-DOS或16位Windows為基礎(chǔ)的應用程序,lpCommandLine參數(shù)應該是一個以可執(zhí)行文件的文件名作為第一個要素的絕對路徑,因為這樣做可以使32位Windows程序工作的很好,這樣設(shè)置lpCommandLine參數(shù)是最強壯的。如果lpApplicationName參數(shù)為空,那么這個字符dwCreationFlags:指定附加的、用來控制優(yōu)先級和進程的創(chuàng)建的標志。以下的創(chuàng)建標志可以以除下面列出的方式外的任何方式組合后指定。值:CREATE_DEFAULT_ERROR_MODE
含義:新的進程不繼承調(diào)用進程的錯誤模式。值:CREATE_NEW_CONSOLE
含義:新的進程將使用一個新的控制臺,而不是繼承父進程的控制臺。這個標志不能與DETACHED_PROCESS標志一起使用。值:CREATE_NEW_PROCESS_GROUP
含義:新進程將使一個進程樹的根進程。進程樹種的全部進程都是根進程的子進程。dwCreationFlags:指定附加的、用來控制優(yōu)先級和值:CREATE_SUSPENDED
含義:新進程的主線程會以暫停的狀態(tài)被創(chuàng)建,直到調(diào)用ResumeThread函數(shù)被調(diào)用時才運行。
值:CREATE_UNICODE_ENVIRONMENT
含義:如果被設(shè)置,由lpEnvironment參數(shù)指定的環(huán)境塊使用Unicode字符,如果為空,環(huán)境塊使用ANSI字符。值:CREATE_SUSPENDED
含義:新進程的主線程會優(yōu)先級:HIGH_PRIORITY_CLASS
含義:指示這個進程將執(zhí)行時間臨界的任務(wù),所以它必須被立即運行以保證正確。這個優(yōu)先級的程序優(yōu)先于正常優(yōu)先級或空閑優(yōu)先級的程序。一個例子是Windows任務(wù)列表,為了保證當用戶調(diào)用時可以立刻響應,放棄了對系統(tǒng)負荷的考慮。確保在使用高優(yōu)先級時應該足夠謹慎,因為一個高優(yōu)先級的CPU關(guān)聯(lián)應用程序可以占用幾乎全部的CPU可用時間。
優(yōu)先級:IDLE_PRIORITY_CLASS
含義:指示這個進程的線程只有在系統(tǒng)空閑時才會運行并且可以被任何高優(yōu)先級的任務(wù)打斷。例如屏幕保護程序??臻e優(yōu)先級會被子進程繼承。
優(yōu)先級:NORMAL_PRIORITY_CLASS
含義:指示這個進程沒有特殊的任務(wù)調(diào)度要求。
優(yōu)先級:REALTIME_PRIORITY_CLASS
含義:指示這個進程擁有可用的最高優(yōu)先級。一個擁有實時優(yōu)先級的進程的線程可以打斷所有其他進程線程的執(zhí)行,包括正在執(zhí)行重要任務(wù)的系統(tǒng)進程。例如,一個執(zhí)行時間稍長一點的實時進程可能導致磁盤緩存不足或鼠標反映遲鈍。
優(yōu)先級:HIGH_PRIORITY_CLASS
STARTUPINFO結(jié)構(gòu)typedefstruct{ DWORDcb;//本結(jié)構(gòu)長度,總是應該被設(shè)為sizeof(STARTUPINFO) LPTSTRlpReserved;//保留字段 LPTSTRlpDesktop;//指定桌面名稱 LPTSTRlpTitle;//控制臺應用程序用,指定控制臺窗口標題 DWORDdwX;//指定新創(chuàng)建窗口的位置坐標和大小信息 DWORDdwY; DWORDdwXSize; DWORDdwYSize; DWORDdwXCountChars;//控制臺程序用,指定控制臺窗口的行數(shù) DWORDdwYCountChars; DWORDdwFillAttribute;//控制臺程序用,指定控制臺窗口的背景色
DWORDdwFlags;//標志,它的值決定STARTUPINFO結(jié)構(gòu)中那些成員的值有效 WORDwShowWindow;//窗口的顯示方式 WORDcbReserved2; LPBYTElpReserved2; HANDLEhStdInput;//控制臺程序使用,幾個標準句柄 HANDLEhStdOutput; HANDLEhStdError;}STARTUPINFO,*LPSTARTUPINFO;STARTUPINFO結(jié)構(gòu)typedefstruct{PROCESS_INFORMATION結(jié)構(gòu)typedstruct{HANDLEhProcess;//新建進程的內(nèi)核句柄HANDLEhThread;//新建進程中主線程的內(nèi)核句柄DWORDdwProcessId;//新建進程的IDD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026安徽安慶市人力資源服務(wù)有限公司招聘勞務(wù)派遣員工4人考試參考試題及答案解析
- 2026四川中煙工業(yè)有限責任公司員工招聘141人考試參考試題及答案解析
- 2025新疆投資發(fā)展(集團)有限責任公司第三批招聘1200人考試備考題庫及答案解析
- 2026年溫州市婦女兒童活動中心招聘兼職專業(yè)教師筆試備考試題及答案解析
- 2026廣東梅州市公安局招聘警務(wù)輔助人員320人考試備考試題及答案解析
- 2025年寧波大學附屬人民醫(yī)院招聘編外人員2人考試備考題庫及答案解析
- 2026四川德陽市羅江區(qū)就業(yè)創(chuàng)業(yè)促進中心城鎮(zhèn)公益性崗位招聘1人(區(qū)博物館)考試備考題庫及答案解析
- 寧波慈溪農(nóng)村商業(yè)銀行2026年春季招聘官宣開啟考試備考題庫及答案解析
- 2026年江西省、中國科學院廬山植物園科研助理崗位人員招聘2人考試備考試題及答案解析
- 2026年黃山市中醫(yī)醫(yī)院招聘工作人員2名考試參考試題及答案解析
- 電力線通信技術(shù)
- 人工流產(chǎn)手術(shù)知情同意書
- 鋼鐵燒結(jié)機脫硫脫硝施工方案
- 中國醫(yī)藥行業(yè)中間體出口全景分析:破解政策難題深挖全球紅利
- 河南省百師聯(lián)盟2025-2026學年高一上12月聯(lián)考英語試卷(含解析含聽力原文及音頻)
- 污水管道更換工程施工方案
- 租戶加裝充電樁免責補充合同(房東版)
- 甘肅省天水市2024-2025學年九年級上學期期末考試物理試題(含答案)
- 2025年佛山市均安鎮(zhèn)專職消防隊招聘消防員5人備考題庫及1套參考答案詳解
- 2026年海南衛(wèi)生健康職業(yè)學院單招職業(yè)技能考試題庫參考答案詳解
- 法制副校長課件
評論
0/150
提交評論