Код (Text): bool isGuiThread (PETHREAD Thread) { return (Thread->Tcb.ServiceTable != KeServiceDescriptorTable); }
А нет ли решения более подходящего для разных платформ? Все-таки ETHREAD отличается мезжду разными платформами.
Найти оффсет KTHREAD::ServiceTable можно весьма легко и универсально. Для этого при старте драйвера в заведомо не-гуйном потоке (или создать новый не-гуйный поток через PsCreateSystemThread) надо начать прочесывать текущий KTHREAD (PsGetCurrentThread) и найти там указатель на KeServiceDescriptorTable. Запомнить смещение. И дальше для других KTHREAD по этому смещению чекать значение указателя.
Попробуй так: Код (Text): PVOID pWin32Thread = PsGetThreadWin32Thread (pThread); BOOL bGuiThread = (pWin32Thread && pWin32Thread != KeServiceDescriptorTable);
x64 Ммм.. разве в этом поле лежит указатель на таблицу сервисов? По-моему там указатель на структуру потока win32k.. А вот проверить на != 0 это хорошая идея.
Ну проверка такая в ядре есть, значит следует предусмотреть это и в своём коде. Хотя допускаю, что в современных ядрах это уже не нужно, не проверял.