В компе живёт клоп в виде выскакивающего рекламного окошка. Решил его поймать. Spy++ показал ID процесса (csrss) и ID потока. Не удается найти стартовый адрес клопа, чтобы рассмотреть его внимательней. Делаю так: получаю SystemProcessesAndThreadsInformation, затем по количеству ThreadCount просматриваю стартовые адреса: Код (Text): SYSTEM_PROCESSES * ptr; SYSTEM_THREADS* pThreads; if (ptr->ProcessId==424){ pThreads = &ptr->Threads[0]; thCnt = ptr->ThreadCount; while (thCnt) { DbgPrint ("ThreadID = %X, addr = %X", pThreads->ClientId.UniqueThread, pThreads->StartAddress); pThreads ++; thCnt --; } } В DbgView выводится: ThreadID = 0, addr = 8231C ThreadID = F, addr = 1B0 ThreadID = 1B4, addr = 1A8 ThreadID = 1A8, addr = 75B141F0 ThreadID = 75B137E2, addr = 7FB ThreadID = EF44, addr = 1C6452F ThreadID = 1C6452F, addr = 46BF8998 ThreadID = 46BF8998, addr = 0 ThreadID = 0, addr = 0 ThreadID = 0, addr = 0 В списке нет ID потока, да и сами адреса какие-то левые. Почему?
Возможно она перешватывает эту API и видоизменяет выходные данные... Хм... а физически(на харде) ты его поймал?
если не перехватываются апи то через тулхелп не проще ? hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if ( hSnap != INVALID_HANDLE_VALUE ) { Thread.dwSize = sizeof(THREADENTRY32); if ( Thread32First(hSnap, &Thread) ) do { if ( Thread.th32OwnerProcessID == dProcessId ) и получаешь заветный поток ) Попробуй .. если не получится - значит перехватывает А еще оля может аттачится к процессам и показывать треды. И их процедуры. Попробуй и этот вариант.
Да сначала именно через Toolhelp решил, а глянул в THREADENTRY32 - нет там поля StartAddress, толку от информации в THREADENTRY32 ноль. Олю попробуем, интересно то, почему в SYSTEM_THREADS должна была оказаться осмысленная информация, а там - мусор
Может, я неправильно адресую структуру? Использую такие объявления: Код (Text): typedef struct _SYSTEM_THREADS { LARGE_INTEGER KernelTime; LARGE_INTEGER UserTime; LARGE_INTEGER CreateTime; ULONG WaitTime; PVOID StartAddress; CLIENT_ID ClientId; KPRIORITY Priority; KPRIORITY BasePriority; ULONG ContextSwitchCount; DWORD State; DWORD WaitReason; } SYSTEM_THREADS, *PSYSTEM_THREADS; typedef struct _SYSTEM_PROCESSES { // Information Class 5 ULONG NextEntryDelta; ULONG ThreadCount; ULONG Reserved1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; KPRIORITY BasePriority; ULONG ProcessId; ULONG InheritedFromProcessId; ULONG HandleCount; ULONG Reserved2[2]; VM_COUNTERS VmCounters; //IO_COUNTERS IoCounters; // Windows 2000 only SYSTEM_THREADS Threads[1]; } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
typedef struct SYSTEM_THREADS { LARGE_INTEGER KernelTime, UserTime, CreateTime; DWORD WaitTime; PVOID StartAddress; CLIENT_ID ClientId; DWORD Priority, BasePriority, ContextSwitchCount; DWORD State; DWORD WaitReason; } SYSTEM_THREADS, *PSYSTEM_THREADS; typedef struct SYSTEM_PROCESSES { DWORD NextEntryDelta; DWORD ThreadCount; DWORD Reserved1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UnicodeString ProcessName; DWORD BasePriority; DWORD ProcessId; DWORD InheritedFromProcessId; DWORD HandleCount; DWORD Reserved2[2]; VM_COUNTERS VmCounters; IO_COUNTERS IoCounters; SYSTEM_THREADS Threads[]; } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; вот у меня так
cresta возьми айс выставь бряку на окошко а дальше смотри уже кому код принадлежит и по шаблону поищи на диске, для начала можно даже дампануть.