Получить ID процесса по хэндлу его потока

Тема в разделе "WASM.WIN32", создана пользователем cc, 15 окт 2006.

  1. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    В общем, проблема такая: я перехватываю в процессе ZwResumeThread, у него как известно передается ThreadHandle. Вот мне нужно по этому хэндлу определить id процесса, которому этот поток принадлежит. Пробовал ZwQueryInformationThread - почему-то не работает. В MSDN'е нашел GetProcessIdOfThread - вроде подходит, за одним исключением - она только под Win2003 :dntknw:, а пишется это дело под WinXP. Помогите, плиз!
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хотя бы код привёл.
    Вызывай с ThreadBasicInformation, там в ClientID есть PID.
     
  3. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Ну приблизительно так:
    Код (Text):
    1. #define THREAD_BASIC_INFO 0
    2. NTSTATUS __stdcall xZwResumeThread(HANDLE ThreadHandle, DWORD PrevSuspendCount)
    3. {
    4.     THREAD_BASIC_INFORMATION tbi;
    5.     DWORD RetLen, ProcessId=0;
    6.     NTSTATUS ns;
    7.     ns=ZwQueryInformationThread(ThreadHandle, THREAD_BASIC_INFO, &tbi, sizeof(tbi), &RetLen);
    8.     if(NT_SUCCESS(ns))
    9.     {
    10.         ProcessId=tbi.ClientId->UniqueProcess; // на этом месте процесс просто вырубается
    11.     }
    12.     Set_ZwResumeThread(false);
    13.     ns=__ZwResumeThread(ThreadHandle, PrevSuspendCount);
    14.     Set_ZwResumeThread(true);
    15.     return ns;
    16. }
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а как у тебя CLIENT_ID определена?
    Код (Text):
    1. typedef struct _CLIENT_ID {
    2.     ULONG UniqueProcess;
    3.     ULONG UniqueThread;
    4. } CLIENT_ID;
    По идее должно быть так, то есть ProcessId = tbi.ClientId.UniqueProcess.
     
  5. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    ну да, CLIENT_ID так определена. Почему tbi.ClientId.UniqueProcess? Там же PCLIENT_ID? Или я что-то путаю?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    путаешь.
    typedef struct _THREAD_BASIC_INFORMATION {
    NTSTATUS ExitStatus;
    PVOID TebBaseAddress;
    CLIENT_ID ClientId;
    KAFFINITY AffinityMask;
    KPRIORITY BasePriority;
    ULONG DiffProcessPriority;
    } THREAD_BASIC_INFORMATION;
     
  7. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> ProcessId=tbi.ClientId->UniqueProcess; // на этом месте процесс просто вырубается

    это не скомпилируется
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    скомпилируется(если структурой неправильной пользоваться)