Win32中的TIB访问

时间:2012-04-01 12:05:38

标签: c++ c windows winapi

深入研究与TIB一起使用的Win32 API函数的实现,例如:

  • TLS访问功能:TlsAllocTlsFreeTlsSetValueTlsGetValue
  • GetLastErrorSetLastError
  • 消息传递子系统:GetMessagePeekMessage

通过阅读fs:[0x18]选择器的内容,他们发现所有人都访问了TIB(有时称为TEB)。

OTOH这是不必要的,因为fs注册直接指向它。根据{{​​3}}以及我在实践中看到的,fs寄存器将地址保存到TIB结构的开头,而在偏移量0x18处,它具有指向自身的指针。

然而间接访问TIB的原因是什么?

1 个答案:

答案 0 :(得分:3)

使用FS的任何指令都需要覆盖,这会向指令添加一个字节(通常需要汇编语言才能使用它)。相反,FS:18处的指针(至少如果内存正确地服务)基于DS,因此可以在没有覆盖的情况下使用,在使用时保存一个字节,并且(对于许多人来说最重要)可以直接从更高级别的语言(如C或C ++)使用,而不需要汇编语言。