Win32 Thread Information BlockEn 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
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 TIBEl 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 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;
}
ReferenciasEnlaces externos |
Portal di Ensiklopedia Dunia