В вычислении , то Win32 Тема информационного блока (ИРТ) представляет собой структуру данных в Win32 на x86 , которая хранит информацию о запущенной в данный момент потоке . Он также известен как блок среды потока (TEB) для Win32. Он произошел от аналогичной структуры OS / 2 и имеет обратную совместимость с 32-разрядными системами . [1]
TIB официально не документирован для Windows 9x. DDK серии Windows NT (а также реализация MinGW / ReactOS) включает структуру NT_TIB в winnt.h, которая документирует независимую от подсистемы часть. Еще до того, как TIB был эффективно задокументирован, многие приложения уже начали использовать его поля, которые фактически являются частью API . В частности, на первое поле, содержащее фрейм SEH, напрямую ссылается код, созданный собственным компилятором Microsoft. [1] Специфическая для подсистемы Win32 часть TEB недокументирована, но Wine включает определение TEB в winternl.h. [2]
TIB можно использовать для получения большого количества информации о процессе без вызова Win32 API. Примеры включают эмуляцию GetLastError (), GetVersion (). С помощью указателя на PEB можно получить доступ к таблицам импорта (IAT), аргументам запуска процесса, имени образа и т. Д. Доступ к нему осуществляется из регистра сегмента FS в 32-битной Windows и GS в 64-битной Windows.
Содержание TIB в Windows
Эта таблица основана на работе Wine над внутренними компонентами Microsoft Windows . [2]
Байт / Тип | смещение (32-бит, FS) | смещение (64-бит, GS) | Версии Windows | Описание |
---|---|---|---|---|
указатель | FS: [0x00] | GS: [0x00] | Win9x и NT | Текущий кадр структурированной обработки исключений (SEH) Примечание. В 64-разрядной версии Windows вместо этого используется раскрутка стека, выполняемая в режиме ядра . |
указатель | FS: [0x04] | GS: [0x08] | Win9x и NT | Основание стека / низ стека (старший адрес) |
указатель | FS: [0x08] | GS: [0x10] | Win9x и NT | Предел стека / потолок стека (нижний адрес) |
указатель | FS: [0x0C] | GS: [0x18] | NT | SubSystemTib |
указатель | FS: [0x10] | GS: [0x20] | NT | Данные волокна |
указатель | ФС: [0x14] | GS: [0x28] | Win9x и NT | Слот произвольных данных |
указатель | ФС: [0x18] | GS: [0x30] | Win9x и NT | Линейный адрес TEB |
Конец независимой части подсистемы NT ; ниже Win32- зависимые | ||||
указатель | FS: [0x1C] | GS: [0x38] | NT | Указатель среды |
указатель | ФС: [0x20] | GS: [0x40] | NT | Идентификатор процесса (в некоторых дистрибутивах Windows это поле используется как DebugContext) |
указатель | ФС: [0x24] | GS: [0x48] | NT | Идентификатор текущего потока |
указатель | FS: [0x28] | GS: [0x50] | NT | Активный дескриптор RPC |
указатель | FS: [0x2C] | GS: [0x58] | Win9x и NT | Линейный адрес массива хранения локального потока |
указатель | FS: [0x30] | GS: [0x60] | NT | Линейный адрес блока среды процесса (PEB) |
4 | FS: [0x34] | GS: [0x68] | NT | Номер последней ошибки |
4 | ФС: [0x38] | GS: [0x6C] | NT | Количество собственных критических секций |
указатель | FS: [0x3C] | GS: [0x70] | NT | Адрес клиентского потока CSR |
указатель | ФС: [0x40] | GS: [0x78] | NT | Информация о потоках Win32 |
124 | ФС: [0x44] | GS: [0x80] | NT, вино | Информация о клиенте Win32 (NT), личные данные user32 (Wine), 0x60 = LastError (Win95 и 98), 0x74 = LastError (WinME) |
указатель | FS: [0xC0] | GS: [0x100] | NT | Зарезервировано для Wow64. Содержит указатель на FastSysCall в Wow64. |
4 | ФС: [0xC4] | GS: [0x108] | NT | Текущий регион |
4 | ФС: [0xC8] | GS: [0x10C] | NT | Регистр состояния программного обеспечения FP |
216 | FS: [0xCC] | GS: [0x110] | NT, вино | Зарезервировано для ОС (NT), частные данные ядра 32 (Wine) здесь: FS: [0x124] 4 NT Указатель на структуру KTHREAD (ETHREAD) |
4 | ФС: [0x1A4] | GS: [0x2C0] | NT | Код исключения |
18 | ФС: [0x1A8] | GS: [0x2C8] | NT | Стек контекста активации |
24 | FS: [0x1BC] | GS: [0x2E8] | NT, вино | Резервные байты (NT), частные данные ntdll (Wine) |
40 | ФС: [0x1D4] | GS: [0x300] | NT, вино | Зарезервировано для ОС (NT), частные данные ntdll (Wine) |
1248 | ФС: [0x1FC] | GS: [0x350] | NT, вино | GDI TEB Batch (ОС), частные данные vm86 (Wine) |
4 | FS: [0x6DC] | GS: [0x838] | NT | GDI регион |
4 | FS: [0x6E0] | GS: [0x840] | NT | GDI Pen |
4 | FS: [0x6E4] | GS: [0x848] | NT | Кисть GDI |
4 | FS: [0x6E8] | GS: [0x850] | NT | Реальный идентификатор процесса |
4 | FS: [0x6EC] | GS: [0x858] | NT | Реальный идентификатор потока |
4 | ФС: [0x6F0] | GS: [0x860] | NT | Кэшированный дескриптор процесса GDI |
4 | ФС: [0x6F4] | GS: [0x868] | NT | Идентификатор клиентского процесса GDI (PID) |
4 | ФС: [0x6F8] | GS: [0x86C] | NT | Идентификатор клиентского потока GDI (TID) |
4 | ФС: [0x6FC] | GS: [0x870] | NT | Информация о языковом стандарте GDI thread |
20 | FS: [0x700] | GS: [0x878] | NT | Зарезервировано для пользовательского приложения |
1248 | FS: [0x714] | GS: [0x890] | NT | Зарезервировано для GL (внутреннее описание см. В винном справочнике) [2] |
4 | ФС: [0xBF4] | GS: [0x1250] | NT | Последнее значение статуса |
532 | ФС: [0xBF8] | GS: [0x1258] | NT | Статический буфер UNICODE_STRING |
указатель | FS: [0xE0C] | GS: [0x1478] | NT | Также известный как DeallocationStack, он устанавливает реальный начальный адрес буфера стека, следовательно, реальный предел стека: он на несколько страниц меньше поля ограничения стека (которое скрывает страницы защиты, используемые для обнаружения переполнения стека). |
указатель[] | ФС: [0xE10] | GS: [0x1480] | NT | Слоты TLS, 4/8 байта на слот, 64 слота |
8 | ФС: [0xF10] | GS: [0x1680] | NT | Ссылки TLS (структура LIST_ENTRY) |
4 | ФС: [0xF18] | GS: [0x1690] | NT | VDM |
4 | FS: [0xF1C] | GS: [0x1698] | NT | Зарезервировано для RPC |
4 | ФС: [0xF28] | GS: [0x16B0] | NT | Режим ошибки потока (RtlSetThreadErrorMode) |
4 | ФС: [0xF78] | GS: [0x1748] | NT | Гарантированные байты стека |
Это не полная таблица; см. Wine ref для всех полей до FS: [0xfb4] / GS: [17c8]. [2] В новых версиях Windows размер TIB увеличивается до 0x1000 / 0x1838 в Windows 10. Некоторые из добавленных полей удалены, что приводит к конфликту определений. [3] |
FS (для 32-разрядной версии) или GS (для 64-разрядной версии) сопоставляется с TIB, который встроен в блок данных, известный как TDB (база данных потоков). TIB содержит цепочку обработки исключений, зависящую от потока, и указатель на TLS (локальное хранилище потока). Локальное хранилище потока не то же самое, что локальное хранилище C.
Информация о стеке, хранящаяся в TIB
Процесс должен иметь возможность перемещать стек своих потоков до тех пор, пока он соответствующим образом обновляет информацию, хранящуюся в TIB. Несколько полей являются ключевыми в этом вопросе: база стека, предел стека, стек освобождения и гарантированные байты стека, соответственно сохраненные со смещениями 0x8, 0x10, 0x1478 и 0x1748 в 64 битах. Различные функции ядра Windows читают и записывают эти значения, особенно для того, чтобы отличать переполнение стека от других ошибок страницы чтения / записи (чтение или запись на страницу, защищенную ограничениями стека в гарантированных байтах стека, будут генерировать исключение переполнения стека вместо доступа нарушение). Стек освобождения важен, потому что Windows API позволяет изменять количество защищаемых страниц: функция SetThreadStackGuarantee позволяет как читать текущее пространство, так и увеличивать его. Чтобы прочитать его, он считывает поле GuaranteedStackBytes, а для его увеличения он использует для отмены фиксации страниц стека. Установка пределов стека без установки DeallocationStack, вероятно, вызовет странное поведение в SetThreadStackGuarantee. Например, он перезапишет пределы стека на неправильные значения. Различные библиотеки вызывают SetThreadStackGuarantee, например .NET CLR использует его для настройки стека своих потоков.
Доступ к TIB
Доступ к TIB текущего потока можно получить как смещение сегментного регистра FS (x86) или GS (x64).
Не принято обращаться к полям TIB по смещению от FS:[0]
, а сначала получить линейный указатель на него, ссылающийся на него, хранящийся в FS:[18h]
. Этот указатель может использоваться с арифметикой указателя или быть приведен к указателю структуры .
Используя Microsoft Windows SDK или аналогичный, программист может использовать встроенную функцию, определенную в winnt.h
named, NtCurrentTeb
которая возвращает адрес текущего информационного блока потока как NT_TIB *
. [4]
Альтернативные методы доступа для архитектур IA-32 следующие:
// gcc (встроенная сборка в стиле AT&T). void * getTIB ( void ) { регистр void * pTIB ; #if defined (__ x86_64__) || определено (__ amd64__) __asm__ ( "movq %% gs: 0x30,% 0" : "= r" ( pTIB )); #elif defined (__ i386__) __asm__ ( "movl %% fs: 0x18,% 0" : "= r" ( pTIB )); #else #ERROR неподдерживаемый архитектура #endif возвратного pTIB ; }
// gcc (именованные адресные пространства, такие же, как встроенная версия сборки на -O1 или -ftree-ter). void * getTIB ( void ) { #if defined (__ x86_64__) || defined (__ amd64__) #ifndef __SEG_GS #error неподдерживаемая версия GCC #endif return * ( void * __seg_gs * ) 0x30 ; #elif defined (__ i386__) #ifndef __SEG_FS #error неподдерживаемая версия GCC #endif return * ( void * __seg_fs * ) 0x18 ; #else #error неподдерживаемый архитектура #endif }
// Microsoft C __declspec ( голый ) void * getTIB () { __asm mov EAX , FS : [ 18 h ] __asm ret }
// Использование встроенных функций Microsoft вместо встроенной сборки (работает как для архитектуры X86, так и для X64) void * getTIB () { #ifdef _M_IX86 return ( void * ) __readfsdword ( 0x18 ); #elif _M_AMD64 return ( void * ) __readgsqword ( 0x30 ); #else #error неподдерживаемый архитектура #endif }
Смотрите также
Рекомендации
- ^ a b Пьетрек, Мэтт (май 1996 г.). «Под капотом» . Журнал Microsoft Systems . Архивировано из оригинала на 2009-06-14 . Проверено 7 июля 2010 .
- ^ а б в г "wine winternl.h: typedef struct _TEB" . GitHub . вино-зеркало. 29 октября 2019.
- ^ Чапелл, Джефф. «ТЭБ» .
- ^ "Функция NtCurrentTeb" . Документы Microsoft . Проверено 20 ноября 2019 года .
дальнейшее чтение
- Пьетрек, Мэтт (март 1996). Секреты программирования Windows 95 (pdf) . IDG. С. 136–138 . ISBN 978-1-56884-318-6. Проверено 17 июля 2010 .
Внешние ссылки
- Макет TEB на NTinternals.net
- Структурированная обработка исключений и TIB
- Описание первых слотов БИБ
- Описание TEB, поле за полем
- Определения TEB для различных версий Windows