PSAPI—Enumerate Process

PSAPI: 枚举系统Process

PSAPI提供了一系列函数来查看系统中的各种信息,包括ProcessModulesDevice Driver等等,MSDN上介绍的很详细。

今天就记录一下使用PSAPI来枚举系统中的所有Process

主要使用的函数就这几个:

EnumProcess()OpenProcess()CloseHandle()GetModuleBaseName()EnumProcessModules()

 

1.使用EnumProcess()取得系统中的所有Process ID

       MSDN上所言,由于很难预测系统当前的Process个数,因此推荐使用一个较大的数组;

2.使用OpenProcess()取得Process Handle

       需要对进程具有PROCESS_QUERY_INFORMATIONPROCESS_VM_READ权限,对于有些系统进程可能会失败,比如System Idle Process

3.使用EnumProcessModules()取得可执行程序HMODULE句柄

       取得Handle后,就可以使用EnumProcessModules()取得可执行程序HMODULE句柄了,这个函数可以返回Process载入的所有Module,这里传入大小为1的数组即可,它总是代表了可执行程序的句柄。

4.使用GetModuleBaseName()获得Process名字

       取得Process的可执行程序名字,不包含路径;

5CloseHandle()关闭进程句柄

       这一步不要忘了。

 

最后贴下示例程序代码:

 

#include <windows.h>

#include <stdio.h>

#include <psapi.h>

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

int main()

{

    DWORD vecProcessID[2048]; // sufficient most of time

    DWORD cbNeeded, dwSize;

    dwSize = sizeof(vecProcessID);

    // if cbNeeded >= sizeof(vecProcessID) try again with a larger array

    if(EnumProcesses(vecProcessID, dwSize, &cbNeeded)){

        HANDLE hProcess;

        HMODULE hMod; // we only need the first module handle here

        dwSize = cbNeeded/sizeof(vecProcessID[0]);

        for(DWORD i = 0; i < dwSize; i++){

            char name[MAX_PATH] = "<Unknown>";

            hProcess = OpenProcess(

                PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,

                FALSE, vecProcessID[i]);

            if(hProcess != NULL){

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

                                                        &cbNeeded)){

                    GetModuleBaseName(hProcess, hMod, name, sizeof(name)-1);

                }

                else{

                    printf("EnumProcessModules[%u] Error:%u/n",

                            vecProcessID[i], GetLastError());

                }

                CloseHandle(hProcess);

            }

            printf("%u/t%s/n", vecProcessID[i], name);

        }

    }

    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值