2013-04-23 3 views
8

에서 나는 FastMM4가의 소스 코드를 읽고,이 흥미로운 기능 내가 테스트 한 GetThreadID 조립

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

을 발견하고, 그렇게 내 질문이 작동 왜 어떤 설명이 작품?

+2

TEB의 또 다른 [링크가 있어야합니다] (http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html). [MS 설명서] (http://msdn.microsoft.com/library/windows/desktop/ms686708)는이 주제에서 쓸모가 없습니다. – OnTheFly

+0

반대로 MS 설명서가 우수합니다. 이것이 개인 구현이기 때문에 개인 구현 세부 사항에 대한 올바른 문서화 전략은이를 비공개로 유지하는 것입니다. –

+0

@DoctorLai, 궁금합니다. 왜 마법에 걸린 기억을 "효과적"이라 부르는 기억을 불러내시겠습니까? – OnTheFly

답변

8

는 x86 레지스터 FS 포인트에 저장된 정보를 사용합니다. 주소 FS + 0x24에있는 TIB의 값에는 현재 스레드의 ID가 들어 있습니다. 값을 함수 반환 값을 전달하는 데 사용되는 eax로 이동하면 GetThreadID가 현재 스레드 ID를 반환합니다.

+0

이 변경되었으므로 프로세스 ID를 반환하는 FS + 0x20과 동일한 작업을 수행 할 수 있습니다. Windows 단위에서 정의 된 것보다 더 효율적이어야합니다. –

+3

다소 효율적일 수 있지만 PID 및 TID를 가져 오는 것이 프로그램의 병목 현상이 아니라는 점을 알려드립니다. –

+1

@David, OP의 다른 게시물 읽기, 나는 OP에 병목 현상이 전혀 없다고 생각합니다. 그는 아마도 극단적 인 최적화 종류의 것입니다. 아마도 :) – kobik