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;
İlgili konular
- 1. iş parçacığı
- 2. iş parçacığı içinde yerel depolama iş parçacığı
- 3. İş parçacığı tanıtıcısı iş parçacığı tanıtıcısı
- 4. Tomcat iş parçacığı havuzundaki iş parçacığı sayısı nasıl artırılır?
- 5. Windowsda bash neden donuyor?
- 6. Yeni iş parçacığı kitaplığından TTask.WaitForAny'yi nasıl kullanabilirim?
- 7. Çoklu iş parçacığı nasıl ekleyebilirim?
- 8. İş parçacığı engellenmeden bekleyin. - Nasıl?
- 9. UI iş parçacığı üzerinde görev sürdürme, arka plan iş parçacığı
- 10. iş parçacığı afinitesi
- 11. Ana iş parçacığı
- 12. Django/sqlite3 "OperationalError: iş parçacığı yok" iş parçacığı üzerinde
- 13. Ayrı iş parçacığı
- 14. NSMutableDictionary iş parçacığı güvenliği
- 15. İş parçacığı güvenli Queue
- 16. Ayrı iş parçacığı içinde
- 17. 'sys.excepthook' ve iş parçacığı
- 18. UI'dan ayrı iş parçacığı
- 19. İş parçacığı, iki iş parçacığı arasındaki iletişim C#
- 20. CountdownTimer UI iş parçacığı güncelleştiren çalışan iş parçacığı içinde
- 21. Bir iş parçacığı veya iş parçacığı için bir DAO DAO?
- 22. Windows iş parçacığı havuzu ve CLR iş parçacığı havuzu
- 23. Qt: Arka plan iş parçacığı yenileme UI iş parçacığı
- 24. Hatalı iş parçacığı
- 25. Kinect ile iş parçacığı
- 26. Posix iş parçacığı öğretici
- 27. Python iş parçacığı dökümü
- 28. İş parçacığı durduruluyor
- 29. gdb - iş parçacığı günlüğü
- 30. WPF iş parçacığı C#
teşekkürler wj32! Sağladığınız bağlantıya bir göz atacağım. – user473750