ここでかなりのグーグル検索といくつかのヒントを提供した後、最終的にセグメントのレイアウトを見つけることができましたFS
(TIBデータを保存するためにウィンドウで使用されます)。特に興味深いのはArbitraryUserPointer
、PSDK で提供されているメンバーです。
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union {
PVOID FiberData;
DWORD Version;
};
PVOID ArbitraryUserPointer;
struct _NT_TIB *Self;
} NT_TIB;
この変数を使用することは正確にどのくらい安全ですか (Vista 以降)? x64にはまだ存在しますか?
それに続くのは、この変数へのアクセスです。私は MSVC を使用しているため、__readfsdword
&__readgsqword
組み込み関数にアクセスできますが、MSDNは何らかの理由でこれらを特権命令としてマークしています。
これらの組み込み関数はカーネル モードでのみ使用でき、ルーチンは組み込み関数としてのみ使用できます。
もちろん、それらはカーネルだけではありませんが、なぜそのようにマークされているのですか?ドキュメントが間違っているだけですか? (私のオフライン VS 2008 ドキュメントにはこの句がありません)。
最後に、ArbitraryUserPointer
シングルを介して直接アクセスするのは安全__readfsdword(0x14)
ですか、それともリニア TIB アドレスを介して使用することをお勧めしますか? (これはまだ からの読み取りが必要ですFS
)。