Process Environment Block


In computing the Process Environment Block is a data structure in the Windows NT operating system family. It is an opaque data structure that is used by the operating system internally, most of whose fields are not intended for use by anything other than the operating system. Microsoft notes, in its MSDN Library documentation — which documents only a few of the fields — that the structure "may be altered in future versions of Windows". The PEB contains data structures that apply across a whole process, including global context, startup parameters, data structures for the program image loader, the program image base address, and synchronization objects used to provide mutual exclusion for process-wide data structures.
The PEB is closely associated with the kernel mode EPROCESS data structure, as well as with per-process data structures managed within the address space of the Client-Server Runtime Sub-System process. However, the PEB is not a kernel mode data structure itself. It resides in the application mode address space of the process that it relates to. This is because it is designed to be used by the application-mode code in the operating system libraries, such as NTDLL, that executes outside of kernel mode, such as the code for the program image loader and the heap manager.
In WinDbg, the command that dumps the contents of a PEB is the !peb command, which is passed the address of the PEB within a process' application address space. That information, in turn, is obtained by the !process command, which displays the information from the EPROCESS data structure, one of whose fields is the address of the PEB.
Fieldmeaningnotes
BeingDebuggedWhether the process is being debuggedMicrosoft recommends not using this field but using the official Win32 CheckRemoteDebuggerPresent library function instead.
LdrA pointer to a PEB_LDR_DATA structure providing information about loaded modulesContains the base address of kernel32 and ntdll.
ProcessParametersA pointer to a RTL_USER_PROCESS_PARAMETERS structure providing information about process startup parametersThe RTL_USER_PROCESS_PARAMETERS structure is also mostly opaque and not guaranteed to be consistent across multiple versions of Windows.
PostProcessInitRoutineA pointer to a callback function called after DLL initialization but before the main executable code is invokedThis callback function is used on Windows 2000, but is not guaranteed to be used on later versions of Windows NT.
SessionIdThe session ID of the Terminal Services session that the process is part ofThe NtCreateUserProcess system call initializes this by calling the kernel's internal MmGetSessionId function.

The contents of the PEB are initialized by the NtCreateUserProcess system call, the Native API function that implements part of, and underpins, the Win32 CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW, and CreateProcessWithLogonW library functions that are in the kernel32.dll and advapi32.dll libraries as well as underpinning the fork function in the Windows NT POSIX library, posix.dll.
For Windows NT POSIX processes, the contents of a new process' PEB are initialized by NtCreateUserProcess as simply a direct copy of the parent process' PEB, in line with how the fork function operates. For Win32 processes, the initial contents of a new process' PEB are mainly taken from global variables maintained within the kernel. However, several fields may instead be taken from information provided within the process' image file, in particular information provided in the IMAGE_OPTIONAL_HEADER32 data structure within the PE file format.
Fieldis initialized fromoverridable by PE information?
NumberOfProcessorsKeNumberOfProcessors
NtGlobalFlagNtGlobalFlag
CriticalSectionTimeoutMmCriticalSectionTimeout
HeapSegmentReserveMmHeapSegmentReserve
HeapSegmentCommitMmHeapSegmentCommit
HeapDeCommitTotalFreeThresholdMmHeapDeCommitTotalFreeThreshold
HeapDeCommitFreeBlockThresholdMmHeapDeCommitFreeBlockThreshold
MinimumStackCommitMmMinimumStackCommitInBytes
ImageProcessAffinityMaskKeActiveProcessors
OSMajorVersionNtMajorVersion
OSMinorVersionNtMinorVersion
OSBuildNumberNtBuildNumber & 0x3FFF combined with CmNtCSDVersion
OSPlatformIdVER_PLATFORM_WIN32_NT

The WineHQ project provides a fuller PEB definition in its version of winternl.h. Later versions of Windows have adjusted the number and purpose of some fields.