获取进程的内存(专用工作集)

#include <iostream>
#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
using namespace std;

SIZE_T CalcWorkSetPrivate(HANDLE hProcess, SIZE_T pageSize)
{
    BOOL bRet = TRUE;
    PSAPI_WORKING_SET_INFORMATION workSetInfo;
    PBYTE pByte = NULL;
    PSAPI_WORKING_SET_BLOCK *pWorkSetBlock = workSetInfo.WorkingSetInfo;
    memset(&workSetInfo, 0, sizeof(workSetInfo));
    // 要求操作进程的权限:PROCESS_QUERY_INFORMATION and PROCESS_VM_READ
    // 第一次调用获取实际缓冲区大小
    bRet = ::QueryWorkingSet(hProcess, &workSetInfo, sizeof(workSetInfo));
    if(!bRet) // 调用失败
    {
        if(GetLastError() == ERROR_BAD_LENGTH) // 需要重新分配缓冲区
        {
            DWORD realSize = sizeof(workSetInfo.NumberOfEntries)
                + workSetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
            try
            {
                pByte = new BYTE[realSize];
                memset(pByte, 0, realSize);
                pWorkSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(workSetInfo.NumberOfEntries));
                // 重新获取
                if(!::QueryWorkingSet(hProcess, pByte, realSize))
                {
                    delete[] pByte; // 清理内存
                    return 0;
                }
            }
            catch(char *e) // 分配内存失败
            {
               // e->Delete();
                return 0;
            }
 
        }
        else // 其它错误,认为获取失败
            return 0;
    }
    SIZE_T workSetPrivate = 0;
    for (ULONG_PTR i = 0; i < workSetInfo.NumberOfEntries; ++i)
    {
        if(!pWorkSetBlock[i].Shared) // 如果不是共享页
            workSetPrivate += pageSize;
    }
    if(pByte)
        delete[] pByte;
    return workSetPrivate;
}

void main( )
{
    PERFORMANCE_INFORMATION performanceInfo;
    memset(&performanceInfo, 0, sizeof(performanceInfo));
    if(!::GetPerformanceInfo(&performanceInfo, sizeof(performanceInfo)))
     return ;
   SIZE_T m_stPageSize = performanceInfo.PageSize; // 获取页面大小, 单位:byte

    SIZE_T d = CalcWorkSetPrivate(OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, 11460 ), m_stPageSize);
    printf("%d\n",d);
    system("pause");
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jena_wy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值