Windows 進程管理工具的設計與實現

來源:互聯網
上載者:User

引子

前陣子曾提到過為了應某些人的需要,得做幾個畢業設計,其中一個就是 Windows 的進程管理工具 。

在前期的規劃中是做成比較高難度的那種 Windows 進程管理工具,

也就是在底層使用驅動程式來擷取進程的資訊,而在上層則使用 VC 做使用者介面層的。

至於為什麼在底層要使用驅動程式來擷取進程資訊而不是直接在上層使用進階語言來直接擷取進程資訊,

那是因為在上層中通過進階語言來擷取進程資訊時無法擷取到某些隱藏的進程,

並且對這些擷取到的進程的操作也是有限的,而在核心層裡面則可以對這些進程做幾乎是任何的操作。

而在使用者介面層的話,說實在的,我一直對 C#Windows 表單應用程式有些排斥感,

雖然做個漂亮介面相對於 VC 來說 C#Windows 表單應用程式那是容易一萬倍,

但要不是現在的 CPU 如此強勁的話,我總感覺其會爆了去。

但是後來由於受到時間以及個人能力等方面的影響,上述方案被否決了。

首先,要想在核心層中遍曆出所有的進程並不是個容易事情的,

曾在看雪裡面看了幾個牛逼嘻嘻的文章,看完後,我是被搞的稀裡糊塗了,

主要是那種通過遍曆指定記憶體塊來擷取所有進程的方式確實夠變態,

而且這種方式在不同的 Windows 作業系統版本當中還完全不一樣,

其次,由於在那段時間裡面做的畢業設計確實比較多,

時間太緊了,根本沒有太多時間去琢磨這種變態的方式了,

所以在後來的 Windows 進程管理工具的開發中我便沒有採用上面那種在核心層裡面擷取進程資訊的方式了,

而是直接在上層中調用簡單的 Win32 API 來完成了所有進程的擷取。

而在使用者介面層上,本來確實是想使用 VC 來做的,但是眾所周知的是,用 VC 想做個漂亮介面那著實不容易,

而且在 VC 上,說實話,我並不那麼精通,相對於 C# 來說,我熟悉很多,開發起來速度也會快很多,

所以在最終方案的確定上,我採用 C# 來做使用者介面層,而在 C# 中調用 Win32 API 也是很容易的,

直接通過平台叫用即可以實現,上面談到的即是這個小項目的開發背景了。

             

            

設計

關於設計這一塊的話,由於是給某某人做的畢業設計,

所以就直接從他的畢業論文裡面摘抄一些出來算了,我也省下很多功夫的。

(所以下面的很多文字和就來自於別人的畢業論文,有蠻多還是廢話的)

項目採用三層架構設計,其實在這個項目中比沒有涉及到資料庫的操作,

所以肯定有人會問資料庫都沒有,要什麼資料訪問層,

但是別忘了平台叫用這個東西,其實我們可以把 Win32 平台看作是資料庫,

而我們的 Win32 API 則是 SQL 語句,這樣不就有了資料訪問層了。

其實在這裡將 Win32 API 的聲明放在資料訪問層中也是為了代碼之間的邏輯更加明確而已,並無太多實際意義。

三層架構圖:

功能模組圖:

1. 新任務模組

新任務模組就是能夠讓使用者選擇一個 Windows 作業系統下標準的可執行檔來建立一個新的進程。

在該模組中,使用者應該要能夠選擇一個可執行檔,

同時在程式中還必鬚根據使用者所選擇的可執行檔來建立新的進程,從而運行可執行檔。

2. 應用程式視窗管理模組

應用程式視窗管理模組中將列舉出 Windows 作業系統中當前登入的使用者下的所有的應用程式視窗,

並且能夠擷取到這些應用程式視窗的表徵圖以及視窗標題等等常用資訊。

視窗的管理組件括可以控制指定視窗的最大化或者最小化,或者是控制視窗前置和還原等等操作。

一個應用程式視窗只是一個進程的主介面視窗,所以一個應用程式視窗其實對應的是一個進程,

所以在應用程式視窗中還必須能夠跳轉到與該應用程式視窗相對應的進程當中。

3. 記憶體資訊查看模組

在 Windows 作業系統內建的工作管理員中,在記憶體資訊的查看上,其只有分頁檔使用率這一項,

而在很多時候我們所要查看的卻不僅僅只是分頁檔使用率,我們要查看的包括虛擬記憶體的使用率,

實體記憶體的使用率等,所以在 Windows 進程管理軟體當中便實現了可以查看機器虛擬記憶體的使用率,

實體記憶體的使用率,分頁檔的使用率,為了方便使用者查看近段時間內實體記憶體的使用率,

在記憶體資訊查看模組中應當還存在一條實體記憶體使用率的記錄曲線。

4. 處理器資訊查看模組

Windows 作業系統內建的工作管理員一樣,

Windows 進程管理軟體中將也提供了查看當前 CPU 使用率的功能,

並且相對於 Windows 作業系統內建的工作管理員來說,

Windows 進程管理軟體中的 CPU 使用率精確度更高。

5. 關機管理模組

Windows Server 系列作業系統內建的工作管理員提供了關機功能,

但是在 Windows 7 以及 Windows Vista 內建的工作管理員中則均不再提供關機功能,

雖然關機操作在 Windows 作業系統上很方便,但是有時候也並不非常方便,

所以在 Windows 進程管理軟體中將提供關機管理的功能,

在該功能塊中,將提供鎖定、登出、待機、睡眠、休眠、重啟、關機等功能。

6. 進程管理模組

進程管理模組首先需要擷取當前 Windows 作業系統中所有的進程,

並且將這些進程列舉在表格控制項中,其中需要擷取到進程的表徵圖,進程的標誌,

並且還需要計算出進程所佔有的 CPU 使用率。然後進程管理需要提供的功能是結束指定進程,

掛起進程或者恢複一個已被掛起的進程,

同時對於一些非特定的進程還可以通過設定優先權來提高或者降低該進程獲得 CPU 使用的幾率,

從而更好的控制進程。

7. 進程模組資訊模組

進程模組資訊指的是一個進程在其運行過程當中所引用的模組,這些模組包括進程自身所處的可執行檔,

也包括由 Windows 作業系統所提供的動態連結程式庫,

在很多時候,我們都需要查看一個進程引用了哪一些模組,

並且有的時候我們還需要控制一個進程對模組的引用,使得進程不能夠引用某些模組。

在進程模組資訊模組中所要完成的即是列舉出指定進程所引用的所有的模組,

並且能夠擷取到這些模組的表徵圖以及模組的名字,大小等等常用資訊。

8. 進程樹模組

一個進程肯定是由另外一個進程所建立的

(當然這不包括 Windows 在引導過程中由某些操作蛻化成進程的空閑進程和 System 進程),

既然一個進程肯定是由另外一個進程所建立的,那麼在這些進程之間肯定是存在一棵進程樹的,

而作為進程樹模組就是要列舉出指定進程的所有父進程,

這對於系統開發人員以及 Windows 研究人員是很有用的。

9. 進程私人記憶體資訊模組

在有些時候,比如在調試 Windows 應用程式時,我們可能通過調試器得出了該進程中的某段記憶體位址資訊,

但是我們無法更多的知道這段記憶體位址的詳細資料,而這些資訊在調試時是很重要的資料,

Windows 進程管理軟體中便提供了這一功能,即列出指定進程下的私人記憶體位址資訊。

10. 線程管理模組

Windows 作業系統內建的工作管理員中並不能操作指定進程的線程,

這在一定程度上造成了開發人員的不便,而在 Windows 進程管理軟體中便特別針對線程進行操作。

線上程管理模組中,首先列舉出了指定進程下的所有的線程資訊,並且使用者可以結束一個線程,

掛起一個線程或者恢複一個已被掛起的進程。

             

           

附點代碼

資料訪問層中的 ProcessDAL

using System;
using System.Runtime.InteropServices;
using ComType = System.Runtime.InteropServices.ComTypes;
using TaskManager.Entity;
 
