進程環境塊

進程環境塊 （ 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地址 。 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數據結構 。