상위 질문
타임라인
채팅
관점

Win32 스레드 정보 블록

위키백과, 무료 백과사전

Remove ads

TIB (Win32 Thread Information Block) (TIB)은 Win32의 자료 구조로서 현재 실행 중인 스레드에 대한 정보를 저장하고 있다. 이 구조체는 또한 스레드 환경 블록 (TEB: Thread Environment Block)으로도 알려져 있다.[1]

이 TIB는 공식적으로 윈도 9x에서는 문서화되어 있지 않다. 윈도 NT 시리즈 DDK는 하위 시스템 독립적인 부분을 문서화한 winnt.h에 NT_TIB 구조체를 포함한다. 와인은 확장된 (구체적인 하위 시스템 부분의) TIB를 위한 선언을 포함한다. 수 많은 Win32 프로그램들은 실질적으로 API의 한 부분이라고 할 수 있는 이 문서화되지 않은 필드들을 사용한다. 특히 첫 번째 필드는 마이크로소프트의 자체 컴파일러에서 직접적으로 코드에 의한 참조가 일어난다.[1]

TIB는 Win32 API를 호출하지 않고도 프로세스에 대한 많은 정보를 얻기 위해 사용될 수 있다. PEB를 가리키는 포인터를 통해서 IAT에 대한 접근, 프로세스 시작 인수, 이미지 이름 등을 얻을 수 있다.

Remove ads

TIB의 내용 (32비트 윈도우)

요약
관점
자세한 정보 위치, 길이 ...

FS는 TIB를 저장하는데, TDB(스레드 데이터 베이스)라고 알려진 데이터 블록에 내장되어 있다. TIB는 스레드에 관련된 예외 핸들링 체인과 TLS(thread local storage)에 대한 포인터를 포함한다.

노트: 위의 설명은 오직 x86 32비트 윈도우에서 설명하는 것이다. x86-64 (64-bit) 윈도우에서, GS (FS가 아니라)는 TIB를 가리키는 세그먼트 레지스터로 사용된다. 게다가 위 구조체의 몇몇 변수 슬롯들은 다른 크기를 가진다.

Remove ads

TIB에 접근하기

현재 스레드의 TIB는 세그먼트 레지스터 FS (x86) 또는 GS (x64)의 오프셋으로 접근할 수 있다.

FS:[0]부터 오프셋으로 TIB 필드에 접근하는 것 대신 FS:[0x18]에 저장된 먼저 선형 자기 참조 포인터를 가지는 것이 TIB 필드에 접근하는 보편적인 방식이다. 이 포인터는 포인터 연산 등에 사용될 수 있다.

32-bit x86에서의 C inlined-assembly 예시:

// gcc (AT&T-style inline assembly).
void *getTIB() {
    void *pTIB;
    __asm__("movl %%fs:0x18, %0" : "=r" (pTIB) : : );
    return pTIB;
}
// Microsoft C
void *getTIB() {
    void *pTIB;
    __asm {
        mov EAX, FS:[0x18]
        mov pTIB, EAX
    }
    return pTIB;
}
// Using Microsoft's intrinsics instead of inline assembly
void *getTIB() {
    return = (void *)__readfsdword(0x18);
}
Remove ads

같이 보기

각주

관련 문헌

외부 링크

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads