注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

使用EnumProcesses函数遍历进程  

2014-08-01 13:56:08|  分类: Windows编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

EnumProcesses函数在头文件Psapi.h中定义,位于Psapi.dll文件中(Windows 7中则是位于Kernel32.dll),用于遍历当前活动进程的PID,函数原型如下:

BOOL WINAPI EnumProcesses(DWORD *pProcessIds,DWORD cb,DWORD *pBytesReturned);

第一个参数是指向保存PID的一个数组首地址,而第二个参数为数组的大小(以字节为单位),而第三个参数则是传出值,指明了实际上为了保存这些PID所使用的字节数。如果函数执行完成之后,返回的是TRUE,但是如果第三个参数的值同数组的体积(字节为单位),则表明数组空间不够,需要使用更大的空间。MSDN中的一个例子(链接猛击这里)使用了一个1024个元素的数组,虽然这个大小是够用了,但是略微有点空间的浪费,这里使用了一个动态内存分配的方式,获取PID,并调用了QueryFullProcessImageName获取可执行程序的映像名称。代码如下:

#include <stdio.h>
#include <Windows.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib") 

void ListPIDs()
{
    int n=16;//initial size
    int i;
    PDWORD pdwArr=NULL;
    DWORD dwcbNeeded;
    BOOL ret;
    HANDLE hDefaultHeap=NULL;
    WCHAR ProcessName[MAX_PATH] = L"<unknown>";
    hDefaultHeap=GetProcessHeap();
    if(hDefaultHeap==NULL)
    {
        printf("Failed to get process heap.\n");
        return;
    }
    do
    {
        n*=2;
        pdwArr=(PDWORD)HeapAlloc(hDefaultHeap,0,n*sizeof(DWORD));
        if(pdwArr==NULL)
        {
            printf("Failed to create PID array\n");
            return;
        }
        ret=EnumProcesses(pdwArr,n*sizeof(DWORD),&dwcbNeeded);
        if(!ret)
        {
            printf("Failed to enumerate PIDs\n");
            return;
        }
    }while(dwcbNeeded==n*sizeof(DWORD));
    //Note Idle is not a real process
    printf("Total Processes: %d\n",dwcbNeeded/sizeof(DWORD)-1);
    for(i=0;i<dwcbNeeded/sizeof(DWORD);i++)
    {
        DWORD pid=*(pdwArr+i);
        if(pid==0)//'System Idle Process' is not a real process
            continue;
        printf("PID=%6d\t",pid);
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE, pid);
        if(hProcess!=NULL)
        {
            DWORD len=MAX_PATH;
            QueryFullProcessImageName(hProcess,0,ProcessName,&len);
            if(len!=0)
                wprintf(L"%s",ProcessName);
        }
        printf("\n");
    }
    HeapFree(hDefaultHeap,0,pdwArr);
    CloseHandle(hDefaultHeap);
}
程序执行效果如下(任务管理器放在背景作为对比):
CX_0801_135318

  评论这张
 
阅读(840)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016