मैं CreateToolhelp32Snapshot
फ़ंक्शन के माध्यम से प्रक्रिया में सभी धागे की गणना करता हूं। मैं प्रत्येक थ्रेड के लिए कुछ बुनियादी ढेर जानकारी प्राप्त करना चाहता हूं। अधिक विशेष रूप से मैं स्टैक नीचे पता प्राप्त करना चाहता हूं और यदि संभव हो तो मैं वर्तमान स्टैक टॉप एड्रेस प्राप्त करना चाहता हूं। असल में यह WinDbg में ~*k
कमांड के साथ प्रदर्शित जानकारी है। तो मैं थ्रेड की आईडी या हैंडल से स्टैक जानकारी कैसे प्राप्त कर सकता हूं?विंडोज पर थ्रेड स्टैक जानकारी कैसे प्राप्त करें?
7
A
उत्तर
8
(परिभाषाएं here पाया जा सकता है।)
प्राप्त करने के लिए ढेर सीमाओं:
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
का मूल्य प्राप्त करने के लिए esp
, बस GetThreadContext
का उपयोग करें।
0
जैसा कि मुझे पता है, टूलहेल्प ढेर, मॉड्यूल, प्रक्रियाओं और धागे पर मूलभूत जानकारी की एक प्रति बनाकर काम करता है। इसमें टीईबी ब्लॉक शामिल नहीं है जिसमें स्टैक नीचे पता है। मैं आपको एक और एपीआई का उपयोग करने की जरूरत है, डिबगर इंजन एपीआई, जो प्रदान करता है functions to examine the stacks
1
विंडोज ड्राइवर किट शामिल करने के लिए बिना एक आसान तरीका के रूप में तो यह है:
NT_TIB* tib = (NT_TIB*)__readfsdword(0x18);
size_t* stackBottom = (size_t*)tib->StackLimit;
size_t* stackTop = (size_t*)tib->StackBase;
1
__readfsdword() केवल वर्तमान थ्रेड के लिए काम करता है। तो, NtQueryInformationThread() के साथ संस्करण अधिक लचीला है।
कुछ घोषणाओं जो 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;
धन्यवाद wj32! मैं आपके द्वारा प्रदान किए गए लिंक पर एक नज़र डालेगा। – user473750