Нужно вызвать функцию ZwQuerySystemInformation, но IRQL уровень DISPATCH_LEVEL Как это лучше сделать? Насколько понимаю, ZwQuerySystemInformation вызывается только в PASSIVE_LEVEL. Есть мысль создать тред в DriverEntry, но хотелось бы что-нибудь попроще. Советуют создать IoQueueWorkItem, других вариантов, я так понимаю йок? Кстати, визуальная пирамида, функций при разных IRQL, бы не помешала, тогда бы стала ясно картина, кто в ядре самый главный.
Сэнкс, за ответ. Что если сделать так: 1) В DriverEntry создаем поток, не бегущий по лезвию бритвы, т.е. работающий на уровне PASSIVE_LEVEL, включаем мороз (останавливаем его) 2) Когда нам приходит сообщение из ядра в некую функцию на уровне DISPATCH_LEVEL, который размораживает поток и уходит, размороженный поток выполняет нужный нам функционал (На уровне passive) и снова ложиться спать. Что скажете по сему дизайну? Нет ли в нем неучтенных джинов, которые поломают Ось?
neutronion Вы можете создать тред, который будет ожидать события по мьютексу (KeWaitForMutexObject). Есть только заморочки с тем, как вы будете передавать параметры из 1 треда в другой (который на повышеном левеле). Но если такой задачи не стоит - юзайте. Инфа по мьютексам
Да, аргументы... хотел в глобальной структуре передавать, но теперь наверное передумаю. Неуклюже получается. Лучше уж IoQueueWorkItem.
> Вызывается на пассиве.. Ну давайте подумаем логически. Что запрещает на более высоком иркле заюзать код ? Очевидно память свопируемая. Решение само собой также очивидно - залочить память, весь модуль. Либо более сложный, но эффективный способ - морфим кодес в нонпэйдж пул. Отложенный вызов это решение "в лоб"(типа доставить апк, дпк etc. с понижением иркл).
Не совсем ... IoQueueWorkItem используется в тех случаях когда вы имеете рабочий запрос, но если его нет, то это становится через одно место, хотя и не совсем ... Проблемой может стать выгрузка драйвера. neutronion Лучше решать через переменную так называемую глобальный контекст драйвера. А аргументы хранить в двух связаном списке. Но это потенциально ведет к не контролю использовании памяти ядра, так что обратить на это внимание стоит.
Не только, еще есть ядерные функции ядра, которые могут вызываться только на определенных IRQL, их вы тоже в невыгружаемую память будете копировать? А что если в этой функции есть другие функции? Их вы будете копировать в невыгружаемую память рекурсией?