Здравствуйте, 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 функции читатели, скорее всего, в состоянии.
За это тоже огромное спасибо