Внутри NewNtQuerySystemInformation выделяю свой буфер, и скармливаю его оригинальной TrueNtQuerySystemInformation. На что получаю STATUS_ACCESS_VIOLATION Есть подозрение на то что функция внутри делает проверки вроде ExGetPreviousMode, смотрит адрес и посылает куда подельше видя что из юзермода пришел кернел указатель.
Во-первых, зачем? Во-вторых, какая система? В-третьих, какой класс информации указываешь при этом? Если передаёшь оригинальный класс информации, то какой он в случае ошибке?
Ясно. В любом случае, так делать нельзя. Сам подумай: системный сервис получает на вход адрес ядерного буфера, присланного из приложения. Вопрос 1: откуда у приложения адрес ядерного буфера? Вопрос 2: как приложение будет читать данные из этого буфера, даже если сервис отработает корректно? С точки зрения, ядра такой ситуации быть не может. В таком случае, как у тебя, следует использовать ZwAllocateVirtualMemory() или делать проекцию ядерной памяти, выделенной из пула, в а.п. текущего процесса и только тогда уже передавать сервису адрес проекции. Вот так было бы правильно, но я всё ещё не понимаю, зачем это всё? Какую задачу ты пытаешься решить? И чем это плохо лично для тебя?
Задача - выдавать по SystemModuleInformation на один элемент меньше чем их есть. Когда происходит первый вызов с нулевыми аргументами - я возвращаю необходимый размер буфера минус один элемент. Для второго, уже полноценноговызова, буфер будет мал. Естественно планировал после вызова скопировать данные из кернел буфера в юзермода почленно. Спасибо, думаю подойдет функция указаная. а поправить TEB на время вызова - так очень опасно?
-нафиг это делать? возвращайте размер как есть, ведь не факт что модуль какойто не выгрузился во время манипуляций или не подгрузился
assorted А не судьба сделать пост обработку? т.е. когда ориг функция отработает и все заполнит как надо - возьми да поправь буфер. А так вырываем гланды через жо..
ZwAllocateVirtualMemory идея хорошая. А остальные варианты - и есть вырывание гланд через жо. Возвращать размер как есть и делать постобработку означает что последний член SYSTEM_MODULE_ENTRY будет всегда присутствовать но будет пустовать. То есть вы предлагаете сделать так, чтобы NtQuerySystemInformation перестала соответствовать спецификации.
вам религия не позволяет отредактировать буфер должным образом или что? покажите мне "спецификацию" на изъятие модулей из списка ваша тема феерический бред
Конечно же нет. Размер для красоты придумали. Модули не так часто грузятся/выгружаются. В большинстве случаев их количество не изменно длительное время.