несколько вопросов по разработке драйвера в kernel-mode

Тема в разделе "WASM.NT.KERNEL", создана пользователем xray2000, 23 июн 2008.

  1. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    Hi all!
    я новичок в разработке драйверов, по сути это мой первый WDM драйвер-фильтр HID клавиатуры, хотелось бы узнать несколько ответов на терзающие меня вопросы:
    1. Что лучше - использовать глобальные переменные или лучше структуру DEVICE_EXTENSION для размещения внутренних данных(переменных)?

    2. Может ли система самопроизвольно повышать уровень IRQL в процессе выполнения функции драйвера? (в частности меня интересует callback функция KeyboardClassServiceCallback)

    3. Могу ли я передавать данные (небольшая порция 64 байта) напрямую в реестр (на уровне PASSIVE_LEVEL), никаких проблем с записью в реестр не будет?

    4. Доступны ли созданные события (CreateEvent) пользовательского режима в режиме ядра?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    1. DEVICE_EXTENSION - клав может быть несколько.
    2. самопроизвольно - нет. дял колбеков обычно указывается IRQL в DDK.
    3. не должно.
    4. да.
     
  3. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    Сенькс за ответы ! :)
     
  4. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    Странно в DDK прочитал
    KeyboardClassServiceCallback
    работает под IRQL == DISPATCH_LEVEL

    в этой функции я использую
    IoCreateNotificationEvent
    которая, судя по докам должна работать при IRQL == PASSIVE_LEVEL

    но у меня она прекрастно работает!!! (и другие функции событий тоже)
    чем такое обьяснить? возможны ли проблемы если функции выполняются на уровнях выше требуемых?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да, проблемы будут. То, что работает щас, не значит, что работать будет всегда. ПОэтому и полчаются кривые драйвера )))
    Ограничение специально поставлено - те функции, для которых написан IRQL >= 2, должны выполняться очень быстро, поскольку потоки не переключаются. длительные операции там приведут к ожиданию. (есть и другие ограничения - нельзя обращаться к подкачиваемой памяти)
    Юзай ExQueueWorkItem для добавления work item'а, который будте выполнен на passive как только понизится irql и управление дойдет до одного из worker thread'ов
     
  6. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    ага пасибо, пошел курить доки по ExQueueWorkItem
     
  7. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Включите драйвер верифаер и удивитесь насколько прекрасно она работает.

    Кроме того, украсьте код праздничным макросом PAGED_CODE ( как только вызовете функцию требующую PASSIVE_LEVEL ).
     
  8. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    а в примерах из DDK очень часто в рабочих процедурах драйвера используется PAGED_CODE :)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Странно дА? +)
     
  10. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    еще вопрос в догонку: как узнать из kernel mode существует ли определенный процесс запущенный из пользовательского режима?
     
  11. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Что подразумевается под "определённый"? С определённым пидом, запущенный из указанного файла, или что ещё?
     
  12. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    хочу что бы процесс пользовательского режима сигнализировал драйверу о своем присутствии без IOCTL запросов, мона такое сделать? (или обратно, драйвер отслеживал наличие процесса с определенными именем)
     
  13. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    xray2000
    посмотри в сторону PsSetCreateProcessNotifyRoutine
     
  14. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    а как узнать из процедуры драйвера существует ли определенный объект события созданный в пользовательском режиме или нет? IoCreateNotificationEvent зараза если объекта нет - создает новый :dntknw:
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ZwQuerySystemInformation (SystemProcessesAndThreadsInformation)
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    xray2000
    ZwOpenEvent (\BaseNamedObjects\....)
     
  17. xray2000

    xray2000 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    15
    Адрес:
    Москва
    сенькс, попробую...