Получить PID потока, проблема с указателями.

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

  1. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Уважаемые, проблема.
    Есть структура:
    Код (Text):
    1. typedef struct _CLIENT_ID
    2. {
    3.      PVOID UniqueProcess;
    4.      PVOID UniqueThread;
    5. } CLIENT_ID, *PCLIENT_ID;
    Есть функция проверки ИД процесса-хозяина потока:
    Код (Text):
    1. NTSTATUS NewNtTerminateThread (
    2. IN HANDLE ThreadHandle,
    3. IN NTSTATUS ExitStatus ) {
    4.     PVOID ProcessId;
    5. THREAD_BASIC_INFORMATION threadbuff;
    6. NtQueryInformationThread(ThreadHandle,0,&threadbuff,sizeof(THREAD_BASIC_INFORMATION),0);
    7. ProcessId=threadbuff.ClientId.UniqueProcess;
    8. };
    В чем проблема:мне нужно узнать ИД процесса (к примеру, 443). Указатель на ИД лежит в UniqueProcess. Как мне найти само значение, на которое ссылается указатель? Пытался делать так:
    Код (Text):
    1. ULONG id=*ProcessId;
    Не то.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
  3. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    P-это ведь Pointer, то бишь указатель.
     
  4. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Вернее, как. Вы путаетесь. Есть структура THREAD_BASIC_INFORMATION. В ней-структура ClientId. А вот в самой клиентИД есть два поля:UniqueProcess+UniqueThread. Так вот, UniqueProcess-указатель на ИД процесса, разве нет? Как тогда понимать PVOID?
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    я путаюсь?)))

    выведи значение этого "указателя" и посмотри равно ли оно значению идентификатору потока, или является указателем на него... я тебе в хедере напишу (для 32-битной ос):
    Код (Text):
    1. typedef struct _CLIENT_ID
    2. {
    3.      DWORD UniqueProcess;
    4.      DWORD UniqueThread;
    5. } CLIENT_ID, *PCLIENT_ID;
    тебе от этого будет легче? для x86 - это 32-битное число, для x64 - это 64-битное число, как и тип PVOID... так что все правильно...

    если хочешь обращаться с ним как с указателем, делай это так:
    Код (Text):
    1. ULONG id=*(ULONG*)ProcessId;
    и приятных бсодов тебе)))
     
  6. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Ладно, простите, я путаюсь) А БСОДы уже надоели. Так как правильно?
    ProcessId=threadbuff.ClientId.UniqueProcess;
    Так, что ли?