2

次のような、TIB で動作する Win32 API 関数の実装を掘り下げます。

  • TLS アクセス機能: TlsAllocTlsFreeTlsSetValueTlsGetValue
  • GetLastErrorSetLastError
  • メッセージング サブシステム:GetMessageなどPeekMessage

fs:[0x18]セレクターの内容を読み取ることによって、それらすべてが TIB (TEB と呼ばれることもあります) にアクセスすることがわかります。

OTOH fsregisterが直接指しているので、これは不要です。この記事と私が実際に見たものによると、registerfsは TIB 構造の先頭へのアドレスを保持しますが、オフセット 0x18 にはそれ自体へのポインターがあります。

それにもかかわらず、TIB に間接的にアクセスする理由は何でしょうか?

4

1 に答える 1

3

使用する命令FSにはオーバーライドが必要です。これにより、命令にバイトが追加されます (通常、それを使用するにはアセンブリ言語が必要です)。ポインター atFS:18は (少なくともメモリが正しく機能する場合)DS代わりに基づいているため、オーバーライドなしで使用でき、使用時にバイトを節約できます。また (最も重要なのは多くの人にとって) などの高水準言語から直接使用できます。アセンブリ言語を必要とする代わりに、C または C++ として。

于 2012-04-01T12:18:48.410 に答える