关于Windows任务管理器工作集(内存)和专用工作集(内存)之间的关系

GetMemoryInfo只有关于内存工作集的信息,并没有专用工作集的信息,我在网上搜到的答案是通过共享页面获得数据,但是获取的专用工作集(内存)的数据与任务管理器相差挺多的,有没有大佬遇到过这个问题,能不能帮忙解答一下,以下是我在网上搜索到的代码

求解!!!!!

 

 

SIZE_T GetMemoryInfo(DWORD dwPid,SIZE_T pageSize) {
     BOOL bRet = TRUE;
     PSAPI_WORKING_SET_INFORMATION SetInfo;              /*包含流程的工作集信息*/
     PBYTE pByte = NULL;
     DWORD realSize = 0; 
     PSAPI_WORKING_SET_BLOCK *pSetBlock = SetInfo.WorkingSetInfo; /*一个PSAPI WORKING SET BLOCK元素的数组,每个元素对应流程工作集中的每个页面*/
     memset(&SetInfo, 0, sizeof(SetInfo));
     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid);
     if (hProcess == NULL || hProcess == INVALID_HANDLE_VALUE) {
         int err = GetLastError();
         if (err == ERROR_INVALID_PARAMETER || err == ERROR_ACCESS_DENIED)  
             return 0;
         else {
         MessageBox(gs_hDialog, TEXT("Open Process Error!"),NULL,NULL);
         return -1;
         }
     }   
     /*检索有关当前添加到指定进程的工作集中的页的信息*/
     bRet = QueryWorkingSet(hProcess, &SetInfo, sizeof(SetInfo));
     if (!bRet) {
         if (GetLastError() == ERROR_BAD_LENGTH) {       /*workingsetinfo数组的条目数*/
             realSize = sizeof(SetInfo.NumberOfEntries) + SetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
         }
         try {
             pByte = new BYTE[realSize];
             memset(pByte, 0, realSize);
            pSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(SetInfo.NumberOfEntries));
            if (!QueryWorkingSet(hProcess, pByte, realSize)) {
                delete[] pByte;
                return 0;
            }
         }
         catch (char *e) {
             delete e;
             return 0;
         }
     }
     else {
         return 0;
     }
     SIZE_T workSetPrivate = 0;
     for (ULONG_PTR i = 0; i < SetInfo.NumberOfEntries; ++i) {
         if(!pSetBlock[i].Shared) // 如果不是共享页
             workSetPrivate += pageSize;
     }
     if(pByte)
         delete[] pByte;
     CloseHandle(hProcess);
     return workSetPrivate;
 }

 SIZE_T InitGetMemoryInfo(DWORD dwPid) {
     PERFORMANCE_INFORMATION PerForInfo;
     memset(&PerForInfo, 0, sizeof(PerForInfo));
     if(!::GetPerformanceInfo(&PerForInfo, sizeof(PerForInfo)))
         return -1;
     SIZE_T stPageSize = PerForInfo.PageSize;
     SIZE_T stMemorySize = GetMemoryInfo(dwPid,stPageSize)/1024;
     return stMemorySize;
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值