> известно что по ID потока можно получить HANDLE, for > example > > DWORD dwThreadId; > ................. > HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, TRUE, > dwThreadId); > > теперь надо обратное, т.е. по HANDLE найти ID > можно конечно по процессу пройтись и перебирать все потоки, > пока не наткнешся на нужный. > Есть какие нить предложения - более короткий путь. > > P.S. HANDLE - не текущего потока, т.е. вариант > GetCurrentThreadId() сразу отпадает. > > Thanks.
для WinNt/2k можно попробовать вот это
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationThread(
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
typedef enum _THREADINFOCLASS { // Query Set
ThreadBasicInformation, // 0 Y N
ThreadTimes, // 1 Y N
ThreadPriority, // 2 N Y
ThreadBasePriority, // 3 N Y
ThreadAffinityMask, // 4 N Y
ThreadImpersonationToken, // 5 N Y
ThreadDescriptorTableEntry, // 6 Y N
ThreadEnableAlignmentFaultFixup, // 7 N Y
ThreadEventPair, // 8 N Y
ThreadQuerySetWin32StartAddress, // 9 Y Y
ThreadZeroTlsCell, // 10 N Y
ThreadPerformanceCount, // 11 Y N
ThreadAmILastThread, // 12 Y N
ThreadIdealProcessor, // 13 N Y
ThreadPriorityBoost, // 14 Y Y
ThreadSetTlsArrayAddress, // 15 N Y
ThreadIsIoPending, // 16 Y N
ThreadHideFromDebugger // 17 N Y
} THREADINFOCLASS;
typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0
NTSTATUS ExitStatus;
PNT_TIB TebBaseAddress;
CLIENT_ID ClientId;
KAFFINITY AffinityMask;
KPRIORITY Priority;
KPRIORITY BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
typedef struct _CLIENT_ID {
ULONG UniqueProcessId;
ULONG UniqueThreadId;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;
|