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
Posición LongitudVersión de WindowsDescripción FS:[0x00]4Win9x y NTMarco actual del Structured Exception Handling (SEH)FS:[0x04]4Win9x y NTParte superior de la pilaFS:[0x08]4Win9x y NTParte inferior actual de la pilaFS:[0x0C]4Desconocido (Subsistema TIB?)FS:[0x10]4NTFibra de datos (hilo)FS:[0x14]4Win9x y NTEspacio de datos arbitrarioFS:[0x18]4Win9x y NTDirección lineal del TIB---- Fin de la parte independiente del Subsistema NT ----FS:[0x1C]4NTPuntero de ambienteFS:[0x20]4NTID del ProcesoFS:[0x24]4NTID del hilo actualFS:[0x28]4NTManejador activo del RPCFS:[0x2C]4Win9x y NTDirección lineal del array Thread-local storageFS:[0x30]4NTDirección lineal del Process Environment Block (PEB)FS:[0x34]4NTNúmero de último errorFS:[0x38]4NTConteo de secciones críticas propiasFS:[0x3C]4NTDirección del CSR Client ThreadFS:[0x40]4NTInformación del hilo Win32FS:[0x44]124NT, WineInformación del cliente Win32 (NT), datos privados de user32 (Wine), 0x60 = LastError (Win95), 0x74 = LastError (WinME)FS:[0xC0]4NTReservado para Wow32FS:[0xC4]4NTInternacionalización actualFS:[0xC8]4NTRegistro de estado de software FPFS:[0xCC]216NT, WineReservado para el Sist. Operativo (NT), datos privados de kernel32 (Wine)FS:[0x124]4NTPuntero a estructura KTHREAD (ETHREAD)FS:[0x1A4]4NTCódigo de excepciónFS:[0x1A8]18NTPila de contexto de activaciónFS:[0x1BC]24NT, WineBytes de repuesto (NT), datos privados de ntdll (Wine)FS:[0x1D4]40NT, WineReservado para el Sist. Operativo (NT), datos privados de ntdll (Wine)FS:[0x1FC]1248NT, WineGDI TEB Batch (OS), datos privados de vm86 (Wine)FS:[0x6DC]4NTGDI RegionFS:[0x6E0]4NTGDI PenFS:[0x6E4]4NTGDI BrushFS:[0x6E8]4NTReal Process IDFS:[0x6EC]4NTReal Thread IDFS:[0x6F0]4NTGDI cached process handleFS:[0x6F4]4NTGDI client process ID (PID)FS:[0x6F8]4NTGDI client thread ID (TID)FS:[0x6FC]4NTInformación de internacionalización para GDI threadFS:[0x700]20NTReservado para aplicación de usuarioFS:[0x714]1248NTReservado para librería GLFS:[0xBF4]4NTValor de último estadoFS:[0xBF8]214NTReservado para advapi32FS:[0xE0C]4NTPuntero para la pila de desasignaciónFS:[0xE10]256NTEspacios de TLS, 4 bytes por espacioFS:[0xF10]8NTEnlaces de TLS (estructura LIST_ENTRY)FS:[0xF18]4NTVDMFS:[0xF1C]4NTReservado para RPCFS:[0xF28]4NTModo 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
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:, sino que primero se obtiene un puntero de autorreferencia 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
Enlaces externos Under The Hood - MSJ, May 1996 Wine HQ
Categoría:Programación