{{위키데이터 속성 추적}}
'''프로세스 환경 블록''' ('''PEB''': {{lang|en|Process Environment Block}})은 [[윈도우 NT]]에서의 데이터 구조체이다. 이것은 운영체제 내부에서 사용하는 [[opaque data structure]]이다.<ref name="Nagar1997"/> 마이크로소프트는 [[마이크로소프트 개발자 네트워크]](MSDN) 라이브러리 문서에서(오직 몇 개의 필드만 문서화한) 아마 다음 버전의 구조체에서는 바뀌게 될 것이라고 언급했다.<ref name="MSDN1"/> PEB는 전역 문맥, 시작 파라미터, 프로그램 이미지 로더를 위한 데이터 구조체, 프로그램 이미지 베이스 주소 그리고 동기화 객체들을 포함하는, 프로세스 전체에 적용되는 데이터 구조체를 담고 있다.<ref name="Nagar1997"/>

PEB [[보호 링|커널 모드]] <syntaxhighlight lang="cpp" inline>EPROCESS</syntaxhighlight> 데이터 구조체 뿐만 아니라 [[클라이언트/서버 런타임 하위 시스템]]의 주소 공간에서 관리되는 프로세스 당 데이터 구조체와 밀접하게 관련되어 있다. 그러나 PEB는 자체적으로는 (CSRSS 데이터 구조체처럼) 커널 모드 데이터 구조체가 아니다. 이것은 관련된 프로세스의 사용자 모드 주소 공간에 위치한다. 왜냐하면 NTDLL 같은 운영체제 라이브러리의 사용자 모드 코드에서 사용되기 위해 디자인되었기 때문이다.<ref name="Internals5"/>

WinDbg에서, PEB의 내용을 복사해 오는 명령어는<code>!peb</code> 이다. 결국, 이 정보는 <syntaxhighlight lang="cpp" inline>EPROCESS</syntaxhighlight> 데이터 구조체(필드 중 하나가 PEB의 주소이다.)의 정보를 보여주는 !process 명령어에 의해서 얻어진다.<ref name="Internals5"/>
{| class="wikitable sortable"
|+ 마이크로소프트에 의해 문서화된 PEB의 필드들<ref name="MSDN1"/>

! 필드
! 의미
! 메모
|-
| <code>BeingDebugged</code>
| 프로세스가 디버깅 당하는 중인지
| 마이크로소프트는 이 필드 대신 공식적인 Win32를 사용할 것을 권장한다. <syntaxhighlight lang="cpp" inline>CheckRemoteDebuggerPresent()</syntaxhighlight><ref name="MSDN1"/>
|-
| Ldr
| 로드된 모듈에 대한 정보를 제공하는 <syntaxhighlight lang="cpp" inline>PEB_LDR_DATA</syntaxhighlight> 구조체를 가리키는 포인터
| [[윈도우 라이브러리 파일|kernel32]]와 [[네이티브 API|ntdll]]의 베이스 주소가 들어 있다.
|-
| ProcessParameters
| 로드된 모듈에 대한 정보를 제공하는 <syntaxhighlight lang="cpp" inline>RTL_USER_PROCESS_PARAMETERS</syntaxhighlight> 구조체를 가리키는 포인터
| <syntaxhighlight lang="cpp" inline>RTL_USER_PROCESS_PARAMETERS</syntaxhighlight> 구조체는 또한 대부분이 문서화되어 있지 않으며, 여러 버전에서 사용할 수 있다는 보장이 없다.<ref name="MSDN3"/>
|-
| PostProcessInitRoutine
| DLL 초기화 이후, 메인 실행 코드가 발동되기 이전에 호출되는 콜백 함수에 대한 포인터
| 이 콜백 함수는 [[윈도우 2000]]에서 사용되지만, 윈도우 NT 이후 버전에서 사용될 수 있다는 보장은 없다.<ref name="MSDN1"/>
|-
| SessionId
| 프로세스를 부분으로 갖는 터미널 서비스 세션의 세션 ID
| <syntaxhighlight lang="cpp" inline>NtCreateUserProcess()</syntaxhighlight> 시스템 호출은 커널 내부의 <syntaxhighlight lang="cpp" inline>MmGetSessionId()</syntaxhighlight> 함수를 호출함으로써 초기화한다.<ref name="Internals5"/>
|}
PEB의 내용은 <syntaxhighlight lang="cpp" inline>NtCreateUserProcess()</syntaxhighlight> 시스템 호출에 의해 초기화 된다. 이 [[네이티브 API|네이티브 API]] 함수는 [[윈도우 라이브러리 파일]]의 <syntaxhighlight lang="cpp" inline>CreateProcess()</syntaxhighlight>, <syntaxhighlight lang="cpp" inline>CreateProcessAsUser()</syntaxhighlight>, <syntaxhighlight lang="cpp" inline>CreateProcessWithTokenW()</syntaxhighlight>, 그리고 <syntaxhighlight lang="cpp" inline>CreateProcessWithLogonW()</syntaxhighlight> 라이브러리 함수들과, [[Windows NT POSIX]] 라이브러리의 <code>[[포크 (시스템 호출)|fork()]]</code> 함수를 구현한다.<ref name="Internals5"/>

