Оповещение приложения о событиях в драйвере...

Тема в разделе "WASM.NT.KERNEL", создана пользователем onio, 25 ноя 2009.

  1. onio

    onio New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    7
    Суть в том что необходимо сообщать приложение о событиях (в моем случае это события происходящие в NDIS IM драйвере), при этом надо передать данные с драйвера в приложение... Кто знает какие решения этой проблемы ??? Про метод описаный у W.Oney на 463 странице про приостановку IOCTL я знаю, но там свои проблемы со состояниями и тд...

    Например, можно использывать общее событие (описан у тогоже W.Oney ), но оно может только сигнализировать о событие... но ведь мы можем при получении сигнала отправить еще один IOCTL и получить необходимые данные, сохранненые во время сообщения о событии...


    Может кто нибудь знает другие методы ???
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    1. Виртуальная память + APC для уведомления.
    2. Шаренная секция + событие для уведомления.
     
  3. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    дров кидает сообщения в очередь, MsgWaitForMultipleObjects вытаскивает их оттуда.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это какие-такие сообщения драйвер будет кидать в очередь?
     
  5. onio

    onio New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    7
    Шаренная секция + событие для уведомления.

    А можно подробне ? или пару ключевых слов в гугл =) а то я не давно этим занимаюсь ...
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    ZwCreateSection()
    ZwMapViewOfSection()
    IoCreateSynchronizationEvent()
    Плюс небольшие заморочки с безопасностью этих объектов.

    Но этот способ больше подходит для небольших объёмов данных фиксированного размера. Если же размер передаваемых данных неизвестен, тогда лучше всего будет первый способ. Он частично недокументирован, но работает стабильно на любой версии вплоть до Windows 7:

    ZwAllocateVirtualMemory()
    KeInitializeApc()
    KeInsertQueueApc()
     
  7. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    неправильно выразился.
    NtDeviceIoControlFile c параметром ApcRoutine. затем MsgWaitForMultipleObjects.
     
  8. onio

    onio New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    7
    Спасибо за пищу для размышлений =)
     
  9. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Я использую немног другой способ- выделяю память и евент в юзермоде, а потом передаю в драйвер. Там память мапится в кернел, из хендла евента вытаскивается его объект. Потом, когда происходит событие, заполняем память и дёргаем объект евента.
     
  10. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Сорри, заглянул к себе в код и понял, что ошибся. Память я выделяю в ring0, а затем уже маплю в приложение и возвращаю начало на неё.