2

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

  • TLS 访问函数:TlsAlloc, TlsFree, TlsSetValue,TlsGetValue
  • GetLastError,SetLastError
  • 消息传递子系统:GetMessagePeekMessage

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

OTOH 这是不必要的,因为fsregister直接指向它。根据这篇文章和我在实践中看到的,fs寄存器保存指向 TIB 结构开头的地址,而在偏移量 0x18 处,它有指向自身的指针。

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

4

1 回答 1

3

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

于 2012-04-01T12:18:48.410 回答