Как проверить является ли поток GUI потоком

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 26 янв 2010.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Есть ли простой способ проверить, является ли текущий поток GUI?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. bool isGuiThread (PETHREAD Thread)
    2. {
    3.   return (Thread->Tcb.ServiceTable != KeServiceDescriptorTable);
    4. }
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    А нет ли решения более подходящего для разных платформ? Все-таки ETHREAD отличается мезжду разными платформами.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Найти оффсет KTHREAD::ServiceTable можно весьма легко и универсально.
    Для этого при старте драйвера в заведомо не-гуйном потоке (или создать новый не-гуйный поток через PsCreateSystemThread) надо начать прочесывать текущий KTHREAD (PsGetCurrentThread) и найти там указатель на KeServiceDescriptorTable. Запомнить смещение. И дальше для других KTHREAD по этому смещению чекать значение указателя.
     
  5. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    а так оно иесть
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Попробуй так:

    Код (Text):
    1. PVOID pWin32Thread = PsGetThreadWin32Thread (pThread);
    2. BOOL bGuiThread = (pWin32Thread && pWin32Thread != KeServiceDescriptorTable);
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    x64
    Ммм.. разве в этом поле лежит указатель на таблицу сервисов?
    По-моему там указатель на структуру потока win32k..
    А вот проверить на != 0 это хорошая идея.
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну проверка такая в ядре есть, значит следует предусмотреть это и в своём коде. Хотя допускаю, что в современных ядрах это уже не нужно, не проверял.