7
votes

Getthread sur les systèmes Pre-Vista?

Apportthread est une API Vista. Comment puis-je obtenir une pièce d'identité d'un fil sur les systèmes PRE VISTA?


0 commentaires

3 Réponses :


3
votes

Si vous pouvez en quelque sorte faire le thread en question appelez GetCurrentthreadid et stockez quelque part, vous pouvez lire le résultat.


1 commentaires

Cela a fonctionné le mieux pour moi, appelant simplement que sur la création et le stocker avec ThRandle! Merci



6
votes

Il y a quelques options:

  • Lorsque vous appelez Createthread , vous obtenir la poignée.
  • Vous pouvez appeler GetCurrentTheadid pour obtenir L'ID du thread actuel.
  • Vous pouvez utiliser thread32first / < un href = "http://msdn.microsoft.com/en-us/library/ms686731%28vs.85%29.aspx" rel = "noreferrer"> thread32nexgard pour énumérer des threads.

11 commentaires

Dans le cas de dénombrement, existe-t-il un moyen de déterminer lequel des threads énumérés correspond à une poignée que vous avez?


Vous passez la poignée de votre processus actuel à CreeToolHelP32Snapshot avec le drapeau TH32CS_SNAPMODULE. Cela énumérera simplement des threads dans votre processus.


Mais cela ne vous laissera pas dire la différence entre les threads dans votre module, sera-t-il?


J'ai rencontré le même problème. La structure THIPENTRY32 n'a que l'ID de thread, pas la poignée. Quant à MotuleEntry32, selon MSDN en ce qui concerne son membre TH32MODULEID: "Ce membre n'est plus utilisé et est toujours défini sur un"


Eh bien, vous obtenez la poignée de fil pour chaque thread de votre module. Vous pouvez l'utiliser contre ceux connus (c'est-à-dire: vous avez créé), puisque vous connaissez leur poignée (à condition que vous les avez sauvegardés) ... Mais cela vous donne le filetage complet pour chaque fil dans le cadre de la structure filtrée32 , qui est l'équivalent direct d'utiliser getthread. Voir msdn.microsoft.com/en-us/library /ms686735%28vs.85%29.aspx


Bien sûr, vous pouvez obtenir une poignée de l'énumération, mais comment pouvez-vous comparer deux poignées de thread que vous avez provenant de différentes sources?


@sold: Vous pouvez obtenir un filetage DWORD de l'énumération. Vous pouvez obtenir la poignée du thread de l'ID de thread en utilisant OPTHREAD. Presque toutes les fonctions du fil fonctionnent avec l'un de ces deux éléments, de sorte qu'entre énumérant les fils de votre procédé et convertir aux poignées si nécessaire, vous pouvez faire tout ce que vous pourriez faire avec GetTHeAID à Vista.


Voir Opthread pour plus de détails sur la récupération d'une poignée du membre filtryry32.th32HeAide: msdn.microsoft.com/en-us/library/ms684335%28vs.85%29.aspx


@Reed, mais cela n'aide pas si vous avez une poignée et que vous souhaitez obtenir l'ID de thread.


@Bdonlan: Non, ça fait. Vous devez énumérer tous vos threads dans votre processus, jusqu'à ce que vous trouviez la poignée correspondante (obtenir l'identifiant du thread, convertir en manche), puis utiliser son identifiant. C'est moche, mais ça marche. Vista le rend facile.


Oui, mais Comment correspondez-vous à la poignée? Afaics, une fois que vous avez deux poignées de fil, vous n'avez aucune idée s'ils se réfèrent au même fil.



3
votes

Si le thread en question pénètre fréquemment d'un état d'attente alertable, vous pouvez l'envoyer un APC avec QueueUserAPC ; Le gestionnaire APC peut ensuite appeler GetCurrentTheadid et communiquer Le résultat retour à l'appelant en utilisant la méthode que vous aimez.

Vous pouvez également le faire avec des fonctions NT non documentées. Utilisation d'un NTQueryInformationthread () sur le ThreadBasicinformation classe vous donnera l'ID de thread Dans le Structure renvoyée . Un exemple peut être trouvé dans source de vin . Cependant, je ne sais pas quelles versions de Windows disponibles sur - Gardez à l'esprit que ces fonctions sans papiers peuvent changer à tout moment, il est donc préférable de les tester sur les anciennes versions de Windows qui vous intéressent et utilisez simplement GetTHeadID. () Où il est disponible.

Notez que ces fonctions sans papiers ne peuvent être consultées que par LoadLibrary () et GetProcAddress () sur NTDLL; Ils n'ont aucune bibliothèque d'importation. Selon MSDN , déclarations pour les structures de données peut être trouvé dans winternl.h , mais sinon, les définissez simplement vous-même sur la base des liens NTInternals ci-dessus.


1 commentaires

Celui qui est intéressé ici est comment on peut appeler ntqueryinformationthread : snip2code.com/snippet/85443/...