首页
社区
课程
招聘
[求助]关于线程名称,另问如何获得线程TIB?
发表于: 2010-7-7 20:00 5622

[求助]关于线程名称,另问如何获得线程TIB?

2010-7-7 20:00
5622
static tagXTIB* GetTIB()
{
tagXTIB* pTib;
__asm
{
MOV EAX , FS:[18h]
MOV pTib , EAX
}
return pTib;
}
获取线程的名称
static LPCTSTR GetThreadName()
{
                // Grab the TIB.
                tagXTIB * pTib = GetTIB();

                return (LPCTSTR)pTib->pvArbitrary;
}
设置线程的名称
        static BOOL SetThreadName(LPCTSTR szName)
        {
                // Grab the TIB.
                tagXTIB * pTib = GetTIB();

                // If someone has already written to the arbitrary field, I don't
                // want to be overwriting it.
                if (pTib->pvArbitrary != NULL)
                        return FALSE;

                // Nothing's there.  Set the name.
                pTib->pvArbitrary = (void*)szName;

                return TRUE;
        }
微软设置线程名称,仅仅能通过异常设置,让调试器VC或windbg知道名称,无法获取这个名称。
必须和前面函数联合使用。
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
...{
  THREADNAME_INFO info;
  ...{
    info.dwType = 0x1000;
    info.szName = szThreadName;
    info.dwThreadID = dwThreadID;
    info.dwFlags = 0;
  }
  __try
  ...{
    RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
  }
  __except (EXCEPTION_CONTINUE_EXECUTION)
  ...{
  }
}
获取线程名称,获取的是函数static BOOL SetThreadName(LPCTSTR szName)设置名称。
char* GetThreadName(void)
...{
    char* pszName=NULL;
    __asm...{
        mov eax, fs:[0x18]    //    Locate the caller's TIB
        mov eax, [eax+0x14]    //    Read the pvArbitary field in the TIB
        mov [pszName], eax    //    pszName = pTIB->pvArbitary
    }
    return pszName ? pszName : "Win32 Thread";
}

DW(@TIB+0x24)  4644    线程Id
(char*)(DW(@TIB+0x14)) 名称

现在问题是,如何通过threadid,threadhandle获得TIB,
我想遍历某进程中 几个线程的名称,但是无法通过threadid获得TIB,就无法获取名称。
求论坛高手解答。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
2
NTSYSAPI
NTSTATUS
NTAPI
NtQueryInformationThread(

  IN HANDLE               ThreadHandle,
  IN THREAD_INFORMATION_CLASS ThreadInformationClass,
  OUT PVOID               ThreadInformation,
  IN ULONG                ThreadInformationLength,
  OUT PULONG              ReturnLength OPTIONAL );
2010-7-7 20:15
0
雪    币: 217
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢1楼。
下面补充函数使用例子
typedef long (__stdcall *NtQueryInformationThread_PROC)(HANDLE thread,
int infoclass, void *buf, long size, long *used);
typedef struct _THREAD_BASIC_INFORMATION {
unsigned long ExitStatus;
void *TebBaseAddress;
ULONG UniqueProcessId;
ULONG UniqueThreadId;
unsigned long AffinityMask;
unsigned long BasePriority;
unsigned long DiffProcessPriority;

} THREAD_BASIC_INFORMATION;

//-----------------------------------------------------------------------------
unsigned long GetThreadId(HANDLE hThread)
{
unsigned long nThId = 0;
THREAD_BASIC_INFORMATION tbi;
HMODULE hLib = 0L;
NtQueryInformationThread_PROC hProc = 0L;
long used = 0, ret = 0;

hLib = LoadLibrary("ntdll.dll");
if (hLib != 0L)
{
hProc = (NtQueryInformationThread_PROC) GetProcAddress(hLib,
"NtQueryInformationThread");

if (hProc != 0L)
{
ret = hProc(hThread, 0, &tbi, sizeof(THREAD_BASIC_INFORMATION),
&used);
if (ret == 0)
{
   tbi.TebBaseAddress  此处为tib地址
nThId = tbi.UniqueThreadId;
}
else DEBUG_BREAK;
}
else DEBUG_BREAK;

FreeLibrary(hLib);
}
else DEBUG_BREAK;

return nThId;
}
2010-7-7 22:38
0
游客
登录 | 注册 方可回帖
返回
//