Создаю тему тут, потому что под WOW64. Работаю с 32-битным приложением. Разрабатываю 32-битную длл, для мониторинга потоков. Для сбора инфы о потоках перехватываю ZwCreateThreadEx, и обрабатываю DLL_THREAD_ATTACH. Код (Text): NTSTATUS result = orig_ZwCreateThreadEx(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, lpStartAddress, lpParameter, CreateSuspended, StackZeroBits, SizeOfStackCommit, SizeOfStackReserve, lpBytesBuffer); if(!NT_SUCCESS(result)) return result; THREAD_BASIC_INFORMATION ti={0}; if(!NT_SUCCESS(_NtQueryInformationThread(*ThreadHandle,ThreadBasicInformation,&ti,sizeof(ti),NULL))) return result; if(ti.ClientId.UniqueThread) threads.insert((DWORD)ti.ClientId.UniqueThread); Код (Text): case DLL_THREAD_ATTACH: if(threads.find(GetCurrentThreadId())==threads.end()) { char buf[16]; wsprintfA(buf,"2: %d",GetCurrentThreadId()); MessageBoxA(0,buf,buf,0); //ExitThread(0); } break; И, в общем, так получилось, что они вызываются по очереди, как и должны, но ti.ClientId.UniqueThread никогда не равен GetCurrentThreadId() в последующем DLL_THREAD_ATTACH. Подскажите кто-нибудь что-то
короче с этим wow64 вообще что-то непонятное творится. Без wow64 при ручном создании потока, и при создании удаленного потока вызывается ZwCreateThread(Ex). Под wow64 же, отловить создание (именно процесс создания, а не факт появления) потока таким образом не удается. Как быть в таком случае? p.s. на всякий случай, естественно, только ring-3.