⚙️Память и пулы Windows
Вся физическая память распределяется через системный диспетчер. Он выделяет большие объёмы через
VirtualAlloc() и мелкие через HeapAlloc(), которые на уровне ядра обращаются к NtAllocateVirtualMemory() и RtlAllocateHeap().Память делится на Paged Pool (может выгружаться на диск) и NonPaged Pool (всегда в ОЗУ). При старте создаётся несколько базовых пула для каждого пользователя в своей сессии, а также для всех системных служб. Это помогает системно управлять памятью и разграничивать процессы.
⚙️USER и GDI: Память и объектная таблица
🔸 USER-объекты (интерфейсные элементы) хранятся в куче рабочего стола.
🔸 GDI-объекты (графические примитивы) получают память из NonPagedSessionPool.
Объекты GDI привязаны к контексту создающего их процесса. Например, передача кисти из одного процесса в другой с высокой вероятностью может привести к сбоям.
Дескрипторы объектов управляются глобальной таблицей в каждой сессии и индексируются в фиксированной таблице с лимитом в 65,536 объектов. Например,
GDIProcessHandleQuota в реестре ограничивает доступный для процесса лимит (по умолчанию — 10,000 дескрипторов).⚙️Объекты USER
USER-объекты индексируются в таблице дескрипторов каждой сессии, которая отображается в пользовательском пространстве каждого GUI-процесса. Указатель на таблицу USER хранится в
win32k!gSharedInfo, и её записи отображаются через массив HANDLEENTRY, предоставляя быстрый доступ процессам без необходимости в вызовах ядра.🗣️ GDI и USER объекты — основа графической подсистемы Windows, которая позволяет управлять интерфейсом и графикой на уровне ядра.
➡️ Читать подробнее