namespace TaskManager.DAL
{
    public class ProcessDAL
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr hObject);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool DestroyIcon(IntPtr hIcon);
 
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool Process32First(IntPtr hSnapshot, 
            ref ProcessEntity.PROCESSENTRY32 lppe);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool Process32Next(IntPtr hSnapshot, 
            ref ProcessEntity.PROCESSENTRY32 lppe);
 
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr OpenProcess(UInt32 fdwAccess, 
            bool fInherit, UInt32 IDProcess);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool TerminateProcess(IntPtr hProcess, UInt32 uExitCode);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern UInt32 GetCurrentProcessId();
 
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool QueryFullProcessImageName(IntPtr hProcess, 
            Int32 dwFlags, String lpExeName, ref UInt32 lpdwSize);
 
        [DllImport("Psapi.dll", CharSet = CharSet.Auto)]
        public static extern UInt32 GetProcessImageFileName(IntPtr hProcess, 
            Char[] lpImageFileName, UInt32 nSize);
 
 
        /// <summary>
        /// 通過傳入進程控制代碼來獲得該進程的時間資訊
        /// </summary>
        /// <param name="ProcessHandle"></param>
        /// <param name="CreationTime"></param>
        /// <param name="ExitTime"></param>
        /// <param name="KernelTime"></param>
        /// <param name="UserTime"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool GetProcessTimes(IntPtr ProcessHandle, 
            out ComType.FILETIME CreationTime, out ComType.FILETIME ExitTime, 
            out ComType.FILETIME KernelTime, out ComType.FILETIME UserTime); 
 
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern UInt32 GetPriorityClass(IntPtr hProcess);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool SetPriorityClass(IntPtr hProcess, UInt32 dwPriorityClass);
 
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, 
            out ProcessEntity.MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);
 
        [DllImport("psapi.dll", CharSet = CharSet.Auto)]
        public static extern bool GetProcessMemoryInfo(IntPtr Process, 
            ref ProcessEntity.PROCESS_MEMORY_COUNTERS ppsmemCounters, Int32 cb);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool GetProcessIoCounters(IntPtr hProcess, 
            ref ProcessEntity.IO_COUNTERS lpIoCounters);
 
 
        //[DllImport("ntdll.dll", CharSet = CharSet.Auto)]
        //public static extern Int32 NtQueryInformationProcess(IntPtr hProcessHandle, 
        //    PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, 
        //    UInt32 processInformationLength, ref UInt32 returnLength);        
    }
}

                                 

                   

展示

其實廢話說那麼多根本沒什麼用的,還不如直接截幾張圖,然後對這個東西有興趣的給我留個郵箱,

我直接發他原始碼,他自個去看估計效果要好的多的。所以這裡就直接了。

              

應用程式表單(同 Windows 工作管理員一樣,列出當前所有開啟的的視窗):

                

應用程式表單管理:

                       

進程介面(列舉出所有的進程):

              

進程管理:

                       

處理器介面(描繪出 CPU 使用率圖):

                                     

記憶體介面(描繪出記憶體使用量率圖):

                       

查看進程樹(描繪出進程樹圖):

                

查看進程模組資訊:

             

查看進程記憶體資訊:

                 

查看進程線程資訊:

               

通過線程管理來實現進程管理:

                

進程詳細資料的查看:

                         

關機功能的實現:

                 

             

結束語

上面的這個 Windows 進程管理工具呢,其實裡面也還是稍微有一點點內涵的,

至少在平台叫用這一塊上,如果你把這個 Windows 進程管理工具搞定了的話,平台叫用是肯定難不住你了的。

最後呢,一直本著以前的作風,只要不是公司的項目,而且個人覺得還拿得出手的話,我一定會拿出來分享的。

但是我一直是在這個 Windows Live Writer 裡面寫部落格,所以也不曉得怎麼把這個項目給打包傳上去,

所以如果覺得還可以拿去學習一下的,給我留個郵箱就是了,到時候我會把源碼給你發過去的。

然後需要注意的是,這個東西大家不要肆意的傳播,自己學習學習就是了,

雖然我也是給別人做的畢業設計,但我可不希望這東西又落到某位畢業生手上並又成了他的畢業設計了,

這樣與我與他都不好。

              

         

著作權,迎轉載,但轉載請註明: 轉載自 Zachary.XiaoZhen - 夢想的天空

          

           

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.