實(shí)驗(yàn)一 Windows2000進(jìn)程觀測(cè)_第1頁(yè)
實(shí)驗(yàn)一 Windows2000進(jìn)程觀測(cè)_第2頁(yè)
實(shí)驗(yàn)一 Windows2000進(jìn)程觀測(cè)_第3頁(yè)
實(shí)驗(yàn)一 Windows2000進(jìn)程觀測(cè)_第4頁(yè)
實(shí)驗(yàn)一 Windows2000進(jìn)程觀測(cè)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn)一Windows2000進(jìn)程觀測(cè)一、背景知識(shí)Windows2000可以識(shí)別的應(yīng)用程序:控制臺(tái)應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序。不同類型應(yīng)用程序間的唯一重要區(qū)別是啟動(dòng)方法??刂婆_(tái)應(yīng)用程序GUI服務(wù)應(yīng)用程序標(biāo)準(zhǔn)輸出流創(chuàng)建運(yùn)行寫(xiě)數(shù)據(jù)Windows2000是以NT的技術(shù)構(gòu)建的,它提供了創(chuàng)建控制臺(tái)應(yīng)用程序的能力,使用戶可以利用標(biāo)準(zhǔn)的C++工具,如iostream庫(kù)中的cout和cin對(duì)象,來(lái)創(chuàng)建小型應(yīng)用程序。當(dāng)系統(tǒng)運(yùn)行時(shí),Windows2000的服務(wù)通常要向系統(tǒng)用戶提供所需功能。服務(wù)應(yīng)用程序類型需要ServiceMail()函數(shù),由服務(wù)控制管理器(SCM)加以調(diào)用。SCM是操作系統(tǒng)的集成部分。其本身負(fù)責(zé)使應(yīng)用程序的行為像一個(gè)服務(wù)。通常,服務(wù)登錄到特殊的LocalSystem賬號(hào)下,此賬號(hào)具有與開(kāi)發(fā)人員創(chuàng)建的服務(wù)不同的權(quán)限。當(dāng)令C++編譯器創(chuàng)建可執(zhí)行程序時(shí),編譯器將源代碼編譯成OBJ文件,然后將其與標(biāo)準(zhǔn)庫(kù)相鏈接。產(chǎn)生的EXE文件是裝載器指令、機(jī)器指令和應(yīng)用程序的數(shù)據(jù)的集合。裝載器指令告訴系統(tǒng)從哪里裝載機(jī)器代碼。另一個(gè)裝載器指令告訴系統(tǒng)從哪里開(kāi)始執(zhí)行進(jìn)程的主線程。在進(jìn)行某些設(shè)置后,進(jìn)入開(kāi)發(fā)者提供的main()、ServiceMain()或WinMain()函數(shù)的低級(jí)入口點(diǎn)。機(jī)器代碼中包括有控制邏輯,它能夠跳轉(zhuǎn)到WindowsAPI函數(shù),進(jìn)行計(jì)算或向磁盤(pán)寫(xiě)入數(shù)據(jù)。Windows允許開(kāi)發(fā)人員將大型應(yīng)用程序分為較小的、互相有關(guān)系的服務(wù)模塊,即動(dòng)態(tài)鏈接庫(kù)(DLL)代碼塊,在其中包含應(yīng)用程序所使用的機(jī)器代碼和應(yīng)用程序的數(shù)據(jù)。二、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)對(duì)Windows2000編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解Windows2000的結(jié)構(gòu)。三、實(shí)驗(yàn)內(nèi)容與步驟1、簡(jiǎn)單的控制臺(tái)應(yīng)用程序步驟1:登錄進(jìn)入Windows操作系統(tǒng)。步驟2:?jiǎn)?dòng)VisualC++6.0。

File(文件)->New(新建)->Project(項(xiàng)目)->Win32consoleApplication(Win32控制臺(tái)項(xiàng)目)File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟3:輸入下列代碼。

//hello項(xiàng)目

#include<iostream>voidmain(){

