C++遍历windows进程及获取进程的各种信息

3 篇文章 0 订阅

C++遍历windows进程及获取进程的各种信息

遍历进程

bool TraverseProcesses()
{
	std::map<DWORD, ProcessInfo>mapPIdInfo{};
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);

	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE) {
		return false;
	}

	BOOL bResult = Process32First(hProcessSnap, &pe32);
	uint64_t netRecivedBytes = 0, netSentBytes = 0;
	//这个是获取的整个
	//系统的网络io并不是单个进程的。
	//CSystemInfo::GetNetIoBytes(nullptr, netSentBytes, netRecivedBytes, L"");

	while (bResult)
	{
		std::wstring name = pe32.szExeFile;
		auto id = pe32.th32ProcessID;
		
		//PROCESS_QUERY_LIMITED_INFORMATION
		//PROCESS_QUERY_LIMITED_INFORMATION //需要获取所有权限才可获取想要的信息 - PROCESS_ALL_ACCESS
		auto processHaldle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
		if (nullptr == processHaldle)
		{
			bResult = Process32Next(hProcessSnap, &pe32);
			continue;
		}

		DWORD size = MAX_PATH;
		TCHAR sExeName[MAX_PATH] = { 0 };
		if (FALSE == QueryFullProcessImageName(processHaldle, 0, sExeName, &size))
		{
			bResult = Process32Next(hProcessSnap, &pe32);
			continue;
		}
		wstring wstrProcessPath = sExeName;
		//GetModuleFileNameExW(processHaldle,nullptr, szProcessName, MAX_PATH); //win7下出错
		if (nullptr != processHaldle)
		{
			int64_t cpuUsage = 0;
			uint64_t memoryInfo = 0, vmem = 0, readDiskBytes = 0, writeDiskBytes = 0;
			CPorcessInfo::GetCpuUsage(processHaldle, pe32.th32ProcessID, cpuUsage);
			CPorcessInfo::GetMemoryUsage(processHaldle, memoryInfo, vmem);
			CPorcessInfo::GetIoBytes(processHaldle, readDiskBytes, writeDiskBytes);
			
			wstring wstrCmdline;
			auto res = CPorcessInfo::GetProcessCmdLine(processHaldle, wstrCmdline);
			mapPIDInfo.insert({ id, {name, wstrCmdline, id, pe32.cntThreads, cpuUsage, memoryInfo, readDiskBytes, writeDiskBytes, netRecivedBytes, netSentBytes} }); //字典存储
		}
		if (nullptr != processHaldle)
			CloseHandle(processHaldle);
		bResult = Process32Next(hProcessSnap, &pe32);
	}
	CloseHandle(hProcessSnap);
	return true;
}

获取系统进程的相关信息

std::map<int32_t, CpuLastTime> processIdToLastTime;
/// 获取当前进程的cpu使用率,返回false失败  
 bool GetCpuUsage(HANDLE procesHandle, DWORD processId, int64_t& cupUsage);
/// 获取当前进程内存和虚拟内存使用量,返回false失败,true成功  
 bool GetMemoryUsage(HANDLE procesHandle, uint64_t& mem, uint64_t& vmem);
/// 获取当前进程总共读和写的IO字节数,返回false失败,true成功  
bool  GetIoBytes(HANDLE procesHandle, uint64_t& read_bytes, uint64_t& write_bytes);
/// 获取进程的启动参数
bool GetProcessCmdline(HANDLE procesHandle, std::wstring& cmdline);
/// 获取系统每秒网络收发字节数
bool GetNetIoBytes(HANDLE procesHandle, uint64_t& read_bytes, uint64_t& write_bytes, const std::wstring& wszProcessName);
/// 获取指定磁盘的容量信息
bool GetDiskStatus(const wchar_t* path, uint64_t& total, uint64_t& free, uint64_t& usage);
/// 获得CPU的核数  
int32_t GetProcessorNumber();
/// 时间转换  
static uint64_t FileTime2Utc(const FILETIME* ftime)
{
	LARGE_INTEGER li;
	if (ftime == nullptr)return -1;
	li.LowPart = ftime->dwLowDateTime;
	li.HighPart = ftime->dwHighDateTime;
	return li.QuadPart;
}

