2010-10-12 10 views
7

Bir işlemde tüm konuları CreateToolhelp32Snapshot işleviyle numaralandırıyorum. Her iş parçacığı için bazı temel yığın bilgileri almak istiyorum. Daha özel olarak yığın alt adresi almak istiyorum ve eğer mümkünse mevcut yığın üst adresi almak istiyorum. Temel olarak bu, WinDbg'de ~*k komutuyla görüntülenen bilgidir. Peki yığın bilgisini iş parçacığı kimliğinden veya HANDLE'dan nasıl edinebilirim?Windows'da iş parçacığı yığını nasıl edinilir?

cevap

8

(Tanımlar here bulunabilir.)

almak için yığın sınırları:

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 

değerini almak için esp, sadece GetThreadContext kullanın.

+0

teşekkürler wj32! Sağladığınız bağlantıya bir göz atacağım. – user473750

0

Bildiğim kadarıyla, Toolhelp yığınlar, modüller, işlemler ve iş parçacıkları hakkında temel bilgilerin bir kopyasını yaparak çalışır. Bu yığın alt adresini içeren TEB bloğunu içermez. Ben başka bir API kullanmak gerektiğini düşünüyorum sunmaktadır ayıklayıcı motoru API functions to examine the stacks

1

, Windows Driver Kit dahil etmek zorunda kalmadan daha kolay bir yolu olarak böyledir:

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

__readfsdword() yalnızca geçerli iş parçacığı için çalışır. Yani, NtQueryInformationThread() ile varyantı daha esnektir.

ntdll.h cevapsız bazı bildirimleri Eklendi:

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; 
İlgili konular