實驗一 Windows2000進程觀測_第1頁
實驗一 Windows2000進程觀測_第2頁
實驗一 Windows2000進程觀測_第3頁
實驗一 Windows2000進程觀測_第4頁
實驗一 Windows2000進程觀測_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

//hello項目

#include<iostream>voidmain(){

std::cout<<“Hello,Windows2000”<<std::endl;}步驟4:編譯生成Hello.exe,并執行。步驟5:運行Hello.exe程序,產生用戶鍵入的一行文字。2、GUI應用程序利用C++編譯器創建一個GUI應用程序,代碼中包括了WinMain()方法,這是GUI類型的應用程序的標準入口點。步驟1:啟動VisualC++6.0。File(文件)->New(新建)->Project(項目)->Win32Application(Win32應用項目)File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟2:輸入下列代碼。步驟3:編譯生成.exe文件。//msgbox項目

#include<windows.h>//標準的include

//告訴連接器與包括MessageBoxAPI函數的user32庫進行連接

#pragmacomment(lib,“user32.lib”)

//這是一個可以彈出信息框然后退出的筒單的應用程序

intAPIENTRYWinMain(HINSTANCE

hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine

int

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

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

//返回0以便通知系統不進入消息循環

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

的號碼,就可與進程對象交互。這一號碼只對當前進程有效。在系統中運行的任何進程都可調用GetCurrentProcess()API函數,此函數可返回標識進程本身的句柄。然后就可在Windows需要該進程的有關情況時,利用這一句柄來提供。步驟1:啟動VisualC++6.0。File(文件)->New(新建)->Project(項目)->Win32consoleApplication(Win32控制臺項目)File(文件)->New(新建)->Files(文件)->C++sourcefiles步驟2:將下列代碼鍵入。步驟3:編譯生成exe文件。

//prochandle項目

#include<windows.h>#include<iostream>//確定自己的優先權的簡單應用程序

voidmain(){//從當前進程中提取句柄

HANDLEhProcessThis=::GetCurrentProcess();

//請求內核提供該進程所屬的優先權類

DWORDdwPriority=::GetPriorityClass(hProcessThis);

//發出消息,為用戶描述該類

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;}上述代碼列出的是一種獲得進程句柄的方法。對于進程句柄可進行的惟一有用的操作是在API調用時,將其作為參數傳送給系統。系統向進程對象內“窺視”,以決定其優先級,然后將此優先級返回給應用程序。OpenProcess()和CreateProcess()API函數也可以用于提取進程句柄。前者提取的是已經存在的進程的句柄,而后者創建一個新進程,并將其句柄提供出來。4、利用句柄查出進程的詳細信息步驟1:啟動VisualC++6.0。File(文件)->New(新建)->Project(項目)->Win32consoleApplication(Win32控制臺項目)

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

啟動任務管理器,查看進程相關的相關信息,與上述運行結果有何不同。//proclist項目#include<windows.h>#include<tlhelp32.h>#include<iostream>

//當在用戶模式機內核模式下都提供所耗時間時,在內核模式下進行所耗時間的64位計算的幫助方法

DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser){//將FILETIME結構轉化為64位整數

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

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

ftUser.dwLowDateTime;

//將消耗時間相加,然后計算消耗在內核模式下的時間百分比

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

return(dwPct);}

//以下是將當前運行進程名和消耗在內核模式下的時間百分數都顯示出來的應用程序voidmain(){//對當前系統中運行的進程拍取“快照”

HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //提取當前進程

0); //如果是當前進程,就將其忽略

//初始化進程入口

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

pe.dwSize=sizeof(pe);//按所有進程循環

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

while(bMore){//打開用于讀取的進程

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

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

pe.th32ProcessID); //要打開的進程

if(hProcess!=NULL){//找出進程的時間

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

hProcess, //所感興趣的進程

&ftCreation, //進程的啟動時間(絕對的)&ftExit, //結束時間(如果有的話)&ftKernelMode, //在內核模式下消耗的時間

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

//計算內核模式消耗的時間百分比

DWORDdwPctKernel=::GetKernelModePercentage(

ftKernelMode, //在內核模式上消耗的時間

溫馨提示

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

評論

0/150

提交評論