线程信息块

Win32线程信息块（TIB）是32位Windows操作系统的线程使用的数据结构，存储了每个线程的运行时信息。 也称作“线程环境块”（Thread Environment Block，TEB）。

Windows NT系列的DDK在winnt.h中包括了一个struct NT_TIB，为独立于subsystem的部分。Wine包含了TIB与subsystem相关的扩展部分。由于非常多程序使用了TIB，事实上TIB成为Windows API的一部分。

TIB可用于获取很多进程相关信息，而不必调用Win32 API。例如，模拟GetLastError()或GetVersion()。通过PEB可以获取访问导入表（import table， IAT）、进程启动参数、程序名字等。

32位程序通过FS段寄存器，64位程序通过GS段寄存器可以获得TIB

TIB的内容

 字节/
类型偏移
(32 比特, FS)偏移
(64 比特, GS) Windows 版本               描述pointerFS:[0x00]GS:[0x00]Win9x and NT当前结构化异常 (SEH) 帧pointerFS:[0x04]GS:[0x08]Win9x and NT栈基 / 栈底部 (高地址)pointerFS:[0x08]GS:[0x10]Win9x and NT栈上限 / 栈的天顶 (低地址)pointerFS:[0x0C]GS:[0x18]NTSubSystemTibpointerFS:[0x10]GS:[0x20]NT纤程数据pointerFS:[0x14]GS:[0x28]Win9x and NT任意数据slotpointerFS:[0x18]GS:[0x30]Win9x and NTTEB的线性地址 ---- 以上为独立于NT subsystem的部分 ----pointerFS:[0x1C]GS:[0x38]NT环境指针pointerFS:[0x20]GS:[0x40]NT进程ID (某些Windows版本这里也用作 'DebugContext')4FS:[0x24]GS:[0x48]NT当前线程ID4FS:[0x28]GS:[0x54]NT活动的RPC句柄4FS:[0x2C]GS:[0x58]Win9x and NT 线程局部存储数组的线性地址 4FS:[0x30]GS:[0x60]NT PEB的线性地址 4FS:[0x34]GS:[0x68]NT最后一个错误号4FS:[0x38]NT拥有的临界区数量4FS:[0x3C]NT CSR客户线程地址4FS:[0x40]NTWin32线程信息124FS:[0x44]NT, WineWin32客户信息(NT), user32私有数据(Wine), 0x60 = LastError (Win95), 0x74 = LastError (WinME)4FS:[0xC0]NT保留给Wow64.到FastSysCall的指针 4FS:[0xC4]NT当前Locale4FS:[0xC8]NTFP软件状态寄存器216FS:[0xCC]NT, Wine保留给OS (NT), kernel32私有数据(Wine)因此: FS:[0x124] 4 NT 到 KTHREAD (ETHREAD)结构的指针4FS:[0x1A4]NT异常码18FS:[0x1A8]NT活动上下文栈24FS:[0x1BC]NT, Wine空闲字节(NT), ntdll私有数据(Wine)40FS:[0x1D4]NT, Wine保留给OS (NT), ntdll私有数据(Wine)1248FS:[0x1FC]NT, WineGDI TEB Batch (OS), vm86私有数据(Wine)4FS:[0x6DC]NTGDI Region4FS:[0x6E0]NTGDI Pen4FS:[0x6E4]NTGDI Brush4FS:[0x6E8]NT真实进程ID4FS:[0x6EC]NT真实线程ID4FS:[0x6F0]NTGDI缓存的进程句柄4FS:[0x6F4]NTGDI客户进程ID (PID)4FS:[0x6F8]NTGDI客户线程ID (TID)4FS:[0x6FC]NTGDI线程locale信息20FS:[0x700]NT保留给用户应用程序1248FS:[0x714]NT保留给GL4FS:[0xBF4]GS:[0x1250]NT最后状态值532FS:[0xBF8]GS:[0x1258]NT静态UNICODE_STRING缓冲区pointerFS:[0xE0C]GS:[0x1478]NT分配格栈的内存地址 pointer[]FS:[0xE10]GS:[0x1480]NTTLS槽, 4/8字节每槽，64个槽 8FS:[0xF10]GS:[0x1680]NTTLS链接(LIST_ENTRY结构)4FS:[0xF18]NTVDM4FS:[0xF1C]NT保留给RPC4FS:[0xF28]NT线程错误模式(RtlSetThreadErrorMode)

访问TIB


// gcc (AT&T-style inline assembly).
void *getTIB() {
    void *pTIB;
    __asm__("movl %%fs:0x18, %0" : "=r" (pTIB) : : );
    return pTIB;
}

// Microsoft C
__declspec(naked)
void *getTIB() {
    __asm mov EAX, FS:[18h]
}

// Using Microsoft's intrinsics instead of inline assembly (works for both X86 and X64 architectures)
void *getTIB() {
#ifdef _M_IX86
    return (void *)__readfsdword(0x18);
#elif _M_AMD64
    return (void *)__readgsqword(0x30);
#endif
}

参见
 结构化异常

参考文献

进一步阅读


外部链接
 TEB layout on NTinternals.net 
 Structured Exception Handling and the TIB 
 Description of the first slots of the TIB 
 Description of TEB, field by field 

Category:微軟API
Category:執行緒