2010-10-12 8 views
7

Wyliczam wszystkie wątki w procesie za pomocą funkcji CreateToolhelp32Snapshot. Chciałbym uzyskać podstawowe informacje o stosach dla każdego wątku. Dokładniej chciałbym uzyskać adres dolny stosu i jeśli to możliwe, chciałbym uzyskać aktualny adres stosu. Zasadniczo jest to informacja wyświetlana za pomocą polecenia ~*k w WinDbg. Jak mogę uzyskać informacje o stosie z identyfikatora wątku lub UCHWYTU?Jak uzyskać informacje o stosie wątków w systemie Windows?

Odpowiedz

8

(Definicje można znaleźć here.)

dostać granice stosu:

THREAD_BASIC_INFORMATION basicInfo; 
NT_TIB tib; 

// Get TEB address 
NtQueryInformationThread(YOUR_THREAD_HANDLE, ThreadBasicInformation, &basicInfo, sizeof(THREAD_BASIC_INFORMATION), NULL); 
// Read TIB 
NtReadVirtualMemory(YOUR_PROCESS_HANDLE, basicInfo.TebBaseAddress, &tib, sizeof(NT_TIB), NULL); 
// Check tib.StackBase and tib.StackLimit 

Aby uzyskać wartość esp, po prostu użyj GetThreadContext.

+0

Thanks wj32! Przejrzę link, który podałeś. – user473750

0

O ile wiem, Toolhelp działa poprzez tworzenie kopii podstawowych informacji o hałdach, modułach, procesach i wątkach. Nie obejmuje to bloku TEB zawierającego dolny adres stosu. Myślę, że trzeba użyć innego API, API silnika debugger, który oferuje functions to examine the stacks

1

Łatwiejszy sposób, bez konieczności angażowania zestaw Windows kierowca jest jak tak:

NT_TIB* tib = (NT_TIB*)__readfsdword(0x18); 
size_t* stackBottom = (size_t*)tib->StackLimit; 
size_t* stackTop = (size_t*)tib->StackBase; 
1

__readfsdword() działa tylko dla bieżącego wątku. Tak więc wariant z NtQueryInformationThread() jest bardziej elastyczny.

Dodano kilka oświadczeń, które są pominięte w ntdll.h:

typedef enum _THREADINFOCLASS { 
    ThreadBasicInformation = 0, 
} THREADINFOCLASS; 

typedef LONG KPRIORITY; 

typedef struct _CLIENT_ID { 
    HANDLE UniqueProcess; 
    HANDLE UniqueThread; 
} CLIENT_ID; 
typedef CLIENT_ID *PCLIENT_ID; 

typedef struct _THREAD_BASIC_INFORMATION 
{ 
    NTSTATUS    ExitStatus; 
    PVOID     TebBaseAddress; 
    CLIENT_ID    ClientId; 
    KAFFINITY    AffinityMask; 
    KPRIORITY    Priority; 
    KPRIORITY    BasePriority; 
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; 
Powiązane problemy