Как лучше вызвать ZwQuerySystemInformation из IRQL == 2

Тема в разделе "WASM.NT.KERNEL", создана пользователем neutronion, 21 апр 2011.

  1. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Нужно вызвать функцию ZwQuerySystemInformation, но IRQL уровень DISPATCH_LEVEL
    Как это лучше сделать? Насколько понимаю, ZwQuerySystemInformation вызывается
    только в PASSIVE_LEVEL. Есть мысль создать тред в DriverEntry, но хотелось бы что-нибудь попроще. Советуют создать IoQueueWorkItem, других вариантов, я
    так понимаю йок? Кстати, визуальная пирамида, функций при разных IRQL, бы не помешала, тогда бы стала ясно картина, кто в ядре самый главный.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    neutronion
    Правильно советуют. Другие пути - костыль.
     
  3. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Сэнкс, за ответ. Что если сделать так:

    1) В DriverEntry создаем поток, не бегущий по лезвию бритвы, т.е. работающий на уровне
    PASSIVE_LEVEL, включаем мороз (останавливаем его)
    2) Когда нам приходит сообщение из ядра в некую функцию на уровне DISPATCH_LEVEL,
    который размораживает поток и уходит, размороженный поток выполняет нужный нам
    функционал (На уровне passive) и снова ложиться спать.

    Что скажете по сему дизайну? Нет ли в нем неучтенных джинов, которые поломают Ось?
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    neutronion
    Вы можете создать тред, который будет ожидать события по мьютексу (KeWaitForMutexObject). Есть только заморочки с тем, как вы будете передавать параметры из 1 треда в другой (который на повышеном левеле). Но если такой задачи не стоит - юзайте.
    Инфа по мьютексам
     
  5. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Да, аргументы... хотел в глобальной структуре передавать, но теперь наверное передумаю. Неуклюже получается. Лучше уж IoQueueWorkItem.
     
  6. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    если >= vista, то удобнее IoQueueWorkItemEx
     
  7. f34534

    f34534 New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2011
    Сообщения:
    4
    > Вызывается на пассиве..
    Ну давайте подумаем логически. Что запрещает на более высоком иркле заюзать код ?
    Очевидно память свопируемая. Решение само собой также очивидно - залочить память, весь модуль. Либо более сложный, но эффективный способ - морфим кодес в нонпэйдж пул. Отложенный вызов это решение "в лоб"(типа доставить апк, дпк etc. с понижением иркл).
     
  8. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    Не совсем ... IoQueueWorkItem используется в тех случаях когда вы имеете рабочий запрос, но если его нет, то это становится через одно место, хотя и не совсем ... Проблемой может стать выгрузка драйвера.

    neutronion
    Лучше решать через переменную так называемую глобальный контекст драйвера. А аргументы хранить в двух связаном списке. Но это потенциально ведет к не контролю использовании памяти ядра, так что обратить на это внимание стоит.
     
  9. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Не только, еще есть ядерные функции ядра, которые могут вызываться только на определенных IRQL, их вы тоже в невыгружаемую память будете копировать?
    А что если в этой функции есть другие функции? Их вы будете копировать в невыгружаемую память рекурсией?