#include <windows.h>
#include <tlhelp32.h>
#include <cstdio>
#include <iostream>
#include <psapi.h>
using std::wcout;
int main( )
{
// 设置本地字符集
setlocale( LC_ALL , "chs" );
system( "pause" );
// 1. 使用快照来遍历进程
// 1.1 创建进程快照
HANDLE hProcSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS , 0 );
if( INVALID_HANDLE_VALUE == hProcSnap ) {
printf( "创建进程快照失败\n" );
return 0;
}
//typedef struct tagPROCESSENTRY32W
//{
// DWORD dwSize; // 结构体大小
// DWORD cntUsage; /// 不使用
// DWORD th32ProcessID; // this process
// ULONG_PTR th32DefaultHeapID; /// 不使用
// DWORD th32ModuleID; /// 不使用
// DWORD cntThreads; // 进程的线程个数
// DWORD th32ParentProcessID; // 父进程ID
// LONG pcPriClassBase; // 进程优先级
// DWORD dwFlags; /// 不使用
// WCHAR szExeFile[ MAX_PATH ]; // 进程名
//} PROCESSENTRY32W;
PROCESSENTRY32 processInfo ;
// 初始化结构体的结构体字节字段
processInfo.dwSize = sizeof( processInfo );
// 获取第一个进程
Process32First( hProcSnap , &processInfo );
int i = 0;
BOOL bTrue = FALSE;
BOOL bRet = FALSE;
TCHAR path[MAX_PATH];
DWORD dwPathLengh = MAX_PATH;
HANDLE hProc;
do
{
hProc = OpenProcess(PROCESS_QUERY_INFORMATION,/*打开的进程的权限*/
FALSE, /*打开进程得到的句柄是否继承给子进程*/
processInfo.th32ProcessID /*要打开的进程的ID*/
);
// 判断进行是否是32进程
bRet = IsWow64Process(hProc,/*要判断的进程句柄*/
&bTrue/*输出值, 记录是否是32位进程,TRUE是32,FALSE为64*/
);
if (hProc == NULL)
bRet = FALSE;
// 将得到的进程信息输出
wprintf(L"[%d],进程ID:%04d,父进程ID:%04d,进程优先级:%d,进 程名:%s[*%s]\n",
i++, //第一个参数
processInfo.th32ProcessID, //第二个参数
processInfo.th32ParentProcessID, //第三个参数
processInfo.pcPriClassBase, //第四个参数
processInfo.szExeFile, //第五个参数
(bRet && bTrue) ? L"32" : L"64"); //第六个参数,用三目运算符表示
dwPathLengh = MAX_PATH;
//if(GetProcessImageFileName(hProc, path, MAX_PATH))
if (QueryFullProcessImageName(hProc, 0, path, &dwPathLengh))
{
wprintf(L"\t%s\n", path);
}
// 获取下一个进程
} while (Process32Next(hProcSnap, &processInfo));
system( "pause" );
}
网友评论