std::cout<<“Hello,Windows2000”<<std::endl;}步驟4:編譯生成Hello.exe,并執(zhí)行。步驟5:運(yùn)行Hello.exe程序,產(chǎn)生用戶鍵入的一行文字。2、GUI應(yīng)用程序利用C++編譯器創(chuàng)建一個(gè)GUI應(yīng)用程序,代碼中包括了WinMain()方法,這是GUI類型的應(yīng)用程序的標(biāo)準(zhǔn)入口點(diǎn)。步驟1:?jiǎn)?dòng)VisualC++6.0。File(文件)->New(新建)->Project(項(xiàng)目)->Win32Application(Win32應(yīng)用項(xiàng)目)File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟2:輸入下列代碼。步驟3:編譯生成.exe文件。//msgbox項(xiàng)目

#include<windows.h>//標(biāo)準(zhǔn)的include

//告訴連接器與包括MessageBoxAPI函數(shù)的user32庫(kù)進(jìn)行連接

#pragmacomment(lib,“user32.lib”)

//這是一個(gè)可以彈出信息框然后退出的筒單的應(yīng)用程序

intAPIENTRYWinMain(HINSTANCE

hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine

int

nCmdShow){::MessageBox(NULL, //沒(méi)有父窗口“Hello,Windows2000”, //消息框中的文本“Greetings”, //消息框標(biāo)題

MB_OK); //其中只有一個(gè)OK按鈕

//返回0以便通知系統(tǒng)不進(jìn)入消息循環(huán)

return(0);}在該GUI應(yīng)用程序中,首先需要windows.h頭文件,以便獲得傳送給WinMain()和MessageBox()API函數(shù)的數(shù)據(jù)類型定義。pragma指令指示編譯器/連接器找到user32.lib庫(kù)文件并將其與產(chǎn)生的exe文件連接起來(lái)。如果沒(méi)有pragma指令,則MessageBox()API函數(shù)就成為未定義的了。WinMain()方法中有四個(gè)由實(shí)際的低級(jí)入口點(diǎn)傳遞來(lái)的參數(shù)。hInstance參數(shù)用來(lái)裝入與代碼相連的圖標(biāo)或位圖一類的資源,無(wú)論何時(shí),都可用GetModuleHandle()API函數(shù)將這些資源提取出來(lái)。系統(tǒng)利用實(shí)例句柄來(lái)指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何處。句柄的數(shù)值實(shí)際上是exe文件映像的基地址,通常為0x00400000。下一個(gè)參數(shù)hPrevInstance是為向后兼容而設(shè)的,現(xiàn)在系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱)是lpCmdLine參數(shù)。另外,系統(tǒng)利用nCmdShow參數(shù)告訴應(yīng)用程序如何顯示它的主窗口(選項(xiàng)包括最小化、最大化和正常)。最后,程序調(diào)用MessageBox()API函數(shù)并退出。如果在進(jìn)入消息循環(huán)之前就結(jié)束運(yùn)行的話,最后必須返回0。3、進(jìn)程對(duì)象操作系統(tǒng)將當(dāng)前運(yùn)行的應(yīng)用程序看作是進(jìn)程對(duì)象。利用系統(tǒng)提供的惟一的稱為句柄(HANDLE)

的號(hào)碼,就可與進(jìn)程對(duì)象交互。這一號(hào)碼只對(duì)當(dāng)前進(jìn)程有效。在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess()API函數(shù),此函數(shù)可返回標(biāo)識(shí)進(jìn)程本身的句柄。然后就可在Windows需要該進(jìn)程的有關(guān)情況時(shí),利用這一句柄來(lái)提供。步驟1:?jiǎn)?dòng)VisualC++6.0。File(文件)->New(新建)->Project(項(xiàng)目)->Win32consoleApplication(Win32控制臺(tái)項(xiàng)目)File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟2:將下列代碼鍵入。步驟3:編譯生成exe文件。

//prochandle項(xiàng)目

#include<windows.h>#include<iostream>//確定自己的優(yōu)先權(quán)的簡(jiǎn)單應(yīng)用程序