윈도우 NT POSIX 프로세스들에서, 새로운 프로세스의 PEB의 내용은 <syntaxhighlight lang="cpp" inline>NtCreateUserProcess()</syntaxhighlight>에 의해 초기화된다. Win32 프로세스들에서는, 새로운 프로세스의 PEB의 내용에 대한 초기화는 주로 커널 내부에서 유지되는 전역 변수들에 의하여 옮겨진다. 그러나 몇몇 필드들은 대신 프로세스의 이미지 파일 내부에 의해서 정보가 제공된다. 특히 PE 파일 포맷의 <syntaxhighlight lang="cpp" inline>IMAGE_OPTIONAL_HEADER32</syntaxhighlight> 데이터 구조체가 그 역할을 한다.<ref name="Internals5"/>
{| class="wikitable sortable"
|+ 커널 전역 변수들에서 초기화되는 PEB의 필드들<ref name="Internals5"/>

! 필드
! 커널 전역 변수
! overridable by PE information?
|-
| <code>NumberOfProcessors</code> || <code>KeNumberOfProcessors</code> || {{no}}
|-
| <code>NtGlobalFlag</code> || <code>NtGlobalFlag</code> || {{no}}
|-
| <code>CriticalSectionTimeout</code> || <code>MmCriticalSectionTimeout</code> || {{no}}
|-
| <code>HeapSegmentReserve</code> || <code>MmHeapSegmentReserve</code> || {{no}}
|-
| <code>HeapSegmentCommit</code> || <code>MmHeapSegmentCommit</code> || {{no}}
|-
| <code>HeapDeCommitTotalFreeThreshold</code> || <code>MmHeapDeCommitTotalFreeThreshold</code> || {{no}}
|-
| <code>HeapDeCommitFreeBlockThreshold</code> || <code>MmHeapDeCommitFreeBlockThreshold</code> || {{no}}
|-
| <code>MinimumStackCommit</code> || <code>MmMinimumStackCommitInBytes</code> || {{no}}
|-
| <code>ImageProcessAffinityMask</code> || <code>KeActiveProcessors</code> || {{Yes|<syntaxhighlight lang=cpp inline>ImageLoadConfigDirectory.ProcessAffinityMask</syntaxhighlight>}}
|-
| <code>OSMajorVersion</code> || <code>NtMajorVersion</code> || {{Yes|<syntaxhighlight lang=cpp inline>OptionalHeader.Win32VersionValue & 0xFF</syntaxhighlight>}}
|-
| <code>OSMinorVersion</code> || <code>NtMinorVersion</code> || {{Yes|<syntaxhighlight lang=cpp inline>(OptionalHeader.Win32VersionValue >> 8) & 0xFF</syntaxhighlight>}}
|-
| <code>OSBuildNumber</code> || <syntaxhighlight lang=cpp inline>NtBuildNumber & 0x3FFF</syntaxhighlight> combined with <code>CmNtCSDVersion</code> || {{Yes|<syntaxhighlight lang=cpp inline>(OptionalHeader.Win32VersionValue >> 16) & 0x3FFF</syntaxhighlight>  combined with <syntaxhighlight lang=cpp inline>ImageLoadConfigDirectory.CmNtCSDVersion</syntaxhighlight>}}
|-
| <code>OSPlatformId</code> || <syntaxhighlight lang=cpp inline>VER_PLATFORM_WIN32_NT</syntaxhighlight> || {{Yes|<syntaxhighlight lang=cpp inline>(OptionalHeader.Win32VersionValue >> 30) ^ 0x2</syntaxhighlight>}}
|}

== 각주 ==
{{각주|refs=
<ref name="Nagar1997">{{서적 인용
 |title = Windows NT file system internals: a developer's guide
 |series = O'Reilly Series
 |author = Rajeev Nagar
 |publisher = O'Reilly
 |year = 1997
 |isbn = 9781565922495
 |pages = 129
}}</ref>
<ref name="MSDN1">{{웹 인용
 |work = [[마이크로소프트 개발자 네트워크]]
 |publisher = [[마이크로소프트]]
 |title = Process and Thread structures: PEB Structure
 |url = http://msdn.microsoft.com/library/aa813706(VS.85).aspx
 |date = 2010-07-15
 |accessdate = 2010-07-15
 |보존url = https://web.archive.org/web/20121022182726/http://msdn.microsoft.com/library/aa813706(VS.85).aspx
 |보존날짜 = 2012-10-22
 |url-status = dead
 }}</ref>
<ref name="MSDN3">{{웹 인용
 |work = [[마이크로소프트 개발자 네트워크]]
 |publisher = [[마이크로소프트]]
 |title = Process and Thread structures: RTL_USER_PROCESS_PARAMETERS Structure
 |url = http://msdn.microsoft.com/library/aa813741(VS.85).aspx
 |date = 2010-07-15
 |accessdate = 2010-07-15
}}</ref>
<ref name="Internals5">{{서적 인용
 |title = 윈도우 인터널스
 |series = 마이크로소프트 프레스 시리즈
 |author = Mark E. Russinovich, David A. Solomon, 그리고 Alex Ionescu
 |edition = 5th
 |publisher = 마이크로소프트 프레스
 |year = 2009
 |isbn = 9780735625303
 |pages = 335–336,341–342,348,357–358
}}</ref>
}}

[[분류:자료 구조]]
[[분류:자료형]]
[[분류:객체 지향 프로그래밍]]