In der Datenverarbeitung ist der Process Environment Block (abgekürzt PEB) ein Datenstruktur in der Windows NT-Betriebssystemfamilie. Es ist eine opake Datenstruktur die intern vom Betriebssystem verwendet wird und deren meiste Datenfelder auch für keine Verwendung von außen vorgesehen sind. Microsoft vermerkt in seiner MSDN-Bibliotheksdokumentation - in der auch nur einige der Felder beschrieben sind - dass die Struktur "in zukünftigen Windowsversionen geändert werden kann". Der PEB beinhaltet Datenstrukturen die auf den gesamten Prozess angewendet werden, einschließlich des globales Kontextes, Startparametern, Datenstrukturen für den Programmabbild-Lader, die Programmabbild-Basisadresse und Synchronisationsobjekte, die verwendet werden, um wechselseitigen Ausschluss für prozessweite Datenstrukturen zu ermöglichen.
Der PEB ist eng mit der Kernel-Modus-Datenstruktur EPROCESS
verbunden, sowie mit den pro-Prozess-Datenstrukturen, die innerhalb des Addressraumes des Client-Server Runtime Sub-System-Prozesses verwaltet werden. Jedoch ist der PEB (wie die CSRSS-Datenstrukturen auch) keine Datenstruktur im Kernel-Modus selbst. Er liegt im Benutzermodus-Adressraum des Prozesses auf den er sich bezieht. Das ist so, weil er entworfen wurde um vom Benutzer-Modus-Befehlen in den Betriebssystembibliotheken verwendet zu werden. wie NTDLL, die außerhalb des Kernel-Modus ausgeführt wird, wie die Befehle des Programmabbild-Laders und des Heap-Verwalters.
In WinDbg, dem Befehl, der die Inhalte eines PEB anzeigt, ist der !peb
-Befehl, which is passed the address of the PEB innerhalb eines Benutzer-Adressraumes eines Prozesses. Diese Information, wiederum, erhält der !process
-Befehl, der die Information aus der EPROCESS
-Datenstruktur anzeigt, von der ein Feld die Adresse des PEB enthält.
Feld | Bedeutung | notes |
---|---|---|
BeingDebugged
|
Whether the process is being debugged | Microsoft recommends not using this field but using the official Win32 CheckRemoteDebuggerPresent() library function instead.
|
Ldr | A pointer to a PEB_LDR_DATA structure providing information about loaded modules
|
Contains the base address of kernel32 and ntdll. |
ProcessParameters | A pointer to a RTL_USER_PROCESS_PARAMETERS structure providing information about process startup parameters
|
The RTL_USER_PROCESS_PARAMETERS structure is also mostly opaque and not guaranteed to be consistent across multiple versions of Windows.
|
PostProcessInitRoutine | A pointer to a callback function called after DLL initialization but before the main executable code is invoked | This callback function is used on Windows 2000, but is not guaranteed to be used on later versions of Windows NT. |
SessionId | The session ID of the Terminal Services session that the process is part of | The NtCreateUserProcess() system call initializes this by calling the kernel's internal MmGetSessionId() function.
|
Die Inhalte des PEB werden vom NtCreateUserProcess()
Systemaufruf intizialisiert, der Native API-Funktion 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 (PE+ or PE32+ in 64 bit executable images).
Field | is initialized from | overridable by PE information? |
---|---|---|
NumberOfProcessors
|
KeNumberOfProcessors |
Nein |
NtGlobalFlag
|
NtGlobalFlag |
Nein |
CriticalSectionTimeout
|
MmCriticalSectionTimeout |
Nein |
HeapSegmentReserve
|
MmHeapSegmentReserve |
Nein |
HeapSegmentCommit
|
MmHeapSegmentCommit |
Nein |
HeapDeCommitTotalFreeThreshold
|
MmHeapDeCommitTotalFreeThreshold |
Nein |
HeapDeCommitFreeBlockThreshold
|
MmHeapDeCommitFreeBlockThreshold |
Nein |
MinimumStackCommit
|
MmMinimumStackCommitInBytes |
Nein |
ImageProcessAffinityMask
|
KeActiveProcessors |
ImageLoadConfigDirectory.ProcessAffinityMask
| Ja
OSMajorVersion
|
NtMajorVersion |
OptionalHeader.Win32VersionValue & 0xFF
| Ja
OSMinorVersion
|
NtMinorVersion |
(OptionalHeader.Win32VersionValue >> 8) & 0xFF
| Ja
OSBuildNumber
|
NtBuildNumber & 0x3FFF combined with CmNtCSDVersion |
(OptionalHeader.Win32VersionValue >> 16) & 0x3FFF combined with ImageLoadConfigDirectory.CmNtCSDVersion
| Ja
OSPlatformId
|
VER_PLATFORM_WIN32_NT |
(OptionalHeader.Win32VersionValue >> 30) ^ 0x2
| Ja
Einzelnachweise
Bearbeiten[[Kategorie:Objektorientierte Programmierung]]