После некоторого поиска в Google и нескольких подсказок, данных здесь, мне наконец удалось найти макет сегмента FS
(используется Windows для хранения данных 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 и выше)? а на х64 еще есть?
Вторичным по отношению к этому является доступ к этой переменной. Я использую MSVC, поэтому у меня есть доступ к встроенным функциям __readfsdword
и __readgsqword
, однако MSDN по какой-то причине помечает их как привилегированные инструкции:
Эти встроенные функции доступны только в режиме ядра, а подпрограммы доступны только как встроенные функции.
Они, конечно, не только для ядра, но почему они помечены как таковые, просто неправильная документация? (в моих автономных документах VS 2008 этого пункта нет).
Наконец, безопасно ли обращаться к ArbitraryUserPointer
напрямую через один __readfsdword(0x14)
или предпочтительнее использовать его через линейный адрес TIB? (что по-прежнему потребует чтения из FS
).