* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다.
프로세스
프로세스의 특징 위에서 자원 소유의 단위라고 말씀 드렸습니다만, 더 정확히 말해서 Thread가 실행 하기 위해 필요한 모음이라는 표현이 어울립니다. Thread의 동작을 위해서 필요한 메모리 공간이나 리소스를 조작하기 위한 핸들 등은 모두 프로세스를 통해 표현이 됩니다.
프로세스는 EPROCESS 구조체를 통해 표현 할 수 있습니다.
아래 그림과 같이 EPROCESS 구조체에는 해당 프로세스의 id 와 현재 실행 되고 있는 다른 EPROCESS 들과의 연결 그리고 주 보안 토큰 및 핸들 테이블에 대한 포인터 등등의 정보를 가지고 있습니다. 실제로 이 EPROCESS의 정보를 보는 것으로 대충의 프로세스의 구조에 대한 이해가 가능합니다.
EPROCESS 구조체를 통해 프로세스를 이루고 있는 메모리 공간이라든지 (Dirbase 및 VADs), 엑세스 토큰, 각종 객체를 조작하기 위한 핸들 테이블과 함께 디스패칭 및 스케줄링과 관련된 정보 및 커널에서 동작하는 쓰래드와 관련된 정보들이 저장된 KPROCESS 블록(PCB)과 로딩될 파일 정보 및 메모리 힙 정보 등을 저장하고 있는 프로세스 환경 블록 (PEB) 을 확인 할 수 있습니다. (읽어 주셨으면 하는 부분은 좀 강조를 해봤습니다.)
실제 Windbg에서 EPROCESS 의 구조를 확인 할 수 있습니다.
kd> dt _eprocess
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x078 ProcessLock : _EX_PUSH_LOCK
+0x080 CreateTime : _LARGE_INTEGER
+0x088 ExitTime : _LARGE_INTEGER
+0x090 RundownProtect : _EX_RUNDOWN_REF
….