深入研究与TIB一起使用的Win32 API函数的实现,例如:
TlsAlloc
,TlsFree
,TlsSetValue
,TlsGetValue
GetLastError
,SetLastError
GetMessage
,PeekMessage
等通过阅读fs:[0x18]
选择器的内容,他们发现所有人都访问了TIB(有时称为TEB)。
OTOH这是不必要的,因为fs
注册直接指向它。根据{{3}}以及我在实践中看到的,fs
寄存器将地址保存到TIB结构的开头,而在偏移量0x18处,它具有指向自身的指针。
然而间接访问TIB的原因是什么?
答案 0 :(得分:3)
使用FS
的任何指令都需要覆盖,这会向指令添加一个字节(通常需要汇编语言才能使用它)。相反,FS:18
处的指针(至少如果内存正确地服务)基于DS
,因此可以在没有覆盖的情况下使用,在使用时保存一个字节,并且(对于许多人来说最重要)可以直接从更高级别的语言(如C或C ++)使用,而不需要汇编语言。