Win32 Thread Information Block

De Wikipedia, la enciclopedia libre

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).[1]

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.[1]

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[editar]

Posició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[editar]

El 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;
}

Referencias[editar]

  1. a b Error en la cita: Etiqueta <ref> no válida; no se ha definido el contenido de las referencias llamadas Pietrek-May96

Enlaces externos[editar]