1

Тема: AHK: Частный рабочий набор

Вот так можно узнать размер частного рабочего набора процесса через WMI:

PID := 2364
MsgBox, % ComObjGet("winmgmts:").InstancesOf("Win32_PerfRawData_PerfProc_Process WHERE IDProcess=" . PID).ItemIndex(0).WorkingSetPrivate//1024 . " kB"

А как правильно посчитать его через winapi?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

2

Re: AHK: Частный рабочий набор

Может посчитать через VirtualQueryEx MEM_PRIVATE?
https://docs.microsoft.com/en-us/window … nformation

3

Re: AHK: Частный рабочий набор

Там не так всё просто. Вот код для 32 бит, я не совсем понимаю его логику, попробую разобраться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

4

Re: AHK: Частный рабочий набор

Ну как разобрался?

5

Re: AHK: Частный рабочий набор

В логике разобрался, но не совсем понимаю одну вещь:

if ( (dPageAddress < 0xC0000000) || (dPageAddress > 0xE0000000) )

0xC0000000 — это, видимо, user space в 32-битных процессах. Что такое 0xE0000000? И какие значения будут соответствовать для 64 бит?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: Частный рабочий набор

Мне кажется проще перевести этот питоновский скрипт:
https://stackoverflow.com/questions/332 … in-windows
Там и алгоритм объяснён.

7 (изменено: serzh82saratov, 2018-07-15 04:05:51)

Re: AHK: Частный рабочий набор

Так там вроде алгоритма то нет, надо размер страниц умножить на количество страниц.
Размер узнается GetPerformanceInfo, а вот примеров с QueryWorkingSet на анк я не нашёл. Там вроде указатель на массив этих самых страниц.

Выдаёт общую память.


ProcessID := 8672
hProcess := DllCall("OpenProcess", "uint", 0x0010|0x0400, "int", 0, "uint", ProcessID, "ptr")
nSz := VarSetCapacity(QWS, A_PtrSize)
DllCall("psapi.dll\QueryWorkingSet", "ptr", hProcess, "ptr", &QWS, "uint", nSz)
MsgBox % Round(NumGet(QWS, 0, "UInt") * 4096 / 1024) " KB"
MsgBox % A_LastError 
DllCall("CloseHandle", "ptr", hProcess)

Структура, https://docs.microsoft.com/en-us/window … nformation.
Нужен PSAPI_WORKING_SET_BLOCK WorkingSetInfo, а из него ULONG_PTR Shared.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

8

Re: AHK: Частный рабочий набор

teadrinker
Только сейчас заметил твою ссылку. Вроде 2 разных подхода получается.
Из справки я понял, что первым вызовом QueryWorkingSet надо получить NumberOfEntries, на её основе задать размер структуры _PSAPI_WORKING_SET_INFORMATION, ещё раз вызвать QueryWorkingSet, в ней будут указатели на PSAPI_WORKING_SET_BLOCK WorkingSetInfo[1 - и далее].

typedef struct _PSAPI_WORKING_SET_INFORMATION {
  ULONG_PTR               NumberOfEntries;
  PSAPI_WORKING_SET_BLOCK WorkingSetInfo[1];
} PSAPI_WORKING_SET_INFORMATION, *PPSAPI_WORKING_SET_INFORMATION;

Их надо перебрать, и суммировать те, в которых есть флаг Shared.

typedef union _PSAPI_WORKING_SET_BLOCK {
  ULONG_PTR Flags;
  struct {
    ULONG_PTR Protection : 5;
    ULONG_PTR ShareCount : 3;
    ULONG_PTR Shared : 1;
    ULONG_PTR Reserved : 3;
    ULONG_PTR VirtualPage : 52;
    ULONG_PTR VirtualPage : 20;
  };
} PSAPI_WORKING_SET_BLOCK, *PPSAPI_WORKING_SET_BLOCK;
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

9

Re: AHK: Частный рабочий набор

Это я понял, остаётся вопрос с диапазонами просмотра страниц для разных битностей.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

10 (изменено: teadrinker, 2018-07-15 17:57:18)

Re: AHK: Частный рабочий набор

Malcev пишет:

Там и алгоритм объяснён.

Этот скрипт вообще просматривает все страницы подряд, насколько я понял. Надо попробовать так.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg