Otro codigo mas de hace un tiempo
Esta función que te da la localización del TEB de cualquier hilo:
#include <Windows.h>
#include <Winternl.h>
TEB* GetThreadTEB(ushort TID){
LDT_ENTRY ldt;//La LDT es un tipo de GDT que es diferente para cada hilo. http://wiki.osdev.org/GDT
CONTEXT context;
void* BaseTIB;
HANDLE hThread;
//Inicializamos a zero
ZeroMemory(&context,sizeof(context));
ZeroMemory(&ldt,sizeof(ldt));
//Le decimos que queremos los registros de segmento del hilo
context.ContextFlags = CONTEXT_SEGMENTS;
//Abrimos el hilo con los flag de THREAD_GET_CONTEXT y THREAD_QUERY_INFORMATION
hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION,0,TID);
//Conseguimos el contexto del hilo
GetThreadContext(hThread,&context);
//Conseguimos la LDT asignada a el selector del segmento fs
GetThreadSelectorEntry(hThread,context.SegFs,&ldt);
//Cerramos el handle
CloseHandle(hThread);
//La direccion base esta repartida en tres campos de la ldt BaseLow 0-15,BaseMid 16-23 y BaseHi 24-31
BaseTIB = (void*)(ldt.BaseLow | (ldt.HighWord.Bits.BaseMid<<16)| (ldt.HighWord.Bits.BaseHi<<24));
printf("base TIB: %p\n",BaseTIB);
return (TEB*)BaseTIB;
}
en el TIB es donde se guarda la informacion de u hilo concreto como los valores de el almacenamiento local, la direccion de la pila, manejo de excepciones, etc
Espero que a alguien le sea util. Yo lo uso para modificar el Thread local storage de cualquier hilo.
Saludos Arkangel