windows系统下,C++统计进程内存使用情况

根据进程名获取进程pid

#include <iostream>
#include <string>
#include <ctime>
#include <thread>
#include < Windows.h>
#include <processthreadsapi.h>
#include <tlhelp32.h>
 
 
DWORD qureyProcessId(std::string name) {
    DWORD pid;
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
 
    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (std::string(entry.szExeFile) == name) {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
                pid = GetProcessId(hProcess);
                //std::cout << "pid = " << pid << std::endl;
                // Do stuff..
                CloseHandle(hProcess);
            }
        }
    }
    CloseHandle(snapshot);
    return pid;
}
int main() {
    auto pid = qureyProcessId("devenv.exe");
    std::cout << "pid of devenv.exe: " << pid << std::endl;
    return 0;
}

参考:WINDOWS下通过进程名称获取进程PID

GetProcessMemoryInfo获取进程使用情况

BOOL GetProcessMemoryInfo(
  [in]  HANDLE                   Process,
  [out] PPROCESS_MEMORY_COUNTERS ppsmemCounters,
  [in]  DWORD                    cb
);
  • [in] Process 进程的句柄。
  • [out] ppsmemCounters 指向PROCESS_MEMORY_COUNTERS或PROCESS_MEMORY_COUNTERS_EX结构的指针,该结构接收有关进程的内存使用情况的信息。
  • [in] cb ppsmemCounters 结构的大小(以字节为单位)。
typedef struct _PROCESS_MEMORY_COUNTERS {
  DWORD  cb;
  DWORD  PageFaultCount;
  SIZE_T PeakWorkingSetSize;
  SIZE_T WorkingSetSize;
  SIZE_T QuotaPeakPagedPoolUsage;
  SIZE_T QuotaPagedPoolUsage;
  SIZE_T QuotaPeakNonPagedPoolUsage;
  SIZE_T QuotaNonPagedPoolUsage;
  SIZE_T PagefileUsage;
  SIZE_T PeakPagefileUsage;
} PROCESS_MEMORY_COUNTERS;
cb结构大小(以字节为单位)。
PageFaultCount页错误数。
PeakWorkingSetSize峰值工作集大小(以字节为单位)。
WorkingSetSize当前工作集大小(以字节为单位)。
QuotaPeakPagedPoolUsage峰值分页池使用情况(以字节为单位)。
QuotaPagedPoolUsage当前页池使用情况(以字节为单位)。
QuotaPeakNonPagedPoolUsage峰值非分页池使用情况(以字节为单位)。
QuotaNonPagedPoolUsage当前非分页池使用情况(以字节为单位)。
PagefileUsage此过程的提交费用值(以字节为单位)。 提交费用是内存管理器为正在运行的进程提交的内存总量。
PeakPagefileUsage此过程的生存期内提交费用的峰值(以字节为单位)。
调用demo
#include <windows.h>
#include <stdio.h>
#include <psapi.h>

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1

void PrintMemoryInfo( DWORD processID )
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;

    // Print the process identifier.

    printf( "\nProcess ID: %u\n", processID );

    // Print information about the memory usage of the process.

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
    if (NULL == hProcess)
        return;

    if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
    {
        printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
        printf( "\tPeakWorkingSetSize: 0x%08X\n", 
                  pmc.PeakWorkingSetSize );
        printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
        printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakPagedPoolUsage );
        printf( "\tQuotaPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPagedPoolUsage );
        printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakNonPagedPoolUsage );
        printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaNonPagedPoolUsage );
        printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
        printf( "\tPeakPagefileUsage: 0x%08X\n", 
                  pmc.PeakPagefileUsage );
    }

    CloseHandle( hProcess );
}

int main( void )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    {
        return 1;
    }

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the memory usage for each process

    for ( i = 0; i < cProcesses; i++ )
    {
        PrintMemoryInfo( aProcesses[i] );
    }

    return 0;
}

MSDN demo
利用windows API获取当前进程占用内存以及整个系统当前内存使用情况

demo调用OpenProcess失败,返回错误码,5

调用OpenProcess失败解决方案
上面代码,如果非管理员用户,openprocess返回nullptr。
需要调用下面代码提权:

void enableDebugPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        return;
    }
 
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
    {
        CloseHandle(hToken);
        return;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
    {
        CloseHandle(hToken);
        return;
    }
}

调用上面代码后依然失败

openprocess

错误代码:5
Access is denied.访问被拒绝了。

要打开另一个本地进程的句柄并获得完全访问权限,必须启用SeDebugPrivilege特权。

您可以通过两种方式更改主令牌或模拟令牌中的权限:

  • 使用AdjustTokenPrivileges函数启用或禁用权限。
  • 使用CreateRestrictedToken函数限制或删除权限。

AdjustTokenPrivileges无法添加或删除令牌中的权限。它只能启用当前禁用的现有权限或禁用当前启用的现有权限。有关示例,请参见在C++中启用和禁用权限。
在访问令牌中启用特权允许进程执行以前无法执行的系统级操作。您的应用程序应该彻底验证权限是否适合帐户类型,特别是对于以下强大的权限。

要为用户帐户分配权限,请参阅为帐户分配权限。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
包括AccessEnum COM组件接口继承的实现 C++ 开发系列小工具 CPU 的精确计时器 c++图书管理系统 C语言编程宝典 C++语言开发的日期处理类库 C语言模块检查 DES 加密系统的 C 语言源代码 封装了NT下底层安全功能的类 DirectDraw扩展类 封装PDH功能的MFC类 IL2HDK31 HTTP服务器源代码 飞机订票系统课程设计源代码 ICS Lab 读文本文件 读取IDE硬盘系列号的源码 DOS linux源程序 定时清理Windows的指定的目录程序 定时关机程序 lzsslib 得到一个进程的状态 如是否没有反应 得到经过关联的文件类型图标 MAKEMDI2 得到当前进程的运行命令行信息 MB VIEW 存取注册表的类 NT 性能统计类 磁盘引导区保存和恢复 asm 磁盘碎片整理程序源代码 NT下读写端口 磁盘空间监测器 vc++在操作系统的应用大全 纯SDK编写的记事本仿真程序 WIN NT2000 服务程序样例 冲击波 2000 Win32 Create Local Admin User 测试设备写阴塞C语言函数 拨号上网源代码 WinCE下的触控屏驱动程序源代码 编译器make源码 WINNT 2000下直接写端口的VC++源程序 WinCE下的系统进程列出程序 WinNT 自动登录源程序 Windows 进程管理 WINDOWS 开发 TC 源程序库 改变屏幕分辨率 共享内存示范代码 获取操作系统版本信息">包括AccessEnum COM组件接口继承的实现 C++ 开发系列小工具 CPU 的精确计时器 c++图书管理系统 C语言编程宝典 C++语言开发的日期处理类库 C语言模块检查 DES 加密系统的 C 语言源代码 封装了NT下底层安全功能的类 DirectDraw扩展类 封装P [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值