В общем, проблема такая: я перехватываю в процессе ZwResumeThread, у него как известно передается ThreadHandle. Вот мне нужно по этому хэндлу определить id процесса, которому этот поток принадлежит. Пробовал ZwQueryInformationThread - почему-то не работает. В MSDN'е нашел GetProcessIdOfThread - вроде подходит, за одним исключением - она только под Win2003 , а пишется это дело под WinXP. Помогите, плиз!
Ну приблизительно так: Код (Text): #define THREAD_BASIC_INFO 0 NTSTATUS __stdcall xZwResumeThread(HANDLE ThreadHandle, DWORD PrevSuspendCount) { THREAD_BASIC_INFORMATION tbi; DWORD RetLen, ProcessId=0; NTSTATUS ns; ns=ZwQueryInformationThread(ThreadHandle, THREAD_BASIC_INFO, &tbi, sizeof(tbi), &RetLen); if(NT_SUCCESS(ns)) { ProcessId=tbi.ClientId->UniqueProcess; // на этом месте процесс просто вырубается } Set_ZwResumeThread(false); ns=__ZwResumeThread(ThreadHandle, PrevSuspendCount); Set_ZwResumeThread(true); return ns; }
а как у тебя CLIENT_ID определена? Код (Text): typedef struct _CLIENT_ID { ULONG UniqueProcess; ULONG UniqueThread; } CLIENT_ID; По идее должно быть так, то есть ProcessId = tbi.ClientId.UniqueProcess.
ну да, CLIENT_ID так определена. Почему tbi.ClientId.UniqueProcess? Там же PCLIENT_ID? Или я что-то путаю?
путаешь. typedef struct _THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY BasePriority; ULONG DiffProcessPriority; } THREAD_BASIC_INFORMATION;
>> ProcessId=tbi.ClientId->UniqueProcess; // на этом месте процесс просто вырубается это не скомпилируется