Блок информации о потоке Win32 - Win32 Thread Information Block
Эта статья должна быть обновлено.Декабрь 2013) ( |
В вычисление, то Блок информации о потоке 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] | 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 | Указатель среды |
указатель | FS: [0x20] | GS: [0x40] | NT | Идентификатор процесса (в некоторых дистрибутивах Windows это поле используется как DebugContext) |
4 | ФС: [0x24] | GS: [0x48] | NT | Идентификатор текущего потока |
4 | FS: [0x28] | GS: [0x50] | NT | Активный дескриптор RPC |
4 | FS: [0x2C] | GS: [0x58] | Win9x и NT | Линейный адрес локальное хранилище потока массив |
4 | FS: [0x30] | GS: [0x60] | NT | Линейный адрес Блок среды процесса (PEB) |
4 | FS: [0x34] | GS: [0x68] | NT | Номер последней ошибки |
4 | ФС: [0x38] | GS: [0x6C] | NT | Количество собственных критических секций |
4 | FS: [0x3C] | GS: [0x70] | NT | Адрес клиентского потока CSR |
4 | FS: [0x40] | GS: [0x78] | NT | Информация о потоках Win32 |
124 | FS: [0x44] | GS: [0x80] | NT, вино | Информация о клиенте Win32 (NT), личные данные user32 (Wine), 0x60 = LastError (Win95 и 98), 0x74 = LastError (WinME) |
4 | FS: [0xC0] | GS: [0x100] | NT | Зарезервировано для Wow64. Содержит указатель на FastSysCall в Wow64. |
4 | FS: [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, он устанавливает реальный начальный адрес буфера стека, отсюда и реальный предел стека: он на несколько страниц меньше поля ограничения стека (которое скрывает страницы защиты, используемые для обнаружения переполнения стека). |
указатель[] | FS: [0xE10] | GS: [0x1480] | NT | Слоты TLS, 4/8 байта на слот, 64 слота |
8 | FS: [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) |
Это не полная таблица; см. 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}
Смотрите также
использованная литература
- ^ а б Пьетрек, Мэтт (Май 1996 г.). "Под капотом". Журнал Microsoft Systems. Архивировано из оригинал на 2009-06-14. Получено 2010-07-07.
- ^ а б c d "вино winternl.h: typedef struct _TEB". GitHub. вино-зеркало. 29 октября 2019.
- ^ Чапелл, Джефф. "TEB".
- ^ "Функция NtCurrentTeb". Документы Microsoft. Получено 20 ноября 2019.
дальнейшее чтение
- Пьетрек, Мэтт (Март 1996 г.). Секреты программирования Windows 95 (pdf). IDG. стр.136–138. ISBN 978-1-56884-318-6. Получено 2010-07-17.