コンピューティングにおいて、プロセス環境ブロック(略称PEB ) は、 Windows NTオペレーティングシステムファミリーのデータ構造です。これは、オペレーティングシステムが内部的に使用する不透明なデータ構造であり、そのフィールドのほとんどは、オペレーティングシステム以外による使用を想定していません。[ 1 ] Microsoft は、MSDN ライブラリのドキュメント (一部のフィールドのみを文書化) の中で、この構造は「将来のバージョンの Windows で変更される可能性がある」と述べています。[ 2 ] PEB には、グローバル コンテキスト、起動パラメーター、プログラム イメージ ローダーのデータ構造、プログラム イメージ ベース アドレス、およびプロセス全体のデータ構造の相互排他を提供するために使用される同期オブジェクトなど、プロセス全体に適用されるデータ構造が含まれています。[ 1 ]
PEB は、カーネル モードのEPROCESSデータ構造、およびクライアント/サーバ ランタイム サブシステムプロセスのアドレス空間内で管理されるプロセスごとのデータ構造と密接に関連しています。ただし、(CSRSS データ構造と同様に)PEB 自体はカーネル モードのデータ構造ではありません。PEB は、関連するプロセスのアプリケーション モード アドレス空間に存在します。これは、プログラム イメージ ローダーやヒープマネージャのコードなど、カーネル モード外で実行されるNTDLLなどのオペレーティングシステム ライブラリのアプリケーション モード コードで使用されるように設計されているためです。 [ 3 ]
WinDbgでは、PEB の内容をダンプするコマンドは!peb、プロセスのアプリケーション アドレス空間内の PEB のアドレスが渡されるコマンドです。その情報は、データ構造!processから情報を表示するコマンドによって取得されEPROCESS、そのデータ構造のフィールドの 1 つは PEB のアドレスです。[ 3 ]
PEB の内容は、システム コールによって初期化されます。このネイティブ API関数は、 kernel32.dll および advapi32.dll ライブラリにあるWin32 、、、およびライブラリ関数の一部を実装し、それらを支えるとともに、Windows NT POSIXライブラリ posix.dllの関数も支えています。[ 3 ]NtCreateUserProcess()CreateProcess()CreateProcessAsUser()CreateProcessWithTokenW()CreateProcessWithLogonW()fork()
Windows NT POSIX プロセスの場合、新しいプロセスの PEB の内容は、関数の動作方法に従って、親プロセスの PEB の直接コピーとして初期化されます。Win32 プロセスの場合、新しいプロセスの PEB の初期内容は、主にカーネル内で維持されるグローバル変数から取得されます。ただし、いくつかのフィールドは、プロセスイメージ ファイル内で提供される情報、特にPEファイル形式 (64 ビット実行可能イメージの PE+ または PE32+)内のデータ構造で提供される情報から取得される場合があります。[ 3 ]NtCreateUserProcess()fork()IMAGE_OPTIONAL_HEADER32
WineHQプロジェクトは、 winternl.hのバージョンでより完全なPEB定義を提供しています。[ 5 ] Windowsの後のバージョンでは、一部のフィールドの数と目的が調整されています。[ 6 ]
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク)