Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› получить ThreadID имея на руках Thread Handle
Посл.ответ Сообщение


Ранг: 122.3 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 июля 2006 00:42 · Поправил: intty
· Личное сообщение · #1

собссно сабж.

да, я чесно полез в msdn, нашел Process and Thread Functions, нашел чудесную функцию:

DWORD WINAPI GetThreadId(
HANDLE Thread
);


но обломался, она только начиная с Windows Server 2003, а мне нужно XP хотябы.
есть еще GetProcessIdOfThread, тоже бы сгодилась, но она опять же начиная с WS2003

ладно, я нашел kernel32.dll от WS2003 и посмотрел как она реализована, там вызывается NtQueryInformationThread, но она везде по разному документирована, даже число параметров разное, короче запарился уже, хотя чувствую через нее это делается.

короче если у кого какие есть идеи, или кто кускок кода подкинет, или мыслю какую, буду благодарен.



Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 23 июля 2006 00:46
· Личное сообщение · #2

насколько я знаю штатно никак. При написании дебаггеров при создании нити просто приходится сохранять пару хендл-ид в свое таблице по которой потом искать.




Ранг: 122.3 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 июля 2006 00:54
· Личное сообщение · #3

infern0 пишет:
насколько я знаю штатно никак.

если так, то обидно. может еще у народа мысли будут.
пойду посплю пока. может чего дельное приснится. ;]



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 июля 2006 01:09
· Личное сообщение · #4

intty

Вроде бы можно с помощью CreateToolhelp32Snapshot и последующего перечисления трэдов. Должно работать везде, кроме NT 4.0




Ранг: 122.3 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 июля 2006 08:52
· Личное сообщение · #5

Stiver
неет. все не так просто. функции toolhelp позволяют определить принадлежность треда к процессу, если известен Thread ID. А про Thread Handle в структурах THREADENTRY32 и PROCESSENTRY32 не слова.
Я даже написал функцию, которая определяет имя процесса по Thread ID.
Теперь этот Thread ID мне и нужно получить, а у меня только хендл этого потока, мать его так.



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 23 июля 2006 09:59
· Личное сообщение · #6

intty

А не получится использовать GetWindowThreadProcessId ?

The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

Syntax
DWORD GetWindowThreadProcessId(

HWND hWnd,
LPDWORD lpdwProcessId
);

Parameters
hWnd
[in] Handle to the window.
lpdwProcessId
[out] Pointer to a variable that receives the process identifier. If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; otherwise, it does not.

Return Value

The return value is the identifier of the thread that created the window.

Handle to the window я получал через FindWindow

-----
Research is my purpose




Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 июля 2006 14:20
· Личное сообщение · #7

intty
А про Thread Handle в структурах THREADENTRY32 и PROCESSENTRY32 не слова.

В THREADENTRY32 есть ThreadID, к нему можно получить Thread Handle через OpenThread. Вот только вопрос, можно ли сравнить два хэндла? То есть как-то определить, показывают ли они на один и тот же объект (в данном случае трэд).




Ранг: 122.3 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 июля 2006 19:16
· Личное сообщение · #8

Error_Log
увы хэндл окна мне не будет известен. да и окна есть не у всех. а мне нужно для всех.
так что наверное эта ф-я не поможет.

Stiver пишет:
равнить два хэндла? То есть как-то определить, показывают ли они на один и тот же объект

интересно. в принципе можно подумать.

я еще вот здесь решение нашел, через NtQueryInformationThread.
hxxps://secure.codeproject.com/win32/Remote.asp?print=true

короче буду пробовать.
всем спасибо за участие, вопрос пока открыт.




Ранг: 122.3 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 июля 2006 21:03
· Личное сообщение · #9

после некоторых мудоханий, удалось это скомпилировать и слинковать

В общем этот код реально работает.


DWORD WINAPI GetThreadIdNT(HANDLE hThread)
{
NTSTATUS Status;
THREAD_BASIC_INFORMATION tbi;
HANDLE hDupHandle;
HANDLE hCurrentProcess;

hCurrentProcess = GetCurrentProcess();

// Use DuplicateHandle() to get THREAD_QUERY_INFORMATION access right
if (!DuplicateHandle(hCurrentProcess,
hThread,
hCurrentProcess,
&hDupHandle,
THREAD_QUERY_INFORMATION,
FALSE,
0))
{
SetLastError(ERROR_ACCESS_DENIED);
return 0;
}

Status = NtQueryInformationThread(hDupHandle,
ThreadBasicInformation,
&tbi,
sizeof(tbi),
NULL);

CloseHandle(hDupHandle);

if (!NT_SUCCESS(Status))
{
SetLastError(RtlNtStatusToDosError(Status));
return 0;
}

// Return TID
return tbi.ClientId.UniqueThread;
}


в принципе вопрос исчерпан.


 eXeL@B —› Программирование —› получить ThreadID имея на руках Thread Handle
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати