SYSTEM_THREADS

Тема в разделе "WASM.NT.KERNEL", создана пользователем cresta, 17 июн 2009.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Добрый день!

    Енумил я тут список процессов, все хорошо, но захотелось мне дополнительно проенумить ещё и потоки каждого процесса.
    Вставил в рабочий код енума процессов вызов енума потоков.

    Код (Text):
    1. //===========================================
    2. void EnumThreads(SYSTEM_THREADS *ptrThreads, ULONG cnt){
    3.     ULONG i;
    4.     for (i=0; i<cnt; i++){
    5.         DbgPrint("%08X", ptrThreads->StartAddress);
    6.         ptrThreads += sizeof(SYSTEM_THREADS);
    7.     }
    8. }
    9.  
    10. //================================================
    11. void EnumProcesses(){
    12.     SYSTEM_PROCESSES *          pProcesses=NULL;
    13.     ULONG                       ReqLen;
    14.     BOOL                        done=FALSE;
    15.     SYSTEM_PROCESSES *          ptr;
    16.     UNICODE_STRING              uStr;
    17.     ANSI_STRING                 aStr;
    18.     char                        buffer[128];
    19.     SYSTEM_THREADS*             pThreads;
    20.     ULONG                       thCnt;
    21.  
    22.     pProcesses = GetSysInfo(SystemProcessesAndThreadsInformation, NULL);
    23.     if (pProcesses){
    24.         for (ptr = pProcesses; !done; ptr = (SYSTEM_PROCESSES *)((char*)ptr + ptr->NextEntryDelta)){
    25.             RtlInitUnicodeString (&uStr, ptr->ProcessName.Buffer );
    26.             RtlUnicodeStringToAnsiString (&aStr, &uStr, TRUE);
    27.             DbgPrint ( "ProcessID=%d , %s", ptr->ProcessId, aStr.Buffer);
    28.             EnumThreads(&ptr->Threads[0], ptr->ThreadCount);
    29.             if ( strstr (aStr.Buffer, "torre") || strstr (aStr.Buffer, "zureus") || strstr (aStr.Buffer, "uze") ) ClearPeb (ptr->ProcessId);
    30.             RtlFreeAnsiString (&aStr);
    31.             done = (ptr->NextEntryDelta==0);
    32.         }
    33.         ExFreePool (pProcesses);
    34.     }
    35.     else DbgPrint (" No Processes Info ");
    36. }
    Ну и получил бсод пейдж фолт ин нонпейдж ареа.
    Что-то мне непонятно, о каком нонпейдж ареа идёт речь? Память под массив структур SYSTEM_THREADS, входящих в SYSTEM_PROCESSES уже выделена перед обращением к ZwQuerySystemInformation, и эта память заполнена данными функцией ZwQuerySystemInformation.
    Просто читаю, ничего более...
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta
    > о каком нонпейдж ареа идёт речь?
    Например
    Код (Text):
    1. ptrThreads += sizeof(SYSTEM_THREADS);
    замени на
    Код (Text):
    1. ptrThreads++;
    ps сравни asm-код для обоих вариантов.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Спасибо, я считал (и сейчас считаю, уже с некоторыми сомнениями), что инкремент ptrThreads++ дает приращение указателю на величину структуры, которую он адресует, т.е. sizeof(SYSTEM_THREADS).
    Но дизассемблер показывает два варианта: add edi, 0E10h и add edi, 03Ch.
    Первый вариант - ptrThreads += sizeof(SYSTEM_THREADS)
    Второй - ptrThreads++
    Со вторым вариантом нормально работает.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да,именно. Тебе он и нужен.

    А инкремент ptrThreads += sizeof(SYSTEM_THREADS) дает приращение на квадрат размера структуры.
    Действительно,
    add edi, 03Ch. - в десятичном виде 60
    add edi, 0E10h - в десятичном виде 3600 = 60*60
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А, допёр :)

    += sizeof(SYSTEM_THREADS) прокатило бы если бы указатель был типа PCHAR
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Именно!
     
  7. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Как можно в ядро лезть незная элементарщины вроде арифметики указателей... [риторический вопрос]
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    TSS

    Чего ты так нервничаешь? Я ж не в твоё ядро лезу :)
    Моё ядро - что хочу, то и делаю.

    А про элементарщину - это ассемблерные привычки лезут в говяжий язык Цэ. Не более того.
     
  9. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    cresta
    А как ты определяешь нервничает кто-то или нет по одному предложению без выраженных воскл/вопросительных знаков?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Размер вроде как не постоянен и меняется в версиях, можно задать таблицей можно динамически вычислять.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Рылся у себя в сурцах, нашёл это:
    Код (Text):
    1. QuerySizeOfSystemProcessesAndThreads proc uses esi edi ebx InformationBuffer:PVOID, SystemProcessesSize:PULONG, SystemThreadsSize:PULONG
    2.     mov esi,InformationBuffer
    3.     xor edx,edx
    4.     mov edi,esi
    5.     add edi,dword ptr [esi]
    6.     assume esi:PSYSTEM_PROCESSES
    7.     assume edi:PSYSTEM_PROCESSES
    8.     mov eax,[edi].NextEntryDelta
    9.     sub eax,[esi].NextEntryDelta
    10.     movzx ecx,[esi].ProcessName.MaximumLength
    11.     add eax,ecx
    12.     movzx ecx,[edi].ProcessName.MaximumLength
    13.     sub eax,ecx
    14.     mov ecx,[edi].ThreadCount
    15.     sub ecx,[esi].ThreadCount
    16.     div ecx     ; SizeOf(SYSTEM_THREADS)
    17.     mov ebx,eax
    18.     mul [esi].ThreadCount
    19.     mov edx,[esi].NextEntryDelta
    20.     sub edx,eax
    21.     movzx ecx,[esi].ProcessName.MaximumLength
    22.     sub edx,ecx ; SizeOf(SYSTEM_PROCESSES)
    23.     mov edi,SystemProcessesSize
    24.     mov esi,SystemThreadsSize
    25.     xor eax,eax
    26.     mov dword ptr [edi],edx
    27.     mov dword ptr [esi],ebx
    28.     ret
    29. QuerySizeOfSystemProcessesAndThreads endp