Получение процессов через ZwQuerySystemInformation

Тема в разделе "WASM.NT.KERNEL", создана пользователем JCronuz, 13 окт 2008.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Доброй ночи.
    Среда: Microsoft Visual С++ 6.0

    Код (Text):
    1. // enumproc.c
    2. //#include <ntddk.h>
    3.  
    4. #include <\WINDDK\2600\inc\ddk\wxp\ntddk.h>
    5.  
    6. #include <stdlib.h>
    7. #include "enumproc.h"
    8. char ProcessName[256]; // определяем переменную для хранения имени процесса
    9.  
    10. typedef ULONG DWORD;
    11. typedef VOID* LPVOID;
    12. #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
    13. #define SystemProcessesAndThreadsInformation 5 // определяем параметр управления выводом информации
    14.  
    15. void GetProcessName(int PID, char* pProcessName[256])
    16. {
    17.     ULONG cbBuffer = 0x8000; // определяем начальный размер буфера - 32kb
    18.     LPVOID pBuffer = NULL; // создаем указатель на буфер
    19.     NTSTATUS Status;
    20.     PSYSTEM_PROCESS_INFORMATION pInfo;
    21.     do
    22.     {
    23.         pBuffer = ExAllocatePool (NonPagedPool, cbBuffer); //создаем буфер в памяти размером cbBuffer
    24.         if (pBuffer == NULL) // Если память выделить не удалось - выходим
    25.         {
    26.             return 1;
    27.         }
    28.         // пытаемся получить информацию о системе в буфер
    29.         Status = ZwQuerySystemInformation(
    30.                                 SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL);
    31.         //если размер информации больше размера буфера
    32.         if (Status == STATUS_INFO_LENGTH_MISMATCH)
    33.         {
    34.             ExFreePool(pBuffer); // высвобождаем памятьопределенную для буфера
    35.             cbBuffer *= 2; // и увеличиваем его размер в два раза
    36.         }
    37.         else if (!NT_SUCCESS(Status)) // если операция не удалась по любой другой причине
    38.         {
    39.             ExFreePool(pBuffer); // высвобождаем память
    40.  
    41.             return 1; //и выходим
    42.         }
    43.     }
    44.     while (Status == STATUS_INFO_LENGTH_MISMATCH);
    45.  
    46.     PSYSTEM_PROCESS_INFORMATION pInfo;
    47.     pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
    48.  
    49.     for (;;) // вечный цикл
    50.     {
    51.         LPWSTR pszProcessName = pInfo->ProcessName.Buffer; // присвоить имя процесса новой переменной
    52.         if (pszProcessName == NULL) //если имя не доступно
    53.         pszProcessName = L"NULL"; //устанавливаем имя по умолчанию
    54.  
    55.         if (pInfo->ProcessId == PID) // сравниваем его идентификатор с искомым
    56.         { //если соответствие найдено
    57.             wcstombs(ProcessName,pszProcessName,256); //конвертируем wide character string pszProcessName  
    58.                                     //в  character string path
    59.             break; // покидаем цикл
    60.         }
    61.  
    62.         if (pInfo->NextEntryDelta == 0) // если  pInfo не содержит других наборов данных
    63.             break; // покидаем цикл
    64.  
    65.         // если мы все еще в цикле, текущие данные не сдержат  
    66.         // процесс который мы ищем, но pInfo  содержит дополнительные наборы данных
    67.  
    68.         pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)+ pInfo->NextEntryDelta); // получаем новый набор
    69.     }
    70.     ExFreePool(pBuffer); // выходя высвобождаем память
    71.     return 0; // и выходим
    72. }
    Проблема: При компляции возникает следующая хрень -

    Код (Text):
    1. winddk\2600\inc\ddk\wxp\ntddk.h(23) : fatal error C1189: #error :  Compiler version not supported by Windows DDK
    Подскажите, как можно исправить.
    Спасибо за внимание.

    P.S. Код из замечательной статьи, с http://www.volynkin.ru/procenum.htm



    Собственно сам код:
     
  2. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    ставь вц2005... иль выше...
    ещё бывает некоторые советуют закомментировать строку эту с проверкой версий,
    будет ли работать не знаю, не пробовал :)
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JCronuz
    Попробовать настроить студию на более современный компилятор, например, из состава ddk?
     
  4. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    JCronuz
    Если пишешь на чистом Си, то попробуй все объявления переменных засунуть в начало ф-ций.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    x0man попробовал закоментировать, так VC нашел её еще 55 ошибок, а 2005 ищю.

    q_q как это можно сделать? у меня есть вариант, только поменять CL из DDK/bin'а

    int2eh на чистом, но что это даст?
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JCronuz
    есть вариант, только поменять CL из DDK/bin'а
    Это крайний вариант.

    У меня уже нет установленной vs6, поэтому только варианты.
    Можно добавить пути ddk\bin первыми в "Executable files"
    Компилятор от Intel умел(ет) встраиваться в vs. Проанализировать как/куда и попытаться так же встроить ddk'овый.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    JCronuz
    там же ясно написано менять компилер :)
    могу прислать ;)
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    JCronuz
    у меня для cl 12.00.8804 и ddk6000 удалось собрать вот так:
    @cl /nologo /D "RC_INVOKED" /I \WinDDK\6000\inc\ddk /I \WinDDK\6000\inc\api /D "_X86_" xxx.c
     
  9. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Всем спасибо разобрался