Блок информации о потоке Win32 - Win32 Thread Information Block

В вычисление, то Блок информации о потоке Win32 (TIB) - это структура данных в Win32 на x86 который хранит информацию о текущем запущенном нить. Он также известен как Блок среды потока (TEB) для Win32. Он произошел от 32-разрядных систем и обратно совместим с аналогичной структурой в OS / 2.[1]

TIB официально не документирован для Windows 9x. DDK серии Windows NT (а также реализация MinGW / ReactOS) включает структуру NT_TIB в winnt.h, которая документирует независимую от подсистемы часть. Еще до того, как TIB был эффективно задокументирован, многие приложения уже начали использовать его поля, которые фактически являются частью API. В частности, на первое поле, содержащее фрейм SEH, напрямую ссылается код, созданный собственным компилятором Microsoft.[1] Специфическая для подсистемы Win32 часть TEB недокументирована, но Вино включает определение TEB в winternl.h.[2]

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

Содержание TIB в 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]NTSubSystemTib
указательFS: [0x10]GS: [0x20]NTДанные волокна
указательФС: [0x14]GS: [0x28]Win9x и NTСлот произвольных данных
указательФС: [0x18]GS: [0x30]Win9x и NTЛинейный адрес TEB
Конец Подсистема NT независимая часть; ниже Win32 -зависимый
указательFS: [0x1C]GS: [0x38]NTУказатель среды
указательFS: [0x20]GS: [0x40]NTИдентификатор процесса (в некоторых дистрибутивах Windows это поле используется как DebugContext)
4ФС: [0x24]GS: [0x48]NTИдентификатор текущего потока
4FS: [0x28]GS: [0x50]NTАктивный дескриптор RPC
4FS: [0x2C]GS: [0x58]Win9x и NTЛинейный адрес локальное хранилище потока массив
4FS: [0x30]GS: [0x60]NTЛинейный адрес Блок среды процесса (PEB)
4FS: [0x34]GS: [0x68]NTНомер последней ошибки
4ФС: [0x38]GS: [0x6C]NTКоличество собственных критических секций
4FS: [0x3C]GS: [0x70]NTАдрес клиентского потока CSR
4FS: [0x40]GS: [0x78]NTИнформация о потоках Win32
124FS: [0x44]GS: [0x80]NT, виноИнформация о клиенте Win32 (NT), личные данные user32 (Wine), 0x60 = LastError (Win95 и 98), 0x74 = LastError (WinME)
4FS: [0xC0]GS: [0x100]NTЗарезервировано для Wow64. Содержит указатель на FastSysCall в Wow64.
4FS: [0xC4]GS: [0x108]NTТекущий регион
4ФС: [0xC8]GS: [0x10C]NTРегистр состояния программного обеспечения FP
216FS: [0xCC]GS: [0x110]NT, виноЗарезервировано для ОС (NT), частные данные ядра32 (Wine)
здесь: FS: [0x124] 4 NT Указатель на структуру KTHREAD (ETHREAD)
4ФС: [0x1A4]GS: [0x2C0]NTКод исключения
18ФС: [0x1A8]GS: [0x2C8]NTСтек контекста активации
24FS: [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)
4FS: [0x6DC]GS: [0x838]NTGDI регион
4FS: [0x6E0]GS: [0x840]NTGDI Pen
4FS: [0x6E4]GS: [0x848]NTКисть GDI
4FS: [0x6E8]GS: [0x850]NTРеальный идентификатор процесса
4FS: [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
20FS: [0x700]GS: [0x878]NTЗарезервировано для пользовательского приложения
1248FS: [0x714]GS: [0x890]NTЗарезервировано для GL (внутреннее описание см. В винном справочнике)[2]
4ФС: [0xBF4]GS: [0x1250]NTПоследнее значение статуса
532ФС: [0xBF8]GS: [0x1258]NTСтатический буфер UNICODE_STRING
указательFS: [0xE0C]GS: [0x1478]NTТакже известный как DeallocationStack, он устанавливает реальный начальный адрес буфера стека, отсюда и реальный предел стека: он на несколько страниц меньше поля ограничения стека (которое скрывает страницы защиты, используемые для обнаружения переполнения стека).
указатель[]FS: [0xE10]GS: [0x1480]NTСлоты TLS, 4/8 байта на слот, 64 слота
8FS: [0xF10]GS: [0x1680]NTСсылки TLS (структура LIST_ENTRY)
4ФС: [0xF18]GS: [0x1690]NTVDM
4FS: [0xF1C]GS: [0x1698]NTЗарезервировано для RPC
4ФС: [0xF28]GS: [0x16B0]NTРежим ошибки потока (RtlSetThreadErrorMode)
Это не полная таблица; см. 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 текущего потока можно получить как смещение сегмента регистр FS (x86) или GS (x64).

Доступ к полям TIB по смещению от FS: [0], а сначала получить линейный указатель на него, ссылающийся на него, хранящийся в ПС: [18ч]. Этот указатель можно использовать с арифметикой указателя или преобразовать в структура указатель.

С помощью Microsoft Windows SDK или аналогично, программист может использовать встроенную функцию, определенную в winnt.h названный NtCurrentTeb который возвращает адрес текущего информационного блока потока как NT_TIB *.[4]

Альтернативные методы доступа для IA-32 архитектуры следующие:

// gcc (встроенная сборка в стиле AT&T).пустота *getTIB(пустота) {    регистр пустота *pTIB;#if defined (__ x86_64__) || определено (__ amd64__)    __как м__("movq %% gs: 0x30,% 0" : "= г" (pTIB));#elif defined (__ i386__)    __как м__("movl %% fs: 0x18,% 0" : "= г" (pTIB));#else#error неподдерживаемая архитектура#endif    вернуть pTIB;}
// gcc (именованные адресные пространства, такие же, как встроенная версия сборки на -O1 или -ftree-ter).пустота *getTIB(пустота) {#if defined (__ x86_64__) || определено (__ amd64__)#ifndef __SEG_GS#error неподдерживаемая версия GCC#endif    вернуть *(пустота *__seg_gs *) 0x30;#elif defined (__ i386__)#ifndef __SEG_FS#error неподдерживаемая версия GCC#endif    вернуть *(пустота *__seg_fs *) 0x18;#else#error неподдерживаемая архитектура#endif}
// Microsoft C__declspec(голый)пустота *getTIB() {    __как м mov EAX, FS:[18час]}
// Использование встроенных функций Microsoft вместо встроенной сборки (работает как для архитектуры X86, так и для архитектуры X64)пустота *getTIB() {#ifdef _M_IX86    вернуть (пустота *)__readfsdword(0x18);#elif _M_AMD64    вернуть (пустота *)__readgsqword(0x30);#else#error неподдерживаемая архитектура#endif}

Смотрите также

использованная литература

  1. ^ а б Пьетрек, Мэтт (Май 1996 г.). "Под капотом". Журнал Microsoft Systems. Архивировано из оригинал на 2009-06-14. Получено 2010-07-07.
  2. ^ а б c d "вино winternl.h: typedef struct _TEB". GitHub. вино-зеркало. 29 октября 2019.
  3. ^ Чапелл, Джефф. "TEB".
  4. ^ "Функция NtCurrentTeb". Документы Microsoft. Получено 20 ноября 2019.

дальнейшее чтение

внешние ссылки