[Code] GetThreadTEB

Iniciado por Arkangel, Junio 17, 2013, 08:58:55 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 17, 2013, 08:58:55 AM Ultima modificación: Febrero 08, 2014, 05:37:41 PM por Expermicid
Otro codigo  mas de hace un tiempo
Esta función que te da la localización del TEB de cualquier hilo:

Código: cpp

#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