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?
7
A
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
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
- 1. Jak uzyskać informacje o systemie w PHP?
- 2. Jak mogę uzyskać informacje o systemie/sprzęcie poprzez Javę?
- 3. Jak programowo uzyskać informacje o oddziałach w systemie TFS?
- 4. Uzyskaj informacje o sprzęcie w systemie Android?
- 5. Drupal uzyskać informacje o module?
- 6. Informacje o sieci Windows Phone 8
- 7. Jak uzyskać informacje o aktywności z IDialogContext
- 8. C#: uzyskać informacje o komputerze w domenie
- 9. uzyskać informacje o adnotacji w czasie wykonywania
- 10. Informacje o procesie NODEJS
- 11. Jak uzyskać uruchamianie aplikacji w systemie Windows?
- 12. Jak uzyskać szczegółowe informacje o procesie z jego pid
- 13. Jak uzyskać informacje o środowisku wykonawczym .Net Core
- 14. Zablokuj informacje o urządzeniu bez montowania (w systemie Linux)
- 15. Jak uzyskać informacje o dysku według woluminu id
- 16. uzyskać informacje o certyfikacie ssl - .net
- 17. Jak uzyskać szczegółowe informacje o urządzeniu w wersji szybkiej
- 18. Jak uzyskać informacje o typie w interaktywnym Ocaml?
- 19. delegat akcji. Jak uzyskać informacje o metodach wywołanych w delegacie?
- 20. Jak uzyskać informacje o sesji w Spring MVC 3
- 21. Jak uzyskać informacje o indeksie i właścicielu tabeli w Oracle?
- 22. Jak mogę uzyskać informacje o procesorze w .net?
- 23. Jak uzyskać aktualne informacje o trasach w OnActionExecuting
- 24. Planowanie wątków w systemie UNIX
- 25. Jak mogę uzyskać informacje o wersji zespołu wykonawczego w aplikacji Sklepu systemu Windows?
- 26. Pytanie o zdarzenia w systemie Windows
- 27. Instrument na stosie Windows 7 Bluetooth
- 28. Jak sortować informacje o wersji
- 29. Zapobieganie wiadomościom o awariach w systemie Windows
- 30. jak zdobyć informacje o sklepie w Magento?
Thanks wj32! Przejrzę link, który podałeś. – user473750