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

  • TLS访问功能:TlsAllocTlsFreeTlsSetValueTlsGetValue
  • GetLastErrorSetLastError
  • 消息子系统:GetMessagePeekMessage等。

  • 人们发现他们所有人都通过读取fs:[0x18]选择器的内容来访问TIB(有时称为TEB)。
    OTOH这是不必要的,因为fs寄存器直接指向它。根据this article和我在实践中看到的内容,fs寄存器将地址保存到TIB结构的开头,而在偏移量0x18处具有指向自身的指针。
    但是,间接访问TIB的原因可能是什么?

    最佳答案

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

    关于c - Win32中的TIB访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9964236/

    10-09 08:42