Windows と Linux では、与えられたスレッド ハンドルに対応する静的スレッド ローカル ストレージ ブロックの開始と終了をどのように判断できますか?
3 に答える
この情報は、スレッド情報ブロックにあります。ただし、これは文書化されていない構造にアクセスしているため、移植性が非常に低く、 Windows の将来のバージョンで機能しなくなる可能性があることに注意してください。現在のスレッドのスレッド ローカル ストレージ アリーナを TIB から取得できるようです。誰が別のスレッドの TLS を取得するのかわかりません。
TIB のオフセット 0x30 にあるプロセス環境ブロック (PEB) を掘り下げてみることもできますが、変更される可能性がある文書化されていない構造を扱っています。
Windows スレッド情報ブロックは、FS:0x2C でスレッド ローカル ストレージ配列のアドレスを提供します。これは、各モジュールの TLS へのポインターの配列です。問題は、その配列の大きさや、各モジュールの TLS データ ブロックの大きさが示されていないことです。
さまざまなスレッド ローカル ストレージ関連関数の詳細については、MSDNを参照してください。TlsGetValue()を使用して、特定の TLS 値を取得できます。動作する場合でも、メモリをいじらないでください。未定義の動作を呼び出しているだけで、たまたま動作するが、将来のバージョンの Windows で壊れる可能性があります。