Подсчет зафиксированных страниц процесса - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь получить выделенный объем памяти определенного процесса, разделенный на изображения, частные и отображаемые страницы. Хотя я не получаю ошибок, значения намного больше, чем я ожидал (примерно в 10 раз больше).

Я использую VirtualQueryEx для получения информации о блоке, а затем обновляю базовый адрес и запрашиваю новый базовый адрес. Неправильно ли обновлено значение и / или мое условие в цикле while?

#include "pch.h"
#include <Windows.h>
#include<WinDef.h>
#include <psapi.h>
#include <iostream>

typedef struct {
    DWORD img;
    DWORD map;
    DWORD prv;
} CommitCounters, *PCommitCounters;


BOOL  GetCommitCountersFromProcess(_In_ int pid, _Out_ PCommitCounters committedCounter ) {
int numberOfTries = 3;
SYSTEM_INFO si;
GetSystemInfo(&si);
DWORD pageSz = si.dwPageSize;

PSAPI_WORKING_SET_INFORMATION wsi, *pwsi;
pwsi = &wsi;
DWORD ws_size;
MEMORY_BASIC_INFORMATION mbi, *pmbi;
pmbi = &mbi;

HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
wsi.NumberOfEntries = 0;

QueryWorkingSet(processHandle, &wsi, sizeof(wsi));
BOOL res = false;
committedCounter->img = 0;
committedCounter->map = 0;
committedCounter->prv = 0;

while (numberOfTries > 0) {
DWORD lastError = GetLastError();

    //ERROR_BAD_LENGTH
    if (lastError == 24) {
        ws_size = sizeof(wsi) + sizeof(PSAPI_WORKING_SET_INFORMATION) + sizeof(PSAPI_WORKING_SET_BLOCK) * wsi.NumberOfEntries;
        pwsi = (PSAPI_WORKING_SET_INFORMATION*) malloc(ws_size);

        pwsi->NumberOfEntries = wsi.NumberOfEntries;
        BOOL resQws = QueryWorkingSet(processHandle, pwsi, ws_size);
        DWORD teste = sizeof(wsi);
        if (resQws) {
            SIZE_T totalSize = (pwsi->NumberOfEntries) * pageSz;
            SIZE_T size = 0; 
            //for (int i = 0; i < pwsi->NumberOfEntries; i++) {
            PSAPI_WORKING_SET_BLOCK ws_block = pwsi->WorkingSetInfo[0];
            LPCVOID* virtualPage = (LPCVOID*)ws_block.VirtualPage;
            while (size <= totalSize)
            {
                //Access page information.

                SIZE_T vqe =  VirtualQueryEx(processHandle, virtualPage, pmbi, sizeof(mbi));
                lastError = GetLastError();

                if (vqe != 0 && (pmbi -> State & MEM_COMMIT) ) {
                    res = true;
                    switch (mbi.Type)
                    {
                    case MEM_IMAGE: 
                        committedCounter->img += pmbi->RegionSize;
                        break;
                    case  MEM_MAPPED: 
                        committedCounter->map += pmbi->RegionSize;
                        break;
                    case MEM_PRIVATE:
                        committedCounter->prv += pmbi->RegionSize;
                        break;
                    }
                }
                else if (vqe == 0) {
                    return res;
                }
                size += pmbi->RegionSize;
                virtualPage = (LPCVOID*)((char*)virtualPage + pmbi->RegionSize);
            }
            CloseHandle(processHandle);
            return res;
        }
        free(pwsi); 
    }
        numberOfTries--;
}

    CloseHandle(processHandle);
    return false;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...