API:HANDLE GetCurrentThreadId(void)在线程内调用有效。
线程外请参考API BOOL DuplicateHandle(一大堆参数:)

解决方案 »

  1.   

    瞎扯,GetCurrentThread还能过说的过去,竟然GetCurrentThreadId
    DuplicateHandle也不用你介绍,你无法在人家的线程里调用GetCurrentThread
      

  2.   

    没有办法根据thread id来得到thread handle
      

  3.   

    话别说得这么难听,自己没本事别说别人平庸。
    事实上,你可以用ntdll里的NtOpenThread来获得县城句柄。其声明如下:
    DWORD WINAPI NtOpenThread(HANDLE* phThread, // [out]
                              DWORD,            // [in], dwDesiredAccess
                              VOID*,            // [in], OPEN_PROCESS_THREAD struct
                              VOID*             // [in], CLIENT_ID struct
     );typedef struct _OPEN_PROCESS_THREAD {
    DWORD cbSize; // = 0x18
    DWORD dwReserved01;
    DWORD dwReserved02;
    BOOL bInheritHandle;
    DWORD dwReserved03;
    DWORD dwReserved04;
    }OPEN_PROCESS_THREAD, *POPEN_PROCESS_THREAD;typedef struct _CLIENT_ID 
    {
    HANDLE UniqueProcess;
    HANDLE UniqueThread;
    } CLIENT_ID, *PCLIENT_ID;HANDLE OpenThread( DWORD dwDesiredAccess,
                       BOOL bInheritHandle,
                       DWORD threadId,
                       DWORD processId )
    {
    OPEN_PROCESS_THREAD ot = {0};
    CLIENT_ID id = {0};
    HANDLE hThread = NULL; ot.cbSize = sizeof( ot );
    ot.bInheritHandle = (bInheritHandle!=0) ? 1 : 0;

    id.UniqueProcess = (HANDLE)processId;
    id.UniqueThread = (HANDLE)threadId; DWORD error = NtOpenThread( &hThread, dwDesiredAccess, &ot, &id );
    return hThread;
    }
    实际上,NtOpenThread的调用参数和NtOpenProcess的完全一样,你也可以用这个方法直接调用NtOpenProcess。
      

  4.   

    高,实在是高。
    能否告知这些资料是从何处获得?我的MSDN中可没有NTOpenThread的帮助。
    我现在用的是Windows2000,我还想知道如何使写出来的代码在Window9x中也能运行(哪里没有ntdll吧,这一次加50分)
      

  5.   

    这是未公开的函数,msdn里不可能有。我的方法是用Softice在NtOpenThread上设断点,发现WaitForDebugEvent经常调用它,仔细分析分析WaitForDebugEvent调用时的参数结构就出来了。
    windows9x下你可以自己试试。Matt在"Windows95 System programming Secrets"一书里说thread id和一个常数(每次开机不同)XOR后可以得到tdb(thread database)。你可以看看他的书。
      

  6.   

    Thanks, 不过可惜我已经很长时间不使用9x了