#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 <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里面去获取