2013-04-23 1 views
8

lire le code source de FastMM4, et notez cette fonction intéressanteGetThreadID dans l'assemblage

function GetThreadID: Cardinal; 
{$ifdef 32Bit} 
asm 
    mov eax, FS:[$24] 
end; 
{$else} 
begin 
    Result := GetCurrentThreadID; 
end; 
{$endif} 

Je l'ai testé et il fonctionne, donc ma question est toute explication pourquoi cela fonctionne?

+2

Et un autre [must see link] (http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html) sur TEB. [MS documentation] (http://msdn.microsoft.com/library/windows/desktop/ms686708) est inutile pour ce sujet. – OnTheFly

+0

Au contraire la documentation MS est excellente. Comme il s'agit d'une implémentation privée, la stratégie de documentation correcte pour les détails d'implémentation privée est de le garder privé. –

+0

@DoctorLai, je suis curieux, pourquoi appelez-vous la mémoire de lecture avec un déplacement ** magique ** un "effecient"? – OnTheFly

Répondre

8

Les points registre x86 FS au Thread Information Block dans Windows. La valeur dans TIB à l'adresse FS + 0x24 contient l'ID du thread en cours. En déplaçant la valeur vers eax, qui est utilisée pour transmettre la valeur de retour de la fonction, GetThreadID renvoie l'ID de thread en cours.

+0

alors, cela signifie que je peux faire la même chose avec FS + 0x20 qui renvoie l'ID de processus. cela doit être plus efficace que celui défini dans l'unité Windows. –

+3

Il peut être légèrement plus efficace, mais je suis ici pour vous dire que l'extraction de PID et TID n'est pas le goulot d'étranglement dans votre programme. –

+1

@David, En lisant les autres messages de OP, je ne pense pas que OP ait un goulot d'étranglement du tout. Il est plus dans l'optimisation extrême genre de chose ... peut-être :) – kobik

1

Cette méthode utilise les informations stockées dans les Thread Environment Block

+1

Exploit n'est pas le terme correct imho – Remko

+0

@Remko merci, a changé – MBo

Questions connexes