遍历进程
// 初始化Process列表
void InitProcessList()
{
// 创建进程快照
HANDLE hProcessSnap = 0;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
OutputDebugString(L"创建进程快照失败");
return;
}
// 创建结构体用来保存进程信息
PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};
// 获取第一个进程
Process32First(hProcessSnap, &process);
do
{
// 使用OpenProcess时必须保证本程序是管理员身份运行,并且拥有seDebug权限
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);
if (hProcess == INVALID_HANDLE_VALUE)
{
OutputDebugString(L"获取进程详细信息失败,");
}
BOOL Is32 = FALSE;
IsWow64Process(hProcess, &Is32);
CString szTemp; // 格式化信息
// 进程名
process.szExeFile;
// PID
szTemp.Format(L"%d", process.th32ProcessID);
// 运行平台
szTemp.Format(L"%d位程序", Is32 ? 32: 64);
// 运行平台
szTemp.Format(L"%d", process.th32ParentProcessID);
// 进程路径
DWORD dwSize = MAX_PATH;
WCHAR szName[MAX_PATH] = {};
BOOL bRet= QueryFullProcessImageName(hProcess, 0, szName, &dwSize);
} while (Process32Next(hProcessSnap,&process));
}
遍历线程
// 初始化Thread列表
void InitThreadList(DWORD PID)
{
// 创建线程快照
HANDLE hThreadSnap = 0;
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE) return;
// 用来保存线程信息
THREADENTRY32 stcTe32 = { sizeof(THREADENTRY32) };
// 获取第一个线程
Thread32First(hThreadSnap, &stcTe32);
CString szTemp;
do
{
// 筛选指定进程下的线程,插入到线程列表控件中
if (stcTe32.th32OwnerProcessID == PID)
{
// 当前线程ID
szTemp.Format(L"%d", stcTe32.th32ThreadID);
// 所属进程ID
szTemp.Format(L"%d", stcTe32.th32OwnerProcessID);
// 线程优先级
szTemp.Format(L"%d", stcTe32.tpBasePri);
}
} while (Thread32Next(hThreadSnap, &stcTe32));
}
遍历DLL模块
// 初始化DLL列表
void InitModuleList(DWORD PID)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
if (hProcess == INVALID_HANDLE_VALUE || !hProcess)return;
DWORD dwBuffSize = 0;
BOOL bRet = EnumProcessModulesEx(hProcess, NULL, 0, &dwBuffSize, LIST_MODULES_ALL);
HMODULE * pModuleHandlerArr = (HMODULE*) new char[dwBuffSize];
bRet = EnumProcessModulesEx(hProcess, pModuleHandlerArr, dwBuffSize, &dwBuffSize, LIST_MODULES_ALL);
// 模块名称
TCHAR szModuleName[MAX_PATH];
// 保存模块信息
MODULEINFO stcModuleInfo = { 0 };
// 遍历模块列表
int nCount = dwBuffSize / sizeof(HMODULE);
for (int i = 0; i < nCount; ++i)
{
// 根据进程句柄和模块句柄,获取模块信息
GetModuleInformation(hProcess, pModuleHandlerArr, &stcModuleInfo, sizeof(stcModuleInfo));
// 根据进程句柄和模块句柄,获取模块的路径(包括模块名)
GetModuleFileNameEx(hProcess, pModuleHandlerArr, szModuleName, MAX_PATH);
// 基址
CString szTemp;
szTemp.Format(L"%08X", stcModuleInfo.lpBaseOfDll);
// 入口点
szTemp.Format(L"%08X", stcModuleInfo.EntryPoint);
// 内存大小
szTemp.Format(L"%d", stcModuleInfo.SizeOfImage);
// 模块路径
szModuleName;
}
// 释放数组
delete[] pModuleHandlerArr;
pModuleHandlerArr = nullptr;
}
遍历窗口列表
// 初始化窗口列表
void InitWindowList()
{
EnumWindows(&CProcessManage::EnumWindowsProc, NULL);
}
// 窗口函数回调
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
static int nCount = 0;
// 获取窗口名
WCHAR szWindowName[MAXBYTE]={}, szClassName[MAXBYTE]={};
::GetWindowText(hwnd,szWindowName, MAXBYTE);
// 获取窗口类名
::GetClassName(hwnd, szClassName,MAXBYTE);
// 判断窗口是否隐藏
BOOL bIsShow = ::IsWindowVisible(hwnd);
CString szTemp = szWindowName;
if (bIsShow && !szTemp.IsEmpty())
{
// 窗口名称
szWindowName;
// 类名
szClassName;
}
return TRUE;
}