Informační blok vláken Win32 - Win32 Thread Information Block
![]() | Tento článek musí být aktualizováno.prosinec 2013) ( |
v výpočetní, Informační blok vláken Win32 (TIB) je a datová struktura v Win32 na x86 který ukládá informace o aktuálně spuštěném vlákno. To je také známé jako Blok prostředí vlákna (TEB) pro Win32. Sestoupil z a je zpětně kompatibilní s 32bitovými systémy s podobnou strukturou v OS / 2.[1]
TIB je pro Windows 9x oficiálně nezdokumentovaný. Řada Windows NT DDK (stejně jako implementace MinGW / ReactOS) obsahuje ve formátu winnt.h strukturu NT_TIB, která dokumentuje nezávislou část subsystému. Ještě předtím, než byla TIB účinně zdokumentována, mnoho aplikací již začalo používat její pole, která jsou účinně součástí API. První pole obsahující zejména SEH rámec je přímo odkazováno na kód vytvořený vlastním kompilátorem společnosti Microsoft.[1] Část TEB specifická pro subsystém Win32 je nezdokumentovaná, ale Víno zahrnuje definici TEB v winternl.h.[2]
TIB lze použít k získání mnoha informací o procesu bez volání rozhraní Win32 API. Mezi příklady patří emulace GetLastError (), GetVersion (). Přes ukazatel na PEB lze získat přístup k importním tabulkám (IAT), zpracovat spouštěcí argumenty, název obrázku atd. Je přístupný z registru segmentů FS ve 32bitových Windows a GS v 64bitových Windows.
Obsah TIB ve Windows
Tato tabulka je založena na Víno pracuje na Microsoft Windows interní.[2]
Bajty / Typ | offset (32-bit, FS) | offset (64-bit, GS) | Verze Windows | Popis |
---|---|---|---|---|
ukazatel | FS: [0x00] | GS: [0x00] | Win9x a NT | Proud Strukturované zpracování výjimek (SEH) rámeček Poznámka: používá 64bitovou verzi systému Windows odvíjení stohu hotovo v režim jádra namísto. |
ukazatel | FS: [0x04] | GS: [0x08] | Win9x a NT | Zásobník Base / Bottom of stack (high address) |
ukazatel | FS: [0x08] | GS: [0x10] | Win9x a NT | Limit zásobníku / strop zásobníku (nízká adresa) |
ukazatel | FS: [0x0C] | GS: [0x18] | NT | SubSystemTib |
ukazatel | FS: [0x10] | GS: [0x20] | NT | Vláknová data |
ukazatel | FS: [0x14] | GS: [0x28] | Win9x a NT | Libovolný datový slot |
ukazatel | FS: [0x18] | GS: [0x30] | Win9x a NT | Lineární adresa TEB |
Konec NT subsystém samostatná část; níže jsou Win32 -závislý | ||||
ukazatel | FS: [0x1C] | GS: [0x38] | NT | Ukazatel prostředí |
ukazatel | FS: [0x20] | GS: [0x40] | NT | ID procesu (v některých distribucích Windows se toto pole používá jako „DebugContext“) |
4 | FS: [0x24] | GS: [0x48] | NT | Aktuální ID vlákna |
4 | FS: [0x28] | GS: [0x50] | NT | Aktivní rukojeť RPC |
4 | FS: [0x2C] | GS: [0x58] | Win9x a NT | Lineární adresa místní úložiště vláken pole |
4 | FS: [0x30] | GS: [0x60] | NT | Lineární adresa Blokovat procesní prostředí (PEB) |
4 | FS: [0x34] | GS: [0x68] | NT | Číslo poslední chyby |
4 | FS: [0x38] | GS: [0x6C] | NT | Počet vlastněných kritických sekcí |
4 | FS: [0x3C] | GS: [0x70] | NT | Adresa vlákna klienta CSR |
4 | FS: [0x40] | GS: [0x78] | NT | Informace o vlákně Win32 |
124 | FS: [0x44] | GS: [0x80] | NT, víno | Informace o klientovi Win32 (NT), soukromá data uživatele32 (Wine), 0x60 = LastError (Win95 & 98), 0x74 = LastError (WinME) |
4 | FS: [0xC0] | GS: [0x100] | NT | Vyhrazeno pro Wow64. Obsahuje ukazatel na FastSysCall ve Wow64. |
4 | FS: [0xC4] | GS: [0x108] | NT | Aktuální národní prostředí |
4 | FS: [0xC8] | GS: [0x10C] | NT | Registr stavu softwaru FP |
216 | FS: [0xCC] | GS: [0x110] | NT, víno | Vyhrazeno pro OS (NT), soukromá data jádra32 (víno) zde: FS: [0x124] 4 NT Ukazatel na strukturu KTHREAD (ETHREAD) |
4 | FS: [0x1A4] | GS: [0x2C0] | NT | Kód výjimky |
18 | FS: [0x1A8] | GS: [0x2C8] | NT | Aktivační kontextový zásobník |
24 | FS: [0x1BC] | GS: [0x2E8] | NT, víno | Náhradní bajty (NT), soukromá data ntdll (víno) |
40 | FS: [0x1D4] | GS: [0x300] | NT, víno | Vyhrazeno pro OS (NT), soukromá data ntdll (víno) |
1248 | FS: [0x1FC] | GS: [0x350] | NT, víno | GDI TEB Batch (OS), soukromá data vm86 (Wine) |
4 | FS: [0x6DC] | GS: [0x838] | NT | GDI Region |
4 | FS: [0x6E0] | GS: [0x840] | NT | GDI pero |
4 | FS: [0x6E4] | GS: [0x848] | NT | GDI štětec |
4 | FS: [0x6E8] | GS: [0x850] | NT | Skutečné ID procesu |
4 | FS: [0x6EC] | GS: [0x858] | NT | Skutečné ID vlákna |
4 | FS: [0x6F0] | GS: [0x860] | NT | Popisovač procesu v mezipaměti GDI |
4 | FS: [0x6F4] | GS: [0x868] | NT | ID procesu klienta GDI (PID) |
4 | FS: [0x6F8] | GS: [0x86C] | NT | ID klientského vlákna GDI (TID) |
4 | FS: [0x6FC] | GS: [0x870] | NT | Informace o národním prostředí GDI vlákna |
20 | FS: [0x700] | GS: [0x878] | NT | Vyhrazeno pro uživatelskou aplikaci |
1248 | FS: [0x714] | GS: [0x890] | NT | Vyhrazeno pro GL (viz interní odkaz na víno)[2] |
4 | FS: [0xBF4] | GS: [0x1250] | NT | Hodnota posledního stavu |
532 | FS: [0xBF8] | GS: [0x1258] | NT | Statická vyrovnávací paměť UNICODE_STRING |
ukazatel | FS: [0xE0C] | GS: [0x1478] | NT | Také známý jako DeallocationStack, určuje skutečnou počáteční adresu vyrovnávací paměti zásobníku, a proto je skutečný limit zásobníku: je to o několik stránek méně než pole limitu zásobníku (které skrývá ochranné stránky používané k detekci přetečení zásobníku). |
ukazatel[] | FS: [0xE10] | GS: [0x1480] | NT | Sloty TLS, 4/8 bajtů na slot, 64 slotů |
8 | FS: [0xF10] | GS: [0x1680] | NT | Odkazy TLS (struktura LIST_ENTRY) |
4 | FS: [0xF18] | GS: [0x1690] | NT | VDM |
4 | FS: [0xF1C] | GS: [0x1698] | NT | Vyhrazeno pro RPC |
4 | FS: [0xF28] | GS: [0x16B0] | NT | Režim chyby vlákna (RtlSetThreadErrorMode) |
Toto není plný stůl; viz odkaz na víno pro všechna pole do FS: [0xfb4] / GS: [17c8].[2] Novější verze systému Windows dále rozšiřují velikost TIB, až na 0x1000 / 0x1838 ve Windows 10. Některá připojená pole jsou odstraněna, což vede ke konfliktním definicím.[3] |
FS (pro 32bitové) nebo GS (pro 64bitové) se mapuje na TIB, který je vložen do datového bloku známého jako TDB (vláknová databáze). TIB obsahuje řetězec zpracování výjimek specifických pro vlákno a ukazatel na TLS (místní úložiště podprocesu). Místní úložiště podprocesů není stejné jako místní úložiště C.
Přístup k TIB
TIB aktuálního vlákna lze přistupovat jako posun segmentu Registrovat FS (x86) nebo GS (x64).
Není běžné přistupovat k polím TIB posunem od FS: [0]
, ale spíše nejprve získat lineární odkazující ukazatel na něj uložený v FS: [18h]
. Tento ukazatel lze použít s aritmetikou ukazatele nebo jej lze přetypovat na struktur ukazatel.
Použitím Microsoft Windows SDK nebo podobně, programátor může použít inline funkci definovanou v winnt.h
pojmenovaný NtCurrentTeb
který vrátí adresu aktuálního informačního bloku vlákna jako NT_TIB *
.[4]
Alternativní způsoby přístupu pro IA-32 architektury jsou následující:
// gcc (vložené sestavení ve stylu AT & T).prázdnota *getTIB(prázdnota) { Registrovat prázdnota *pTIB;#if defined (__ x86_64__) || definované (__ amd64__) __asm__(„movq %% gs: 0x30,% 0“ : "= r" (pTIB));#elif definováno (__ i386__) __asm__(„movl %% fs: 0x18,% 0“ : "= r" (pTIB));#jiný#error nepodporovaná architektura#endif vrátit se pTIB;}
// gcc (pojmenované adresní prostory, stejné jako verze vložené sestavy na -O1 nebo -ftree-ter).prázdnota *getTIB(prázdnota) {#if defined (__ x86_64__) || definované (__ amd64__)#ifndef __SEG_GS#error nepodporovaná verze GCC#endif vrátit se *(prázdnota *__seg_gs *) 0x30;#elif definováno (__ i386__)#ifndef __SEG_FS#error nepodporovaná verze GCC#endif vrátit se *(prázdnota *__seg_fs *) 0x18;#jiný#error nepodporovaná architektura#endif}
// Microsoft C__declspec(nahý)prázdnota *getTIB() { __asm mov EAX, FS:[18h]}
// Použití vnitřní podstaty Microsoftu namísto vloženého sestavení (funguje pro architektury X86 i X64)prázdnota *getTIB() {#ifdef _M_IX86 vrátit se (prázdnota *)__readfsdword(0x18);#elif _M_AMD64 vrátit se (prázdnota *)__readgsqword(0x30);#jiný#error nepodporovaná architektura#endif}
Viz také
Reference
- ^ A b Pietrek, Matt (Květen 1996). „Pod kapotou“. Microsoft Systems Journal. Archivovány od originál dne 14. 6. 2009. Citováno 2010-07-07.
- ^ A b C d "wine winternl.h: typedef struct _TEB". GitHub. zrcadlo na víno. 29. října 2019.
- ^ Chapell, Geoff. „TEB“.
- ^ "Funkce NtCurrentTeb". Dokumenty Microsoftu. Citováno 20. listopadu 2019.
Další čtení
- Pietrek, Matt (Březen 1996). Programovací tajemství Windows 95 (pdf). IDG. str.136–138. ISBN 978-1-56884-318-6. Citováno 2010-07-17.