进程列表实用程序
一个显示正在运行进程的一些信息的实用程序
引言
这是一个用于列出进程并显示有关进程信息的实用工具。 只有两个有效的参数:
- -h - 显示帮助
- -v - 增加详细程度。
可用级别:
- 1 - PID 和进程名称
- 2 - PID、进程名称和模块
- 3 - PID、进程名称、模块、基地址、入口点和镜像大小
该实用工具可以用作以下函数的参考:
EnumProcesses()
OpenProcess()
EnumprocessModules()
GetModuleBaseName()
GetModuleInformation()
下载中仅包含源代码。 该程序使用 Devcpp
开发,但应该可以在大多数 Windows C/C++ 编译器上正常编译。 要创建该实用工具,必须将其链接到 psapi.lib。
源代码如下:
#include <stdio.h>
#include <windows.h>
#include <psapi.h>
#define PROCMAXCOUNT 4096
void ShowHelp(unsigned char *pname, int exitcode);
int main(int argc, char **argv)
{
int aa,bb,mode=0;
DWORD pIDs[PROCMAXCOUNT],pIDssz,pIDscount,Modssz,Modscount;
HANDLE proch;
HMODULE Mods[4096];
unsigned char mbasename[MAX_PATH];
MODULEINFO minfo;
/* parse arguments: only valid -h for help -v for verbose. can be repeted 2x */
for (aa=1;aa<argc;aa++) {
if (!strcmp(argv[aa],"-v")) {
mode++;
if (mode>2) {
ShowHelp(argv[0],1);}}
else {
if (strcmp(argv[aa],"-h")) {
ShowHelp(argv[0],2);}
else {
ShowHelp(argv[0],3);}}}
/* enumerate processes */
if (EnumProcesses(pIDs,sizeof(pIDs),&pIDssz)==FALSE) {
fprintf(stderr,"error enumerating processes\n");
return 1;}
/* show processes info */
pIDscount=pIDssz/sizeof(DWORD);
for (aa=0;aa<pIDscount;aa++) {
/* open process */
if (!(proch=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pIDs[aa])))
continue;
/* enumerate modules */
if (!EnumProcessModules(proch,Mods,sizeof(HMODULE)*4096,&Modssz)) {
continue;}
Modscount=Modssz/sizeof(DWORD);
if ((mode>0)&&aa) {
fprintf(stdout,"\n");}
/* first module representes own process */
if (!mode) {
Modscount=1;}
for (bb=0;bb<Modscount;bb++) {
GetModuleBaseName(proch,Mods[bb],mbasename,MAX_PATH/sizeof(unsigned char));
if (!bb) {
fprintf(stdout,"%i - ",pIDs[aa]);}
if (mode==2) {
/* extract module information */
if (!GetModuleInformation(proch,Mods[bb],&minfo,sizeof(MODULEINFO))) {
continue;}}
fprintf(stdout,"%s%s%s",!bb?"":"\t",mbasename,mode==2?"\t":"\n");
if (mode==2) {
fprintf(stdout,"(Base: 0x%x, Entry: 0x%x, Size: %i)\n",
minfo.lpBaseOfDll,minfo.EntryPoint,minfo.SizeOfImage);}}}
return 0;
}
/* show help andexit with exitcode */
void ShowHelp(unsigned char *pname,int exitcode)
{
unsigned char *basename;
/* figure out exe basename */
basename=strrchr(pname,'\\');
if (basename) {
basename++;}
else {
basename=pname;}
/* show help */
fprintf(stderr,"usage:\n\
\t%s -h - Show this\n\
\t%s -v - Increase verbose level (0 to 2)\n\n\n\
verbose 1: PID + process name\n\
2: PID + process name + modules names\n\
3: PID + process name + modules names +\n\
base address + entry point + image size\n",basename,basename);
exit(exitcode);
}