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?
7
A
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
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;
teşekkürler wj32! Sağladığınız bağlantıya bir göz atacağım. – user473750