进程环境块

进程环境块（PEB）是 Windows NT操作系统内部使用的数据结构，用以存储每个进程的运行时数据。  Microsoft的MSDN文档中仅公开了PEB的少数几个域，该结构“在未来的Windows版本中可能会修改”。PEB包含的数据结构适用于整个进程，如全局上下文，启动参数，程序image装载器的数据结构，程序image的基地址，进程级互斥同步访问对象等。

PEB与kernel mode EPROCESS数据结构密切相关。也是逐进程数据结构，在客户-服务器运行时子系统(CSRSS)进程地址空间被管理。但是，类似于CSRSS数据结构，PEB自身并不是内核模式数据结构。它驻留在所关联的进程的用户态内存空间中。这是因为它被设计为被操作系统的用户态的程序所使用，如NTDLL，在内核态之外执行，如程序映象的加载器与堆管理器。

WinDbg中，卸载PEB内容的命令是!peb，命令参数是PEB在进程地址空间的地址，它实际上是通过!process命令获取，将显示来自于EPROCESS数据结构的信息，其中一个域是PEB地址。

+ Microsoft文档公布的PEB的域 域  含义  注释 BeingDebugged  进程是否被调试  Microsoft建议不要使用这个域，而是用Win32 CheckRemoteDebuggerPresent()库函数代替 Ldr  到PEB_LDR_DATA结构的指针，提供被加载模块的信息。   包含kernel32 与ntdll的基地址 ProcessParameters  到RTL_USER_PROCESS_PARAMETERS结构的指针，提供进程起始参数信息。   这个RTL_USER_PROCESS_PARAMETERS结构几乎不透明，不保证在不同Windows版本一致 PostProcessInitRoutine  为一个回调函数指针，在DLL被初始化后但DLLMain执行之前被调用 executable code is invoked  该回调函数被用于Windows 2000, 不保证以后Windows版本一致 SessionId  进程所在的Terminal Services任务的ID  系统调用NtCreateUserProcess()通过调用内核内部的MmGetSession Id()函数来初始化它.

PEB的内容通过系统调用NtCreateUserProcess()初始化。该系统调用也是Native API的Win32函数 CreateProcess(), CreateProcessAsUser(), CreateProcessWithTokenW(), CreateProcessWithLogonW() （在kernel32.dll 与advapi32.dll中）的实现基础，也是Windows NT POSIX的posix.dll中的API函数Fork()的实现基础.

对于Windows NT POSIX进程，新进程的PEB内容通过简单直接复制父进程的PEB来初始化。NtCreateUserProcess() 这是在fork()函数内部实现。对于Win32进程，新进程的PEB的初始化主要来自内核维护的全局变量。但几个域的初始化来自程序映象，特别是来自PE文件格式(PE+ 或 PE32+在64位)的IMAGE_OPTIONAL_HEADER32数据结构。

+ 内核全局变量初始化的PEB的域 域  初始化自...  是否被PE信息覆盖? NumberOfProcessors  KeNumberOfProcessors   NtGlobalFlag  NtGlobalFlag   CriticalSectionTimeout  MmCriticalSectionTimeout   HeapSegmentReserve  MmHeapSegmentReserve   HeapSegmentCommit  MmHeapSegmentCommit   HeapDeCommitTotalFreeThreshold  MmHeapDeCommitTotalFreeThreshold   HeapDeCommitFreeBlockThreshold  MmHeapDeCommitFreeBlockThreshold   MinimumStackCommit  MmMinimumStackCommitInBytes   ImageProcessAffinityMask  KeActiveProcessors   OSMajorVersion  NtMajorVersion   OSMinorVersion  NtMinorVersion   OSBuildNumber  NtBuildNumber & 0x3FFF combined with CmNtCSDVersion   OSPlatformId  VER_PLATFORM_WIN32_NT  

 参考文献 


Category:Windows_NT体系结构