Уважаемые гуру, нужна ваша помощь. Перехватываю функции NtOpenThread и NtTerminateThread, получаю хендл потока. Теперь мне нужно получить либо хендл, либо ИД процесса, которому принадлежит поток. Пробую делать так: Код (Text): ULONG GetTid (HANDLE ThreadHandle) { THREAD_BASIC_INFORMATION tbi; NTSTATUS status; status = NtQueryInformationThread( ThreadHandle, ThreadBasicInformation, &tbi, sizeof(tbi), NULL); return tbi.ClientId.UniqueProcess; }; По идее, функция должна возвращать мне Id процесса-хозяина потока, но что-то не работает. ThreadHandle получаю из NtTerminateThread или NtOpenThread. Код (Text): Далее я проверяю, не равен ли tbi.ClientId.UniqueProcess PID-у моего процесса. NTSTATUS NewNtOpenThread( OUT PHANDLE ThreadHandle, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ) { if (GetTid(ThreadHandle)==(HANDLE)480) { return STATUS_ACCESS_DENIED; } else return TrueNtOpenThread(ThreadHandle, AccessMask, ObjectAttributes, ClientId); }; ЧЯДНТ? Спасибо!
Если ваш код выполняется в контексте нужного вам потока\процесса то PsGetCurrentProcessId/PsGetCurrentThreadId. Конечно, если речь про Kernel mode.
1. Тип возвращаемого значения GetTid() отличается от используемого для ID потока. 2. Функцию GetTid() следует вызывать после того, как хендл получен из оригинального обработчика. 3. В функцию GetTid() нужно передавать хендл, а не адрес переменной, в которую его значение будет записано. 4. Если требуется заблокировать доступ к потоку, следует использовать ID потока из параметра ClientId, там он уже готовый. [modnote=x64]Тему закрываю, обсуждалось много раз, ошибки указаны выше, часть из них относится к языку C.[/modnote]