Пишу так: Код (Text): long Error; PSYSTEM_PROCESSES SI,TempSI; long Result=0,Temp=0; UNICODE_STRING UnicodeFindName; Error=ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,0,0,&Result); SI=ExAllocatePool(NonPagedPool,Result); if (SI==0) return -1; RtlZeroMemory(SI,Result); Error=ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,SI,Result,&Temp); всё работает, но как только заменяю на NtQuerySystemInformation.Функция буфер не передаёт. Не могу найти ошибку. Пробовал заменять на NtQuerySystemInformation и обе функции и только вторую. Результат тотже. Ошибка 0xС0000005 Пробовал выполнять следующий код, где Return - это ID кальтулятора. Код (Text): cl.UniqueProcess=Return; cl.UniqueThread=0; Error=ZwOpenProcess(&hProcess,PROCESS_TERMINATE,&oa,&cl); if (Error!=0) return -1; Error=ZwTerminateProcess(hProcess,0); if (Error!=0) return -1; ZwClose(hProcess); работает нормально калькулятор убиваю, но когда заменяю на NtOpenProcess возвращает ошибку. Вчём дело?
Ты ядерный код пишешь, зачем заменять Zw на Nt ? Из ядра вызывать сервисы можно только через обертки Zw, там чекаются всякие PreviousMode и прочая фигня. Либо через int 2e.
А я голову чуть не сломал. Пробовал просматривать в отладчике ZwQuerySystemInformation. В ней вызывается NtQuerySystemInformation с такими же параметрами. Только предварительно какие-то действия.
на форуме темка проскакивала чем различаются Nt* и Zw*, там ссылку хорошую давали, все по полочкам разложено.
ох сколько таких вопросов.. объясняю последний раз. В ядре сам код сервисов содержится в Nt* функциях, но напрямую вызывать их не нужно (и часто это закончится неудачей) - они рассчитывают на то, что у потока установлен предыдущий режим доступа (PreviousMode т.н.) и другие штучки. А Zw* - это переходники, которые косвенно вызывают сервисы через KiSystemService, делая все нужное для их запуска. Следовательно, когда ты хочешь вызвать сервис, нужно вызывать Zw* функцию. Когда ты хочешь похукать сервис, то хукать надо Nt* функцию. ЗЫ. По-другому дело обстоит в ntdll. Там оба имени указывают на один код, выполняющий sysenter/int2e в ядро
Спасибо за разъяснение. А то я для скрытия процесса как раз использовал NtQuerySystemInformation. И думал по аналогии можно вызывать эту функцию на прямую.
Не обязательно ведь получать список процессов через инфокласс SystemProcessesAndThreadsInformation, можно например через SystemHandleInformation.