관리 메뉴

kisoo

ETHREAD 란 무엇인가? 본문

01.About Programming /2.Kernel Lab

ETHREAD 란 무엇인가?

JamesK78 2009. 2. 4. 10:08

윈도우의 스레드는 실행 스레드(EThread-executive thread )에 정의된다. ETHREAD 블록과 여기에서 가리키는 구조체들은 시스템 주소 공간에 위치한다. 예외로 스레드 환경블록(thread environment block (TEB) 만은 프로세스 주소 공간에 위치한다.

lkd> dt nt!_ethread

nt!_ETHREAD

   +0x000Tcb              : _KTHREAD

   +0x1c0CreateTime       : _LARGE_INTEGER

   +0x1c0NestedFaultCount : Pos 0, 2 Bits

   +0x1c0ApcNeeded        : Pos 2, 1 Bit

   +0x1c8ExitTime         : _LARGE_INTEGER

   +0x1c8LpcReplyChain    : _LIST_ENTRY

   +0x1c8KeyedWaitChain   : _LIST_ENTRY

   +0x1d0ExitStatus       : Int4B

   +0x1d0OfsChain         : Ptr32Void

   +0x1d4PostBlockList    : _LIST_ENTRY

   +0x1dcTerminationPort  : Ptr32_TERMINATION_PORT

   +0x1dcReaperLink       : Ptr32_ETHREAD

   +0x1dcKeyedWaitValue   : Ptr32Void

   +0x1e0ActiveTimerListLock : Uint4B

   +0x1e4ActiveTimerListHead : _LIST_ENTRY

   +0x1ecCid              : _CLIENT_ID

   +0x1f4LpcReplySemaphore : _KSEMAPHORE

   +0x1f4KeyedWaitSemaphore : _KSEMAPHORE

   +0x208LpcReplyMessage  : Ptr32Void

   +0x208LpcWaitingOnPort : Ptr32Void

   +0x20cImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION

   +0x210IrpList          : _LIST_ENTRY

   +0x218TopLevelIrp      : Uint4B

   +0x21cDeviceToVerify   : Ptr32_DEVICE_OBJECT

   +0x220ThreadsProcess   : Ptr32_EPROCESS

   +0x224StartAddress     : Ptr32Void

   +0x228Win32StartAddress : Ptr32Void

   +0x228LpcReceivedMessageId : Uint4B

   +0x22cThreadListEntry  : _LIST_ENTRY

   +0x234RundownProtect   : _EX_RUNDOWN_REF

   +0x238ThreadLock       : _EX_PUSH_LOCK

   +0x23cLpcReplyMessageId : Uint4B

   +0x240ReadClusterSize  : Uint4B

   +0x244GrantedAccess    : Uint4B

   +0x248CrossThreadFlags : Uint4B

   +0x248Terminated       : Pos 0, 1 Bit

   +0x248DeadThread       : Pos 1, 1 Bit

   +0x248HideFromDebugger : Pos 2, 1 Bit

   +0x248ActiveImpersonationInfo : Pos 3, 1 Bit

   +0x248SystemThread     : Pos 4, 1 Bit

   +0x248HardErrorsAreDisabled : Pos 5, 1 Bit

   +0x248BreakOnTermination : Pos 6, 1 Bit

   +0x248SkipCreationMsg    : Pos 7, 1 Bit

   +0x248SkipTerminationMsg : Pos 8, 1 Bit

   +0x24cSameThreadPassiveFlags : Uint4B

   +0x24cActiveExWorker   : Pos 0, 1 Bit

   +0x24cExWorkerCanWaitUser : Pos 1, 1 Bit

   +0x24cMemoryMaker      : Pos 2, 1 Bit

   +0x250SameThreadApcFlags : Uint4B

   +0x250LpcReceivedMsgIdValid : Pos 0, 1 Bit

   +0x250LpcExitThreadCalled : Pos 1, 1 Bit

   +0x250AddressSpaceOwner : Pos 2, 1 Bit

   +0x254ForwardClusterOnly : UChar

   +0x255DisablePageFaultClustering : UChar

 

KTHREAD 블록에는 스레드를 대신하여 커널이 스레드의 스케줄링과 동기화 할 때 필요한 정보들이 들어 있다.

 

lkd>  dt  nt!_kthread

nt!_KTHREAD

   +0x000Header          : _DISPATCHER_HEADER

   +0x010MutantListHead  : _LIST_ENTRY

   +0x018InitialStack    : Ptr32Void

   +0x01cStackLimit      : Ptr32Void

   +0x020Teb             : Ptr32Void

   +0x024TlsArray        : Ptr32Void

   +0x028KernelStack     : Ptr32Void

   +0x02cDebugActive     : UChar

   +0x02dState           : UChar

   +0x02eAlerted         : [2] UChar

   +0x030Iopl            : UChar

   +0x031NpxState        : UChar

   +0x032Saturation      : Char

   +0x033Priority        : Char

   +0x034ApcState        : _KAPC_STATE

   +0x04cContextSwitches : Uint4B

   +0x050IdleSwapBlock   : UChar

   +0x051Spare0          : [3] UChar

   +0x054WaitStatus      : Int4B


 

위 필드중 프로세스 주소 공간(시스템 주소 공간(커널 메모리)이 아닌)에 위치하는 구조체는 TEB이다. TEB는 이미지 로더와 다양한 Windows DLL들에 대한 컨택스트 정보를 담고 있다. 이들 요소들이 사용자 모드에서 동작하기 때문에, 사용자 모드에서 쓰기가 가능한 구조체가 필요하다. 그래서 이 구조체는 커널모드에서만 쓰기가 가능한 시스템 메모리 주소 공간이 아닌, 프로세스 주소 공간에 위치하는 것이다.

 

kd> !teb

TEB at 7ffde000

    ExceptionList:         0006b540

    StackBase:             00070000

    StackLimit:            00065000

    SubSystemTib:          00000000

    FiberData:             00001e00

    ArbitraryUserPointer:  00000000

    Self:                  7ffde000

    EnvironmentPointer:    00000000

    ClientId:              00000254 . 000007ac

    RpcHandle:             00000000

    Tls Storage:           00000000

    PEB Address:           7ffdf000

    LastErrorValue:        2

    LastStatusValue:       c0000034

    CountOwnedLocks:       0     HardErrorMode:      0

Comments