bool GetCpuUsage(HANDLE processHandle, DWORD processId, int64_t& cpuUsage)
{
	//cpu数量  
	static int32_t processorCount = -1;
	//上一次的时间  
	static int64_t lastTime = 0;
	static int64_t lastSystemTime = 0;

	FILETIME now;
	FILETIME creation_time;
	FILETIME exit_time;
	FILETIME kernel_time;
	FILETIME user_time;
	int64_t system_time = 0;
	int64_t time = 0;
	int64_t system_time_delta = 0;
	int64_t time_delta = 0;

	if (processorCount == -1)
	{
		processorCount = CSystemInfo::GetProcessorNumber();
	}

	GetSystemTimeAsFileTime(&now);
	if (!GetProcessTimes(processHandle, &creation_time, &exit_time,
		&kernel_time, &user_time))
	{
		// We don't assert here because in some cases (such as in the Task Manager)  
		// we may call this function on a process that has just exited but we have  
		// not yet received the notification.  
		return false;
	}
	system_time = (FileTime2Utc(&kernel_time) + FileTime2Utc(&user_time)) / processorCount;
	time = FileTime2Utc(&now);

	if (processIdToLastTime[processId].lastSystemTime == 0 || processIdToLastTime[processId].lastTime == 0)
	{
		processIdToLastTime[processId].lastSystemTime = system_time;
		processIdToLastTime[processId].lastTime = time;
		return false;
	}

	system_time_delta = system_time - processIdToLastTime[processId].lastSystemTime;
	time_delta = time - processIdToLastTime[processId].lastTime;

	if (time_delta <= 0)
	{
		return false;
	}

	// We add time_delta / 2 so the result is rounded.  
	cpuUsage = (system_time_delta * 100 + time_delta / 2) / time_delta;
	processIdToLastTime[processId].lastSystemTime = system_time;
	processIdToLastTime[processId].lastTime = time;
	return true;
}

bool GetMemoryUsage(HANDLE procesHandle, uint64_t& mem, uint64_t& vmem)
{
	PROCESS_MEMORY_COUNTERS pmc;
	if (GetProcessMemoryInfo(procesHandle, &pmc, sizeof(pmc)))
	{
		mem = pmc.WorkingSetSize;
		vmem = pmc.PagefileUsage;
		return true;
	}
	return false;
}

bool GetIoBytes(HANDLE procesHandle, uint64_t& read_bytes, uint64_t& write_bytes)
{
	IO_COUNTERS io_counter;
	if (GetProcessIoCounters(procesHandle, &io_counter))
	{
		read_bytes = io_counter.ReadTransferCount;
		write_bytes = io_counter.WriteTransferCount;
		return true;
	}
	return false;
}

bool GetProcessCmdline(HANDLE procesHandle, std::wstring& cmdline)
{
	PROCESS_BASIC_INFORMATION pbi = {0};
	PEB                       peb;
	//PROCESS_PARAMETERS        ProcParam;
	DWORD                     dwDummy;
	DWORD                     dwSize;
	LPVOID                    lpAddress;
	RTL_USER_PROCESS_PARAMETERS para;
	//获取信息
	if (0 != NtQueryInformationProcess(procesHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(pbi), NULL))
	{
		return false;
	}
	if (pbi.PebBaseAddress == nullptr)
	{
		//do somthing 
	}
	if (FALSE == ReadProcessMemory(procesHandle, pbi.PebBaseAddress, &peb, sizeof(peb), &dwDummy))
	{
		return false;
	}
	if (FALSE == ReadProcessMemory(procesHandle, peb.ProcessParameters, &para, sizeof(para), &dwDummy))
	{
		return false;
	}

	lpAddress = para.CommandLine.Buffer;
	dwSize = para.CommandLine.Length;

	TCHAR* cmdLineBuffer = new TCHAR[dwSize+1];
	ZeroMemory(cmdLineBuffer, (dwSize + 1) * sizeof(WCHAR));
	if (FALSE == ReadProcessMemory(procesHandle, lpAddress, (LPVOID)cmdLineBuffer, dwSize, &dwDummy))
	{
		delete[] cmdLineBuffer;
		return false;
	}
	cmdline = cmdLineBuffer;

	delete[] cmdLineBuffer;
	return true;
}

int32_t GetProcessorNumber()
{
	SYSTEM_INFO info;
	GetSystemInfo(&info);
	return (int32_t)info.dwNumberOfProcessors;
}

bool GetNetIoBytes(HANDLE procesHandle, uint64_t& sent_bytes, uint64_t& received_bytes, const std::wstring& wszProcessName)
{
	HQUERY  hQuery = nullptr;
	HCOUNTER hcReceived = nullptr, hcSent = nullptr;
	PDH_FMT_COUNTERVALUE cv;

	PDH_STATUS lStatus = PdhOpenQuery(NULL, NULL, &hQuery);

	if (lStatus != ERROR_SUCCESS)return false;
	
	PdhAddCounter(hQuery, L"\\Network Interface(*)\\Bytes Sent/sec", NULL, &hcSent);
	PdhAddCounter(hQuery, L"\\Network Interface(*)\\Bytes Received/sec", NULL, &hcReceived);
	//PdhAddCounter(hQuery, L"\\PhysicalDisk(_Total)\\Avg. Disk Bytes/Write", NULL, &hcWrite);
	//PdhAddCounter(hQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &hcWrite);
	lStatus = PdhCollectQueryData(hQuery);
	if (lStatus != ERROR_SUCCESS)return false;
	Sleep(1000);
	lStatus = PdhCollectQueryData(hQuery);
	if (lStatus != ERROR_SUCCESS)return false;

	lStatus = PdhGetFormattedCounterValue(hcSent, PDH_FMT_LONG, NULL, &cv);
	if (lStatus == ERROR_SUCCESS)sent_bytes = cv.longValue;

	lStatus = PdhGetFormattedCounterValue(hcReceived, PDH_FMT_LONG, NULL, &cv);
	if (lStatus == ERROR_SUCCESS)received_bytes = cv.longValue;

	PdhRemoveCounter(hcSent);
	PdhRemoveCounter(hcReceived);
	PdhCloseQuery(hQuery);
	return true;
}

