QueryWorkingSet всегда возвращает false - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь получить размер выделенного для процесса, описанного изображениями, private и mapped. Я использую QueryWorkingSet для получения информации о рабочем наборе, а затем о блоке рабочего набора.

Когда я вызываю его впервые, метод GetLastError возвращает 24, что и следовало ожидать, поэтому в следующий раз, когда я вызываю QueryWorkingSet, я устанавливаю другой размер для блока, но затем получаю код ошибки 998.

Я неправильно использую QueryWorkingSet, или я получаю ручку для процесса с неправильными правами доступа, или мне недостаточно изменить размер?

#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(pwsi));
    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, &wsi, ws_size);
        DWORD teste = sizeof(wsi);
        if (resQws) {
            for (int i = 0; i < pwsi->NumberOfEntries; i++) {
                PSAPI_WORKING_SET_BLOCK ws_block = pwsi->WorkingSetInfo[1];
                //Access page information.
                SIZE_T size = VirtualQuery((LPCVOID*)ws_block.VirtualPage, &mbi, 1);
                if (size != 0 && pmbi ->State == 0x1000) {
                    switch (pmbi->Type)
                    {
                    case 0x1000000: // MEM_IMAGE
                        committedCounter->img += pageSz;
                        break;
                    case  0x40000: //MEM_MAPPED
                        committedCounter->map += pageSz;
                        break;
                    case 0x20000: //MEM_PRIVATE
                        committedCounter->prv += pageSz;
                        break;
                    }
                }
                else if (size == 0) {
                    return res;
                }
            }
            CloseHandle(processHandle);
            res = true;
            return res;
        }
        free(pwsi); 
    }
        numberOfTries--;
}

    CloseHandle(processHandle);
    return false;

}

1 Ответ

0 голосов
/ 03 ноября 2018

В вашем коде есть опечатка. Просто измените:

BOOL resQws = QueryWorkingSet(processHandle, &wsi, ws_size);

до:

BOOL resQws = QueryWorkingSet(processHandle, pwsi, ws_size);

И тогда вызов успешен.

Могут быть и другие ошибки, но я их не исследовал.

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