How to Get Handle of a thread given the thread id? API:HANDLE GetCurrentThreadId(void)在线程内调用有效。线程外请参考API BOOL DuplicateHandle(一大堆参数:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 瞎扯,GetCurrentThread还能过说的过去,竟然GetCurrentThreadIdDuplicateHandle也不用你介绍,你无法在人家的线程里调用GetCurrentThread 没有办法根据thread id来得到thread handle 话别说得这么难听,自己没本事别说别人平庸。事实上,你可以用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。 高,实在是高。能否告知这些资料是从何处获得?我的MSDN中可没有NTOpenThread的帮助。我现在用的是Windows2000,我还想知道如何使写出来的代码在Window9x中也能运行(哪里没有ntdll吧,这一次加50分) 这是未公开的函数,msdn里不可能有。我的方法是用Softice在NtOpenThread上设断点,发现WaitForDebugEvent经常调用它,仔细分析分析WaitForDebugEvent调用时的参数结构就出来了。windows9x下你可以自己试试。Matt在"Windows95 System programming Secrets"一书里说thread id和一个常数(每次开机不同)XOR后可以得到tdb(thread database)。你可以看看他的书。 Thanks, 不过可惜我已经很长时间不使用9x了 求给个思路,设计性问题 多个USB端口插入多个U盘,如果知道端口和U盘的对应关系 求将两个数组关联的最好方法 在ListCtrl 的第一列显示多个图标,怎么实现啊??? 如何测试 HTTP 代理服务器的速度? 关于全局变量 连续碰壁头破血流,惨那!! 请问如何在dos下可以产生1毫秒的中断,感谢啊!'200分向送,感激万分! 如何动态使用DBGrid? 如何快速查到一个MFC类的源码。 我原来用Delphi做数据库,现在改用VC++6 && SQL 了,感觉很好,没什么麻烦的,比Delphi好多了,大家快改用VC做数据库吧 有c基础,vc学习一个月,要用vc做毕业设计
DuplicateHandle也不用你介绍,你无法在人家的线程里调用GetCurrentThread
事实上,你可以用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。
能否告知这些资料是从何处获得?我的MSDN中可没有NTOpenThread的帮助。
我现在用的是Windows2000,我还想知道如何使写出来的代码在Window9x中也能运行(哪里没有ntdll吧,这一次加50分)
windows9x下你可以自己试试。Matt在"Windows95 System programming Secrets"一书里说thread id和一个常数(每次开机不同)XOR后可以得到tdb(thread database)。你可以看看他的书。