Я пытаюсь вывести список процессов в системе, не прибегая к помощи функции ZwQuerySystemInformation, оперируя напрямую с объектами ядра, вот что я делаю (комменты краткие, но, думаю, понятно): Код (Text): mov edi, fs:[124h] ; EDI -> KTHREAD CurrentThread mov edi, [edi+44h] ; EDI == EPROCESS* Process add edi, 0A0h ; EDI -> LIST_ENTRY ActiveProcessLinks (in EPROCESS) mov esi, edi ; ESI -> LIST_ENTRY ActiveProcessLinks @loop: mov eax, [esi+110h] ; EAX -> PEB mov eax, [eax+10h] ; EAX -> PROCESS_PARAMETERS ProcessParameters mov eax, [eax+(38h+4)] ; EAX == PWSTR invoke DbgPrint, $CTA0("%ws"), eax mov esi, [esi] cmp esi, edi jnz @loop так вот это не совсем работает если убрать кусок кода, отвечающий за переход на другую структуру LIST_ENTRY: Код (Text): mov esi, [esi] cmp esi, edi jnz @loop то выводится один полный путь к ехе, который вызвал DeviceIoControl. А в остальном - бсод По идее должен быть связанный список, позволяющий "пройтись" по всем процессам в системе, ан нет, или у меня руки кривые или хз %) Тестирую на Win2k.
CARDINAL, ты наверное их сам не читал там такого нет... вобщем, попробовал вывести список PID'ов, получилось, но всегда почему-то выводятся два вообще левых %) не пойму в чем дело
PEB находиться в юзермодном АП, а следовательно перед чтением данных оттуда необходимо делать KeAttachProcess. Не забывай, что есть голова списка (ActiveProcessesListHead) которая не является процессом. Отличить ее от процесса можно по признаку попадания в диапазон адресов занятых ntoskrnl.
Понятно, значит чтобы получить доступ к PEB опр. процесса, нужно переключиться на него, вытянуть инфу, ну а потом назад? А `голова` списка имеет другой формат, не EPROCESS? Вообще теперь начал перечислять процессы, не через fs:[124h] и т.д., а используя PsInitialSystemProcess - вроде без казусов.