Win32 Thread Information Block
En computación, el Win32 Thread Information Block (TIB) es una estructura de datos en los sistemas Win32, específicamente en la arquitectura x86, que almacena información acerca del hilo que se está ejecutando. También es conocido como el Thread Environment Block (TEB).
El TIB no está documentado oficialmente para Windows 9x. El DDK de la familia Windows NT incluye una estructura NT_TIB en winnt.h que documenta la parte independiente de subsistema. El emulador Wine incluye declaraciones para el TIB extendido (una parte especifica del subsistema). Todavía muchos programas de Win32 usan estos campos no documentados que son en efecto una parte de la API. El primer campo, en particular, está directamente referenciado por el código producido por el propio compilador de Microsoft.
El TIB puede ser usado para obtener una buena cantidad de información sobre el proceso sin tener que llamar a ninguna API de Win32 (por ejemplo, emulaciones de GetLastError() , GetVersion() ). A través del puntero al PEB se puede obtener acceso a las tablas de importación (IAT), los argumentos de inicio pasados al proceso, nombre de la imagen, etc.
Contenido del TIB
editarPosición | Longitud | Versión de Windows | Descripción |
---|---|---|---|
FS:[0x00] | 4 | Win9x y NT | Marco actual del Structured Exception Handling (SEH) |
FS:[0x04] | 4 | Win9x y NT | Parte superior de la pila |
FS:[0x08] | 4 | Win9x y NT | Parte inferior actual de la pila |
FS:[0x0C] | 4 | Desconocido (Subsistema TIB?) | |
FS:[0x10] | 4 | NT | Fibra de datos (hilo) |
FS:[0x14] | 4 | Win9x y NT | Espacio de datos arbitrario |
FS:[0x18] | 4 | Win9x y NT | Dirección lineal del TIB |
---- Fin de la parte independiente del Subsistema NT ---- | |||
FS:[0x1C] | 4 | NT | Puntero de ambiente |
FS:[0x20] | 4 | NT | ID del Proceso |
FS:[0x24] | 4 | NT | ID del hilo actual |
FS:[0x28] | 4 | NT | Manejador activo del RPC |
FS:[0x2C] | 4 | Win9x y NT | Dirección lineal del array Thread-local storage |
FS:[0x30] | 4 | NT | Dirección lineal del Process Environment Block (PEB) |
FS:[0x34] | 4 | NT | Número de último error |
FS:[0x38] | 4 | NT | Conteo de secciones críticas propias |
FS:[0x3C] | 4 | NT | Dirección del CSR Client Thread |
FS:[0x40] | 4 | NT | Información del hilo Win32 |
FS:[0x44] | 124 | NT, Wine | Información del cliente Win32 (NT), datos privados de user32 (Wine), 0x60 = LastError (Win95), 0x74 = LastError (WinME) |
FS:[0xC0] | 4 | NT | Reservado para Wow32 |
FS:[0xC4] | 4 | NT | Internacionalización actual |
FS:[0xC8] | 4 | NT | Registro de estado de software FP |
FS:[0xCC] | 216 | NT, Wine | Reservado para el Sist. Operativo (NT), datos privados de kernel32 (Wine) |
FS:[0x124] | 4 | NT | Puntero a estructura KTHREAD (ETHREAD) |
FS:[0x1A4] | 4 | NT | Código de excepción |
FS:[0x1A8] | 18 | NT | Pila de contexto de activación |
FS:[0x1BC] | 24 | NT, Wine | Bytes de repuesto (NT), datos privados de ntdll (Wine) |
FS:[0x1D4] | 40 | NT, Wine | Reservado para el Sist. Operativo (NT), datos privados de ntdll (Wine) |
FS:[0x1FC] | 1248 | NT, Wine | GDI TEB Batch (OS), datos privados de vm86 (Wine) |
FS:[0x6DC] | 4 | NT | GDI Region |
FS:[0x6E0] | 4 | NT | GDI Pen |
FS:[0x6E4] | 4 | NT | GDI Brush |
FS:[0x6E8] | 4 | NT | Real Process ID |
FS:[0x6EC] | 4 | NT | Real Thread ID |
FS:[0x6F0] | 4 | NT | GDI cached process handle |
FS:[0x6F4] | 4 | NT | GDI client process ID (PID) |
FS:[0x6F8] | 4 | NT | GDI client thread ID (TID) |
FS:[0x6FC] | 4 | NT | Información de internacionalización para GDI thread |
FS:[0x700] | 20 | NT | Reservado para aplicación de usuario |
FS:[0x714] | 1248 | NT | Reservado para librería GL |
FS:[0xBF4] | 4 | NT | Valor de último estado |
FS:[0xBF8] | 214 | NT | Reservado para advapi32 |
FS:[0xE0C] | 4 | NT | Puntero para la pila de desasignación |
FS:[0xE10] | 256 | NT | Espacios de TLS, 4 bytes por espacio |
FS:[0xF10] | 8 | NT | Enlaces de TLS (estructura LIST_ENTRY) |
FS:[0xF18] | 4 | NT | VDM |
FS:[0xF1C] | 4 | NT | Reservado para RPC |
FS:[0xF28] | 4 | NT | Modo de errores de hilo (RtlSetThreadErrorMode) |
FS conduce a un TIB que está incorporado en un bloque de datos conocido como el TDB (Thread Data Base). El TIB contiene la cadena de manejo de excepciones específico a cada hilo y punteros al TLS (Thread Local Storage). El TLS no es lo mismo que el C local storage.
Acceso al TIB
editarEl TIB se puede acceder como un desplazamiento del segmento de registro FS.
No es común acceder a campos del TIB por medio de un desplazamiento desde FS:[0], sino que primero se obtiene un puntero de auto-referencia lineal a este, almacenado en FS:[0x18]. Este puntero se puede usar con aritmética de punteros o se puede transformar a un puntero struct.
Ejemplos en C inlined-assembly para x86 de 32 bits:
// gcc (AT&T-style inline assembly).
void *getTIB()
{
void *pTib;
__asm__("movl %%fs:0x18, %0" : "=r" (pTib) : : );
return pTib;
}
// Microsoft C
void *getTib()
{
void *pTib;
__asm {
mov EAX, FS:[18h]
mov [pTib], EAX
}
return pTib;
}
// Usando intrinsics de Microsoft en vez de inline assembly
void *getTib()
{
void *pTib = ( void * ) __readfsdword( 0x18 );
return pTib;
}