bool GetDiskStatus(const wchar_t* path, uint64_t& total, uint64_t& free, uint64_t& usage)
{
	ULARGE_INTEGER utotal;
	ULARGE_INTEGER ufree;
	ULARGE_INTEGER uavailable;
	if (FALSE == GetDiskFreeSpaceExW(path, &uavailable, &utotal, &ufree))
	{
		return false;
	}
	free   = ufree.QuadPart;
	total  = utotal.QuadPart;
	usage  = utotal.QuadPart - ufree.QuadPart;
	return true;
}
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你可以使用操作系统的进程管理工具来遍历服务进程。在 Linux 中,你可以使用 ps 命令来列出当前系统中的进程。你还可以使用 grep 命令来搜索某个关键词,以筛选出特定的进程。例如,你可以使用以下命令来查看所有以 "httpd" 开头的进程: ``` ps aux | grep "httpd" ``` 在 Windows 中,你可以使用任务管理器来查看和管理进程。你也可以使用命令行工具,如 tasklist 和 netstat 等,来查看和管理进程。 如果你想要编写代码来遍历服务进程,你可以使用操作系统提供的 API 来获取进程列表,然后通过遍历列表来实现。例如,在 Python 中,你可以使用 os 模块的 os.popen() 函数来执行系统命令,然后通过处理命令的输出来获取进程信息。 希望这对你有帮助。 ### 回答2: 遍历服务进程是指通过某种方法,逐个查看正在运行的服务进程。在Windows操作系统中,我们可以使用Task Manager(任务管理器)以及命令行工具等来实现。 使用Task Manager遍历服务进程非常简单。首先,我们可以通过快捷键Ctrl+Shift+Esc来打开Task Manager。在Task Manager的“进程”选项卡中,可以看到当前正在运行的所有进程。要查看服务进程,可以点击“服务”选项卡,然后在列表中浏览和查看各个服务进程。通过Task Manager,我们可以查看服务进程的名称、PID(进程ID)、CPU使用率、内存占用情况等信息。 除了Task Manager,我们还可以使用命令行工具来遍历服务进程。一个常用的命令是tasklist(任务列表),它可以列出系统中所有正在运行的进程,包括服务进程。在命令提示符下输入“tasklist”命令,即可显示所有进程信息。通过查看任务列表,我们可以找到所需的服务进程,了解它们的进程ID等详情。 需要注意的是,遍历服务进程需要具有管理员权限。在打开Task Manager或运行命令时,请确保使用管理员身份运行。 总之,无论是通过Task Manager还是命令行工具,遍历服务进程都是一项简单而重要的操作,它可以帮助我们了解正在运行的服务进程,并能够对其进行管理和优化。 ### 回答3: 遍历服务进程是指通过一定的方法或工具,对正在运行的服务进程进行遍历和查看。在Windows操作系统中,可以使用任务管理器来遍历服务进程。 首先,打开任务管理器。可以通过在任务栏上右键点击任务栏空白处,然后选择“任务管理器”来打开。或者可以使用组合键Ctrl+Shift+Esc来直接打开任务管理器。 在任务管理器界面中,选择“服务”选项卡。这个选项卡会列出当前正在运行的所有服务进程。 在服务选项卡中,可以看到每个服务进程的名称、描述、PID(进程标识符)、状态和用户名等信息。名称表示服务的具体名称;描述描述了服务的功能和作用;PID是系统给每个进程分配的唯一标识符;状态表示服务进程是正在运行、已停止还是正在停止中;用户名表示运行该服务进程的用户账户。 可以通过点击列标题,对服务进程进行排序,方便查看和管理。例如,点击“名称”列标题可以按照名称的字母顺序对服务进程进行排序。 另外,还可以通过右键点击某个服务进程,选择“结束任务”来停止该服务进程的运行。但要注意,结束某个服务可能会导致系统功能的异常或其他问题,所以在操作前请确认。 通过以上方法,就可以方便地遍历和查看当前正在运行的服务进程,对于了解系统运行情况、管理和维护电脑都有一定的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值