} 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;
}