枚举进程的两种方式

#include "stdafx.h"
#include <windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
#include <process.h>
#pragma comment(lib, "Psapi.lib")


int main(int argc, char* argv[])
{
//系统快照获取系统信息
// 创建一个当前系统的快照
HANDLE hProcessSnap =  CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


if (INVALID_HANDLE_VALUE == hProcessSnap)
{
return 1;
}
/*
typedef struct tagPROCESSENTRY32 {
    DWORD dwSize; // 结构大小;
    DWORD cntUsage; // 此进程的引用计数;
    DWORD th32ProcessID; // 进程ID;
    DWORD th32DefaultHeapID; // 进程默认堆ID;
    DWORD th32ModuleID; // 进程模块ID;
    DWORD cntThreads; // 此进程开启的线程计数;
    DWORD th32ParentProcessID;// 父进程ID;
    LONG pcPriClassBase; // 线程优先权;
    DWORD dwFlags; // 保留;
    char szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;
*/
PROCESSENTRY32W pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32W);
//是否获取到了第一条消息
// 获取到了bNext = true
// 没有获取到bNext = false
bool bNext = Process32FirstW(hProcessSnap, &pe32);
if(!bNext)
{
printf(" Process32First失败,错误ID:%d", GetLastError());
}
// 是否还有下一条
// 遍历下一条的信息
while(bNext)
{
printf("进程名:%30ws\t进程ID:%5d\r\n", pe32.szExeFile, pe32.th32ProcessID);


bNext = Process32NextW(hProcessSnap, &pe32);
}

printf("*******************************************************\r\n");
//枚举  只能获取进程的ID 和 进程模块的路径
DWORD dwProcessIDs[MAXBYTE] = { 0 };
DWORD cdNeededProcess = 0;

//32位程序的信息 XP Win7下面
/* OpenProcess dwDesiredAccess: 指定打开后,该进程的访问权限
PROCESS_ALL_ACCESS 给予进程所有可能允许的权限.
PROCESS_DUP_HANDLE允许使用DuplicateHandle函数进行进程句柄的复制操作.
PROCESS_QUERY_INFORMATION允许函数GetExitCodeProcess 或函数GetPriorityClass functions 查询进程的信息时使用该句柄.
PROCESS_SET_INFORMATION允许函数SetPriorityClass使用此句柄进行优先级设置.
PROCESS_TERMINATE允许函数TerminateProcess 使用此句柄关闭进程.
PROCESS_VM_OPERATION 允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存.
PROCESS_VM_READ or PROCESS_VM_WRITE 允许函数访问和写入权限
SYNCHRONIZE Windows NT 专用: 允许同步函数使用此句柄.
*/
//枚举 
if (!EnumProcesses(dwProcessIDs, MAXBYTE, &cdNeededProcess))
return 1;

for(int index = 0; index < cdNeededProcess / sizeof(DWORD); ++index)
{
HANDLE hPrcoess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessIDs[index]);
if(NULL == hPrcoess)
{
}
else
{
//获得指定进程中所有模块的句柄
HMODULE hMods[MAXBYTE] = { 0 };
DWORD cdNeededModule = 0;
EnumProcessModules(hPrcoess, hMods, MAXBYTE, &cdNeededModule);
//获取指定进程模块的路径
char szModuleName[MAXBYTE] = { 0 };
GetModuleFileNameExA(hPrcoess, hMods[0], szModuleName, MAXBYTE);
printf("进程名:%s\t进程ID:%5d\r\n", szModuleName, dwProcessIDs[index]);
}
CloseHandle(hPrcoess);
}

system("pause");
return 0;

}


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

这个需要到Microsoft Platform SDK里面去获取

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值