Re[4]: NtQueryInformationProcess
От: Burbulis1978  
Дата: 20.08.17 22:03
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Burbulis1978, Вы писали:


B>>Предполагается что ответит читатель который реально работал с указанной napi , т.е. имеет практику конкретно под win10.


AG>То есть, имел опыт портирования конкретного примера из CodeProject на Win10 и помнит, что именно с ним было не так ?


AG>Так то функция работает, Windows по-прежнему использует её для внутренних нужд.

AG>А в конкретном примере она может не работать по десяткам разных причин, если более детальной информации нет.

AG>Для того, чтобы опытный читатель смог предположить, что же именно не так, крайне желательно привести, как именно она не работает, например:

AG>1. Какой именно ProcessInformationClass она возвращает?
Ожидаю что вернёт его собственно и запрашиваю:

ProcessBasicInformation

AG>2. Возвращает ли она не-успешный NTSTATUS (какой именно?)

AG>3. Если успешный NTSTATUS, но выходную структуру не заполняет, или заполняет неожиданным образом, то в чём именно нет соответствия ожиданиям?
AG>4. Если до возврата из неё не доходит, почему? Exception там случается, BSOD ли, или просто нельзя получить её адрес?
Вот набросал тестовый код:
 typedef struct _PROCESS_BASIC_INFORMATION
 {
    PVOID Reserved1;
    PPEB PebBaseAddress;//Интересует естественно PEB
    PVOID Reserved2[2];
    ULONG_PTR UniqueProcessId;
    PVOID Reserved3;
 } PROCESS_BASIC_INFORMATION;


  PROCESS_BASIC_INFORMATION  *ProcessInfo;
  HMODULE hinst_ntdll = LoadLibraryW(L"ntdll.dll");
  if (!hinst_ntdll)
    return (ReturnValue);  

  NtQueryInformationProcess = 
    reinterpret_cast<PNTQUERYINFORMATIONPROCESS>( GetProcAddress(hinst_ntdll,"ZwQueryInformationProcess") );

    
  if (!NtQueryInformationProcess) 
      return (ReturnValue);    

   HANDLE hProcs = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | READ_CONTROL,FALSE , dwPid );
   if ((!hProcs) && (ERROR_ACCESS_DENIED == ret))
   {
       
       return ("ERROR");
   }
   HANDLE hHeap = GetProcessHeap();
  unsigned int dwSize = sizeof( PROCESS_BASIC_INFORMATION );
  ProcessInfo  =reinterpret_cast<PROCESS_BASIC_INFORMATION *>( HeapAlloc(hHeap,
      HEAP_ZERO_MEMORY,
      dwSize) );

 
  NtStatus = NtQueryInformationProcess(hProcs , ProcessBasicInformation,
                                           reinterpret_cast<PVOID>(ProcessInfo), 
                                                 dwSize, 
                                                 &RLength  );    
    if (NtStatus != STATUS_SUCCESS) || (dwSize!= RLength)
          return ("ERROR_SZ_MISMACH");
    printf("ProcessInfo->PebBaseAddress = %x", ProcessInfo->PebBaseAddress);



В юзерспэйсе вызов выглядит так.


00007ff8`e4c656b0 4c8bd1 mov r10,rcx
00007ff8`e4c656b3 b819000000 mov eax,19h
00007ff8`e4c656b8 f604250803fe7f01 test byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ff8`e4c656c0 7503 jne ntdll!ZwQueryInformationProcess+0x15 (00007ff8`e4c656c5)
00007ff8`e4c656c2 0f05 syscall
00007ff8`e4c656c4 c3 ret


Поскольку я трассирую в юзерспэйсе дальше меня никто не пустил.SoftICe под Win10 не работает,
а windbg вынужден юзать тоолько в юзерспэйсе, VMWARE нет путёвой, и второго компа лишнего тоже нет.

После выхода из NtQueryInformationProcess
Возращается NTSTATUS == STATUS_SUCCESS ,dwSize == RLength. функция выполняется.Без падений и синих экранов.
А вот с processinfo засада ProcessInfo->PebBaseAddress == NULL.
С помощью гугла ещё до обращения сбда находил какието лекарства, связанные со смещением этого поля в зависимости от версии OS.
Но они не помогли.


При всём при этом SystemProcessesInformation — NtQueryInformationProcess, отрабатывает на ура.Без вопросов.


AG>Ещё неплохо сформулировать более высокоуровневую задачу. Что от неё в конце-концов нужно.


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


AG>Имя "ехешника" процесса, как в примере? Уже сто лет как есть GetProcessImageFileName и QueryFullProcessImageName всякие.

AG>Вообще всё, что она может сказать? Тогда да, вызывать её.

Нужно почти всё что может делать NtQuerySystemInfo.

AG>В данном конкретном случае проблема исключительно в постановке вопроса. Так-то знающие могут сказать.

AG>Вот недавно было: вызов 64-битной версии этой вашей NtQueryInformationProcess из 32-битного процесса
Автор: ononim
Дата: 09.08.17
.

AG>Так что прояснить про обычный сраный вызов обычной часто используемой NT API функции читатели, скорее всего, в состоянии.

За это тоже огромное спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.