枚举本地远程NT系统进程[3]

[入库:2005年9月19日] [更新:2007年3月24日]

本文简介:

} while (rc == 0xc0000004);// STATUS_INFO_LEN_MISMATCH



if (rc <0) {

free (buf);

return 0;

}



 printf("\nProcessName ProcessID");

p = (struct process_info *)buf;

done = 0;



while (!done) {

if ((p->ProcessName.Buffer != 0))

{

 printf("\n%-20S%d",p->ProcessName.Buffer,p->ProcessId);



}

done = p->NextEntryDelta == 0;

p = (struct process_info *)(((char *)p) + p->NextEntryDelta);

}

free (buf);

FreeLibrary (hNtDll);

return 0;

}





<<第四部分:从PDH中取得本地/远程系统进程信息>>



 前面说的三种方法都只能枚举本地的系统进程,如何枚举远程系统的进程呢?目前我只知道从PDH中取得进程信息。

 OK!我先简单的说说PDH是什么东西,hoho~难的偶也不会。PDH是英文Performance Data Helper的缩写,Windows NT一直在更新这个称为Performance Data的数据库,这个数据库包含了大量的信息,例如CPU使用率,内存使用率,系统进程信息等等一大堆有用的信息,可以通过注册表函数来访问。注意哦,Windows 9x中并没有配置这个数据库。但是,这个数据库中的信息布局很复杂,很多人并不愿意使用它,包括我。而且刚开始的时候,它也没有自己特定的函数,只能通过现有的注册表函数来操作。后来,为了使该数据库的使用变得容易,MS开发了一组Performance Data Helper函数,包含在PDH.DLL文件中。

Windows 2000默认是允许远程注册表操作的,所以我们就可以通过连接远程系统的注册表,从它的PDH中取得我们所需要的系统进程信息了,当然这需要远程系统的Admin权限。

OK!我们下面所举的例子是直接利用注册表函数来从本地/远程系统的PDH数据库中取得我们所需要的数据的,我们并没有利用PDH API。



 程序代码如下:

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

Module:ps.c

Author:mikeblas@nwlink.com

Modify:ey4s

Http://www.ey4s.org

Date:2001/6/23

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

#include 

#include 

#include 



#define INITIAL_SIZE 51200

#define EXTEND_SIZE  12800

#define REGKEY_PERF "software\\microsoft\\windows nt\\currentversion\\perflib"

#define REGSUBKEY_COUNTERS"Counters"

#define PROCESS_COUNTER "process"

#define PROCESSID_COUNTER "id process"

#define UNKNOWN_TASK "unknown" 

#define MaxProcessNum 52//最大进程数量



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



typedef struct ProcessInfo

{

char ProcessName[128];

DWORD dwProcessID;

}pi;



void banner();

int ConnIPC(char *,char *,char *);

DWORD GetProcessInfo(pi *,char *,char *,char *);



int main(int argc,char **argv)

{

int i,iRet;

pi TaskList[MaxProcessNum];

banner();

if(argc==1)

{

iRet=GetProcessInfo(TaskList,NULL,NULL,NULL);

printf("\nProcess Info for [LOCAL]:");

}

else if(argc==4)

{

iRet=GetProcessInfo(TaskList,argv[1],argv[2],argv[3]);

printf("\nProcess Info for [%s]:",argv[1]);

}

else

{

printf("\nUsage:%s ",argv[0]);

return 1;

}

本文关键:枚举本地远程NT系统进程
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top