Собственно сабж: - как поределить какому процессу принадлежит поток? - как получить дерево процессов (как в ProcessExplorer)?
Функция IoThreadToProcess(). Если по ID, то сначала получить адрес объекта-потока вызовом PsLookupThreadByThreadId(). Если по хендлу, тогда сперва вызов ObReferenceObjectByHandle(). В обоих случаях не забыть потом про ObDereferenceObject(). Сервис NtQuerySystemInformation() с классом SystemProcessesInformation, получишь полный список процессов и их потоков, ну а дальше по идентификаторам сопоставить уже не проблема. Это всё обсуждалось много раз, есть поиск на этом форуме, есть поиск на RSDN, есть Google, в конце концов, - попробуй, это не сложно.