Введение

Блок информации о потоке (TIB) или блок окружения потока (TEB) — это структура данных в Win32 на x86, хранящая информацию о текущем выполняющемся потоке. Она берет свое начало от и сохраняет обратную совместимость на 32-битных системах с аналогичной структурой в OS/2. TIB может использоваться для получения большого объема информации о процессе без вызова Win32 API. Примеры включают эмуляцию функций GetLastError и GetVersion. Через указатель на PEB можно получить доступ к таблицам импорта (IAT), аргументам запуска процесса, имени образа и т.д. Доступ к TIB осуществляется из сегмента FS в 32-разрядной Windows и GS в 64-разрядной Windows.

Информация о стеке, хранящаяся в TIB

Процесс должен иметь возможность свободно перемещать стек своих потоков, если он соответствующим образом обновляет информацию, хранящуюся в TIB. Ключевыми для этого являются несколько полей: база стека, предел стека, стек деаллокации и гарантированный размер стека, которые соответственно хранятся в смещениях 0x8, 0x10, 0x1478 и 0x1748 в 64-битной системе. Различные функции ядра Windows читают и записывают эти значения, в частности, для различения переполнения стека и других ошибок страниц чтения/записи (чтение или запись страницы, защищенной в пределах гарантированного размера стека, вызовет исключение переполнения стека вместо нарушения доступа). Стек деаллокации важен, поскольку Windows API позволяет изменять количество защищенных страниц: функция SetThreadStackGuarantee позволяет как читать текущий размер, так и увеличивать его. Для чтения используется поле GuaranteedStackBytes, а для увеличения требуется освобождение страниц стека. Установка пределов стека без установки DeallocationStack, вероятно, приведет к некорректной работе SetThreadStackGuarantee, например, к перезаписи границ стека неверными значениями. Различные библиотеки вызывают SetThreadStackGuarantee, например, NET CLR использует ее для настройки стека своих потоков.