Получить PID по хендлу потока

Тема в разделе "WASM.NT.KERNEL", создана пользователем n2, 7 сен 2011.

Статус темы:
Закрыта.
  1. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Уважаемые гуру, нужна ваша помощь. Перехватываю функции NtOpenThread и NtTerminateThread, получаю хендл потока. Теперь мне нужно получить либо хендл, либо ИД процесса, которому принадлежит поток. Пробую делать так:
    Код (Text):
    1. ULONG GetTid (HANDLE ThreadHandle) {
    2. THREAD_BASIC_INFORMATION tbi;
    3. NTSTATUS status;
    4. status = NtQueryInformationThread(
    5.         ThreadHandle,
    6.         ThreadBasicInformation,
    7.         &tbi,
    8.         sizeof(tbi),
    9.          NULL);
    10. return tbi.ClientId.UniqueProcess;
    11. };
    По идее, функция должна возвращать мне Id процесса-хозяина потока, но что-то не работает. ThreadHandle получаю из NtTerminateThread или NtOpenThread.
    Код (Text):
    1. Далее я проверяю, не равен ли tbi.ClientId.UniqueProcess PID-у моего процесса.
    2. NTSTATUS NewNtOpenThread(
    3. OUT PHANDLE             ThreadHandle,
    4.   IN ACCESS_MASK          AccessMask,
    5.   IN POBJECT_ATTRIBUTES   ObjectAttributes,
    6.   IN PCLIENT_ID           ClientId ) {
    7.       if (GetTid(ThreadHandle)==(HANDLE)480) {
    8.  return STATUS_ACCESS_DENIED;
    9.       } else
    10. return TrueNtOpenThread(ThreadHandle, AccessMask, ObjectAttributes, ClientId);
    11. };
    ЧЯДНТ?
    Спасибо!
     
  2. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Если ваш код выполняется в контексте нужного вам потока\процесса то PsGetCurrentProcessId/PsGetCurrentThreadId. Конечно, если речь про Kernel mode.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    1. Тип возвращаемого значения GetTid() отличается от используемого для ID потока.
    2. Функцию GetTid() следует вызывать после того, как хендл получен из оригинального обработчика.
    3. В функцию GetTid() нужно передавать хендл, а не адрес переменной, в которую его значение будет записано.
    4. Если требуется заблокировать доступ к потоку, следует использовать ID потока из параметра ClientId, там он уже готовый.

    [modnote=x64]Тему закрываю, обсуждалось много раз, ошибки указаны выше, часть из них относится к языку C.[/modnote]
     
Статус темы:
Закрыта.