描述
- 利用进程快照
CreateToolhelp32Snapshot
,进行进程、线程、进程模块的遍历
- 利用
FindFirstFile
、FindNextFile
,进行文件目录的遍历
进程快照的遍历
遍历进程
BOOL EnumProcess()
{
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hProcessSnap)
{
ShowError("CreateToolhelp32Snapshot");
return FALSE;
}
BOOL bRet = ::Process32First(hProcessSnap, &pe32);
while (bRet)
{
printf("[%d]\t", pe32.th32ProcessID);
printf("[%s]\n", pe32.szExeFile);
bRet = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
return TRUE;
}
遍历线程
OOL EnumThread()
{
THREADENTRY32 te32 = { 0 };
te32.dwSize = sizeof(THREADENTRY32);
HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (INVALID_HANDLE_VALUE == hThreadSnap)
{
ShowError("CreateToolhelp32Snapshot");
return FALSE;
}
BOOL bRet = ::Thread32First(hThreadSnap, &te32);
while (bRet)
{
printf("[%d]\t", te32.th32OwnerProcessID);
printf("[%d]\n", te32.th32ThreadID);
bRet = ::Thread32Next(hThreadSnap, &te32);
}
::CloseHandle(hThreadSnap);
return TRUE;
}
遍历进程模块
BOOL EnumProcessModule(DWORD dwProcessId)
{
MODULEENTRY32 me32 = { 0 };
me32.dwSize = sizeof(MODULEENTRY32);
HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
if (INVALID_HANDLE_VALUE == hModuleSnap)
{
ShowError("CreateToolhelp32Snapshot");
return FALSE;
}
BOOL bRet = ::Module32First(hModuleSnap, &me32);
while (bRet)
{
printf("[%d]\t", me32.th32ProcessID);
printf("[0x%p]\t", me32.modBaseAddr);
printf("[%s]\n", me32.szModule);
bRet = ::Module32Next(hModuleSnap, &me32);
}
::CloseHandle(hModuleSnap);
return TRUE;
}
文件遍历
- 利用递归来遍历文件目录,注意要过滤当前目录和上层目录
#include "stdafx.h"
#include "FileSearch.h"
void SearchFile(char *pszDirectory)
{
DWORD dwBufferSize = 2048;
char *pszFileName = NULL;
char *pTempSrc = NULL;
WIN32_FIND_DATA FileData = {0};
BOOL bRet = FALSE;
pszFileName = new char[dwBufferSize];
pTempSrc = new char[dwBufferSize];
::wsprintf(pszFileName, "%s\\*.*", pszDirectory);
HANDLE hFile = ::FindFirstFile(pszFileName, &FileData);
if (INVALID_HANDLE_VALUE != hFile)
{
do
{
if ('.' == FileData.cFileName[0])
{
continue;
}
::wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
SearchFile(pTempSrc);
}
else
{
printf("%s\n", pTempSrc);
}
} while (::FindNextFile(hFile, &FileData));
}
::FindClose(hFile);
delete []pTempSrc;
pTempSrc = NULL;
delete []pszFileName;
pszFileName = NULL;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库