进程枚举之PSAPI函数

 

使用PSAPI (Process StatusAPI)函数

这是一种Windows NT/2000下的方法。核心是使用EnumProcesses函数。它的原型如下:

BOOL EnumProcesses(

__out  DWORD *lpidProcess, // 用于保存所有进程的PID的数组

__in   DWORD cb, // 上述数组的大小

__out  DWORD *cbNeeded // PID数组中实际返回的(有效)字节数

);

当获得系统中所有进程的PID后,我们就可以使用OpenProcess函数打开指定的进程,再调用GetModuleBaseName获得该进程的名字,调用EnumProcessModules枚举该进程调用的所有模块,调用GetModuleFileNameEx获得模块文件的全路径。

#include <windows.h>

#include <stdio.h>

#include <tchar.h>

#include "psapi.h"

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

 

void PrintProcessNameAndID( DWORDprocessID )

{

         TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

         //Get a handle to the process.

         HANDLEhProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

                   PROCESS_VM_READ,

                   FALSE,processID );

 

         //Get the process name.

         if(NULL != hProcess )

         {

                   HMODULE hMod;

                   DWORD cbNeeded;

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

                            &cbNeeded))

                   {

                            GetModuleBaseName(hProcess, hMod, szProcessName, 

                                     sizeof(szProcessName)/sizeof(TCHAR));

                   }

         }

 

         //Print the process name and identifier.

         _tprintf(TEXT("%s  (PID: %u)\n"),szProcessName, processID );

         CloseHandle(hProcess );

}

 

void main( )

{

         //Get the list of process identifiers.

         DWORD aProcesses[1024], cbNeeded, cProcesses;

         unsigned int i; 

 

         if( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )

                   return;

 

         //Calculate how many process identifiers were returned.

         cProcesses= cbNeeded / sizeof(DWORD);

 

         //Print the name and process identifier for each process.

         for( i = 0; i < cProcesses; i++ )

                   if(aProcesses[i] != 0 )

                            PrintProcessNameAndID(aProcesses[i] );

         system("pause");

}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值