程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 枚舉本地-遠程NT系統進程

枚舉本地-遠程NT系統進程

編輯:關於C語言

 

 

  Windows2000中有個工具taskmgr.exe就可以比較詳細的查看當前系統進程信息,但是那是Windows GUI程序,有時候是不是覺得命令行下的東西更方便呢?其實已經有不少命令行下的枚舉系統進程的工具了.

 

  進程通常被定義為一個正在運行的程序的實例,它由兩部分組成:

 

  <1>操作系統用來管理進程的內核對象。內核對象也是系統用來存放關於進程的統計信息的地方。

 

  <2>地址空間。它包含所有可執行模塊或DLL模塊的代碼和數據。它還包含動態內存分配的空間,如線程的堆棧和堆分配空間。

 

  枚舉系統進程的實現方法大概有四種,其中有一種可以用來枚舉遠程NT系統的進程,前提是有遠程系統的管理員權限。

 

 

 

<<第一部分:調用PSAPI函數枚舉系統進程>>

 

  M$的Windows NT開發小組開發了自己Process Status函數,包含在PSAPI.DLL文件中,這些函數只能在高於NT4.0以後的版本中使用。PSAPI一共有14個函數[實際PSAPI.DLL輸出函數有19個,但其中有5個函數有兩個版本,分別是ANSI和Unicode版本],通過調用這些函數,我們可以很方便的取得系統進程的所有信息,例如進程名、進程ID、父進程ID、進程優先級、映射到進程空間的模塊列表等等。為了方便起見,以下的例子程序只獲取進程的名字和ID。

 

  簡單的程序如下:

 

/*************************************************************************

 

Module:ps.c

 

說明:調用PSAPI函數枚舉系統進程名和ID,Only for NT/2000

 

*************************************************************************/

 

#include

 

#include

 

#include "psapi.h"

 

 

 

#pragma comment(lib,"psapi.lib")

 

 

 

void PrintProcessNameAndID( DWORD processID )

 

{

 

  char szProcessName[MAX_PATH] = "unknown";

 

  //取得進程的句柄

 

  HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

 

                  PROCESS_VM_READ,

 

                  FALSE, processID );

 

  //取得進程名稱

 

  if ( hProcess )

 

  {

 

    HMODULE hMod;

 

    DWORD cbNeeded;

 

    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )

 

      GetModuleBaseName( hProcess, hMod, szProcessName,

 

sizeof(szProcessName) );

 

  }

 

  //回顯進程名稱和ID

 

  printf( " %-20s%-20d", szProcessName, processID );

 

  CloseHandle( hProcess );

 

}

 

 

 

void main( )

 

{

 

  DWORD aProcesses[1024], cbNeeded, cProcesses;

 

  unsigned int i;

 

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved