Je énumère tous les threads dans un processus via la fonction CreateToolHelP32Snapshot code>. Je voudrais obtenir des informations de base de la pile pour chaque fil. Plus précisément, j'aimerais obtenir l'adresse du bas de la pile et si possible, j'aimerais obtenir l'adresse actuelle de la pile. Fondamentalement, il s'agit des informations affichées avec la commande
~ * k code> dans windbg. Alors, comment puis-je obtenir les informations de pile à partir de l'ID ou de la poignée du thread? P>
5 Réponses :
AS que je sais que je sais, ToolHelP fonctionne en effectuant une copie des informations de base sur des tas, des modules, des processus et des threads. Cela n'inclut pas le bloc TEB qui contient l'adresse du bas de la pile. Je pense que vous devez utiliser une autre API, l'API du moteur de débogueur, qui offre fonctionne pour examiner les piles p>
(les définitions peuvent être trouvées ici .)
Pour obtenir des limites de pile: p> < Pré> xxx pré>
Pour obtenir la valeur de ESP code>, utilisez simplement
getthreadcontext code>. p> p> p>
Merci wj32! Je vais regarder le lien que vous avez fourni.
Un moyen plus facile sans avoir à impliquer le kit de pilote Windows est aussi vrai:
NT_TIB* tib = (NT_TIB*)__readfsdword(0x18); size_t* stackBottom = (size_t*)tib->StackLimit; size_t* stackTop = (size_t*)tib->StackBase;
__ readfsdword () ne fonctionne que pour le fil actuel. Donc, la variante avec NTQuéryInformationthread () est plus flexible.
Ajout de certaines déclarations qui sont manquées dans ntdll.h: p>
Voici un moyen facile pour le fil actuel fort> (version portable Win32 x86 / x64): Remarque: Pour plus de détails, voir Win32 tib . P> p> StackLimit code> << Code> Stackbase Code> (comme la pile grandit vers le bas). p>