voidmain(){//從當(dāng)前進(jìn)程中提取句柄

HANDLEhProcessThis=::GetCurrentProcess();

//請(qǐng)求內(nèi)核提供該進(jìn)程所屬的優(yōu)先權(quán)類

DWORDdwPriority=::GetPriorityClass(hProcessThis);

//發(fā)出消息,為用戶描述該類

std::cout<<“Currentprocesspriority:”;

switch(dwPriority){caseHIGH_PRIORITY_CLASS:std::cout<<“High”;break;caseNORMAL_PRIORITY_CLASS:std

::cout<<

“Normal”;break;caseIDLE_PRIORITY_CLASS:std::cout<<“Idle”;break;caseREALTIME_PRIORITY_CLASS:std::cout<<“Realtime”;break;default:std::cout<<“<unknown>”;break;}std::cout<<std::endl;}上述代碼列出的是一種獲得進(jìn)程句柄的方法。對(duì)于進(jìn)程句柄可進(jìn)行的惟一有用的操作是在API調(diào)用時(shí),將其作為參數(shù)傳送給系統(tǒng)。系統(tǒng)向進(jìn)程對(duì)象內(nèi)“窺視”,以決定其優(yōu)先級(jí),然后將此優(yōu)先級(jí)返回給應(yīng)用程序。OpenProcess()和CreateProcess()API函數(shù)也可以用于提取進(jìn)程句柄。前者提取的是已經(jīng)存在的進(jìn)程的句柄,而后者創(chuàng)建一個(gè)新進(jìn)程,并將其句柄提供出來(lái)。4、利用句柄查出進(jìn)程的詳細(xì)信息步驟1:?jiǎn)?dòng)VisualC++6.0。File(文件)->New(新建)->Project(項(xiàng)目)->Win32consoleApplication(Win32控制臺(tái)項(xiàng)目)

File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟2:將下列代碼鍵入。步驟3:編譯生成exe文件。步驟4:按下Ctrl+Alt+Del

啟動(dòng)任務(wù)管理器,查看進(jìn)程相關(guān)的相關(guān)信息,與上述運(yùn)行結(jié)果有何不同。//proclist項(xiàng)目#include<windows.h>#include<tlhelp32.h>#include<iostream>

//當(dāng)在用戶模式機(jī)內(nèi)核模式下都提供所耗時(shí)間時(shí),在內(nèi)核模式下進(jìn)行所耗時(shí)間的64位計(jì)算的幫助方法

DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser){//將FILETIME結(jié)構(gòu)轉(zhuǎn)化為64位整數(shù)

ULONGLONGqwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+

ftKernel.dwLowDateTime;ULONGLONGqwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+

ftUser.dwLowDateTime;

//將消耗時(shí)間相加,然后計(jì)算消耗在內(nèi)核模式下的時(shí)間百分比

ULONGLONGqwTotal=qwKernel+qwUser;DWORDdwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);

return(dwPct);}

//以下是將當(dāng)前運(yùn)行進(jìn)程名和消耗在內(nèi)核模式下的時(shí)間百分?jǐn)?shù)都顯示出來(lái)的應(yīng)用程序voidmain(){//對(duì)當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程拍取“快照”

HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //提取當(dāng)前進(jìn)程

0); //如果是當(dāng)前進(jìn)程,就將其忽略

//初始化進(jìn)程入口

PROCESSENTRY32pe;::ZeroMemory(&pe,sizeof(pe));

pe.dwSize=sizeof(pe);//按所有進(jìn)程循環(huán)

BOOLbMore=::Process32First(hSnapshot,&pe);

while(bMore){//打開(kāi)用于讀取的進(jìn)程

HANDLEhProcess=::OpenProcess(PROCESS_QUERY_INFORMATION, //指明要得到信息

FALSE, //不必繼承這一句柄

pe.th32ProcessID); //要打開(kāi)的進(jìn)程

if(hProcess!=NULL){//找出進(jìn)程的時(shí)間

FILETIMEftCreation,ftExit,ftKernelMode,ftUserMode;::GetProcessTimes(

hProcess, //所感興趣的進(jìn)程

&ftCreation, //進(jìn)程的啟動(dòng)時(shí)間(絕對(duì)的)&ftExit, //結(jié)束時(shí)間(如果有的話)&ftKernelMode, //在內(nèi)核模式下消耗的時(shí)間

&ftUserMode); //在用戶模式下消耗的時(shí)間

//計(jì)算內(nèi)核模式消耗的時(shí)間百分比

DWORDdwPctKernel=::GetKernelModePercentage(

ftKernelMode, //在內(nèi)核模式上消耗的時(shí)間

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論