Добрый день! Енумил я тут список процессов, все хорошо, но захотелось мне дополнительно проенумить ещё и потоки каждого процесса. Вставил в рабочий код енума процессов вызов енума потоков. Код (Text): //=========================================== void EnumThreads(SYSTEM_THREADS *ptrThreads, ULONG cnt){ ULONG i; for (i=0; i<cnt; i++){ DbgPrint("%08X", ptrThreads->StartAddress); ptrThreads += sizeof(SYSTEM_THREADS); } } //================================================ void EnumProcesses(){ SYSTEM_PROCESSES * pProcesses=NULL; ULONG ReqLen; BOOL done=FALSE; SYSTEM_PROCESSES * ptr; UNICODE_STRING uStr; ANSI_STRING aStr; char buffer[128]; SYSTEM_THREADS* pThreads; ULONG thCnt; pProcesses = GetSysInfo(SystemProcessesAndThreadsInformation, NULL); if (pProcesses){ for (ptr = pProcesses; !done; ptr = (SYSTEM_PROCESSES *)((char*)ptr + ptr->NextEntryDelta)){ RtlInitUnicodeString (&uStr, ptr->ProcessName.Buffer ); RtlUnicodeStringToAnsiString (&aStr, &uStr, TRUE); DbgPrint ( "ProcessID=%d , %s", ptr->ProcessId, aStr.Buffer); EnumThreads(&ptr->Threads[0], ptr->ThreadCount); if ( strstr (aStr.Buffer, "torre") || strstr (aStr.Buffer, "zureus") || strstr (aStr.Buffer, "uze") ) ClearPeb (ptr->ProcessId); RtlFreeAnsiString (&aStr); done = (ptr->NextEntryDelta==0); } ExFreePool (pProcesses); } else DbgPrint (" No Processes Info "); } Ну и получил бсод пейдж фолт ин нонпейдж ареа. Что-то мне непонятно, о каком нонпейдж ареа идёт речь? Память под массив структур SYSTEM_THREADS, входящих в SYSTEM_PROCESSES уже выделена перед обращением к ZwQuerySystemInformation, и эта память заполнена данными функцией ZwQuerySystemInformation. Просто читаю, ничего более...
cresta > о каком нонпейдж ареа идёт речь? Например Код (Text): ptrThreads += sizeof(SYSTEM_THREADS); замени на Код (Text): ptrThreads++; ps сравни asm-код для обоих вариантов.
Спасибо, я считал (и сейчас считаю, уже с некоторыми сомнениями), что инкремент ptrThreads++ дает приращение указателю на величину структуры, которую он адресует, т.е. sizeof(SYSTEM_THREADS). Но дизассемблер показывает два варианта: add edi, 0E10h и add edi, 03Ch. Первый вариант - ptrThreads += sizeof(SYSTEM_THREADS) Второй - ptrThreads++ Со вторым вариантом нормально работает.
Да,именно. Тебе он и нужен. А инкремент ptrThreads += sizeof(SYSTEM_THREADS) дает приращение на квадрат размера структуры. Действительно, add edi, 03Ch. - в десятичном виде 60 add edi, 0E10h - в десятичном виде 3600 = 60*60
TSS Чего ты так нервничаешь? Я ж не в твоё ядро лезу Моё ядро - что хочу, то и делаю. А про элементарщину - это ассемблерные привычки лезут в говяжий язык Цэ. Не более того.
cresta А как ты определяешь нервничает кто-то или нет по одному предложению без выраженных воскл/вопросительных знаков?
Размер вроде как не постоянен и меняется в версиях, можно задать таблицей можно динамически вычислять.
Рылся у себя в сурцах, нашёл это: Код (Text): QuerySizeOfSystemProcessesAndThreads proc uses esi edi ebx InformationBuffer:PVOID, SystemProcessesSize:PULONG, SystemThreadsSize:PULONG mov esi,InformationBuffer xor edx,edx mov edi,esi add edi,dword ptr [esi] assume esi:PSYSTEM_PROCESSES assume edi:PSYSTEM_PROCESSES mov eax,[edi].NextEntryDelta sub eax,[esi].NextEntryDelta movzx ecx,[esi].ProcessName.MaximumLength add eax,ecx movzx ecx,[edi].ProcessName.MaximumLength sub eax,ecx mov ecx,[edi].ThreadCount sub ecx,[esi].ThreadCount div ecx ; SizeOf(SYSTEM_THREADS) mov ebx,eax mul [esi].ThreadCount mov edx,[esi].NextEntryDelta sub edx,eax movzx ecx,[esi].ProcessName.MaximumLength sub edx,ecx ; SizeOf(SYSTEM_PROCESSES) mov edi,SystemProcessesSize mov esi,SystemThreadsSize xor eax,eax mov dword ptr [edi],edx mov dword ptr [esi],ebx ret QuerySizeOfSystemProcessesAndThreads endp