枚举进程的两种方式
2015-07-22 15:34
190 查看
#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里面去获取
#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里面去获取
相关文章推荐
- Kafka深度解析
- Android Studio: how to remove/update the “Created by” comment added to all new classes?
- c语言,enum
- 连接数据库问题
- 解决Xcode 命令行打包时证书签名不成功的问题
- 单点故障--名词解释
- 关闭patchoat
- 框架基础(注解+反射)
- .net中如何实现json转化时只处理部分属性二?
- POJ_3461-Oulipo
- ubuntu(一)
- VBScript的数组下标
- mybatis(五)——mybatis表与表之间的关联映射
- 路径中 斜杠/和反斜杠\ 的区别
- C#委托和事件的实例讲解
- Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径
- c++11标准范围for语句的尝试
- Scala极速入门
- 全程解析Win7各个版本的主要区别
- 小胖说事31------iOS 真机编译错误"“XXX”的 iPod" and run "XXX" again, or if "XXX" is still running