Блок среды процесса - Process Environment Block

В вычисление то Блок среды процесса (сокращенно PEB) - это структура данных в Windows NT семейство операционных систем. Это непрозрачная структура данных который используется операционной системой внутри, большинство полей которой не предназначены для использования чем-либо, кроме операционной системы.[1] Microsoft отмечает в своем Библиотека MSDN документация - в которой документированы только некоторые поля - что структура «может быть изменена в будущих версиях Windows».[2] PEB содержит структуры данных, которые применяются ко всему обработать, включая глобальный контекст, параметры запуска, структуры данных для загрузчика образа программы, базовый адрес образа программы и объекты синхронизации, используемые для предоставления взаимное исключение для структур данных всего процесса.[1]

PEB тесно связан с режим ядра ЭПРОЦЕСС структура данных, а также со структурами данных для каждого процесса, управляемыми в адресном пространстве Подсистема времени выполнения клиент-сервер обработать. Однако (как и структуры данных CSRSS) PEB сам по себе не является структурой данных режима ядра. Он находится в адресном пространстве режима приложения процесса, к которому он относится. Это связано с тем, что он предназначен для использования кодом режима приложения в библиотеках операционной системы, таких как NTDLL, который выполняется вне режима ядра, например код для загрузчика образа программы и диспетчера кучи.[3]

В WinDbg, команда, которая выгружает содержимое PEB, является ! галька команда, которой передается адрес PEB в адресном пространстве приложения процесса. Эту информацию, в свою очередь, получает !обработать команда, которая отображает информацию из ЭПРОЦЕСС структура данных, одно из полей которой является адресом PEB.[3]

Поля PEB, задокументированные Microsoft[2]
Полесмыслзаметки
ОтложенныйОтлаживается ли процессMicrosoft рекомендует не использовать это поле, а использовать официальную версию Win32. CheckRemoteDebuggerPresent() вместо этого библиотечная функция.[2]
LdrУказатель на PEB_LDR_DATA структура, предоставляющая информацию о загруженных модуляхСодержит базовый адрес ядро32 и ntdll.
Параметры процессаУказатель на RTL_USER_PROCESS_PARAMETERS структура, предоставляющая информацию о параметрах запуска процессаВ RTL_USER_PROCESS_PARAMETERS структура также в основном непрозрачна и не гарантирует единообразия в нескольких версиях Windows.[4]
PostProcessInitRoutineУказатель на функцию обратного вызова, вызываемую после инициализации DLL, но до вызова основного исполняемого кодаЭта функция обратного вызова используется на Windows 2000, но его использование в более поздних версиях Windows NT не гарантируется.[2]
Идентификатор сессииИдентификатор сеанса сеанса служб терминалов, частью которого является процесс.В NtCreateUserProcess() системный вызов инициализирует это, вызывая внутреннюю MmGetSessionId() функция.[3]

Содержимое PEB инициализируется NtCreateUserProcess() системный вызов, Собственный API функция, которая реализует часть и поддерживает Win32 CreateProcess(), CreateProcessAsUser(), CreateProcessWithTokenW(), и CreateProcessWithLogonW() библиотечные функции, находящиеся в библиотеки kernel32.dll и advapi32.dll а также подкрепление вилка () функция в Windows NT POSIX библиотека posix.dll.[3]

Для процессов POSIX Windows NT содержимое PEB нового процесса инициализируется NtCreateUserProcess() как просто прямую копию PEB родительского процесса, в соответствии с тем, как вилка() функция работает. Для процессов Win32 исходное содержимое PEB нового процесса в основном берется из глобальных переменных, поддерживаемых в ядре. Однако вместо этого несколько полей могут быть взяты из информации, представленной в файле образа процесса, в частности информации, представленной в IMAGE_OPTIONAL_HEADER32 структура данных в PE формат файла (PE + или PE32 + в 64-битных исполняемых образах).[3]

Поля из PEB, которые инициализируются из глобальных переменных ядра[3]
Полеинициализируется изможно переопределить информацией PE?
NumberOfProcessorsKeNumberOfProcessorsНет
NtGlobalFlagNtGlobalFlagНет
CriticalSectionTimeoutMmCriticalSectionTimeoutНет
HeapSegmentReserveMmHeapSegmentReserveНет
HeapSegmentCommitMmHeapSegmentCommitНет
HeapDeCommitTotalFreeThresholdMmHeapDeCommitTotalFreeThresholdНет
HeapDeCommitFreeBlockThresholdMmHeapDeCommitFreeBlockThresholdНет
MinimumStackCommitMmMinimumStackCommitInBytesНет
ImageProcessAffinityMaskKeActiveProcessorsImageLoadConfigDirectory.ProcessAffinityMask
OSMajorVersionNtMajorVersionOptionalHeader.Win32VersionValue & 0xFF
OSMinorVersionNtMinorVersion(OptionalHeader.Win32VersionValue >> 8) & 0xFF
OSBuildNumberNtBuildNumber & 0x3FFF в сочетании с CmNtCSDVersion(OptionalHeader.Win32VersionValue >> 16) & 0x3FFF в сочетании с ImageLoadConfigDirectory.CmNtCSDVersion
OSPlatformIdVER_PLATFORM_WIN32_NT(OptionalHeader.Win32VersionValue >> 30) ^ 0x2

В WineHQ В своей версии winternl.h проект предоставляет более полное определение PEB.[5] Более поздние версии Windows изменили количество и назначение некоторых полей.[6]

использованная литература

  1. ^ а б Раджив Нагар (1997). Внутреннее устройство файловой системы Windows NT: руководство разработчика. Серия О'Рейли. О'Рейли. стр.129. ISBN  9781565922495.
  2. ^ а б c d «Структуры процессов и потоков: структура PEB». Библиотека MSDN. Microsoft. 2010-07-15. Архивировано из оригинал на 2012-10-22. Получено 2010-07-15.
  3. ^ а б c d е ж Марк Э. Руссинович, Дэвид А. Соломон и Алекс Ионеску (2009). Внутреннее устройство Windows. Серия Microsoft Press (5-е изд.). Microsoft Press. С. 335–336, 341–342, 348, 357–358. ISBN  9780735625303.CS1 maint: несколько имен: список авторов (ссылка на сайт)
  4. ^ «Структуры процессов и потоков: структура RTL_USER_PROCESS_PARAMETERS». Библиотека MSDN. Microsoft. 2010-07-15. Получено 2010-07-15.
  5. ^ "вино winternl.h: typedef struct _PEB". GitHub. вино-зеркало. 29 октября 2019.
  6. ^ Чаппел, Джефф. «ПЭБ». Получено 30 октября 2019.

внешние ссылки