Callback на подключение PNP устройства

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 14 дек 2009.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Как правильно подключить callback на подключение PNP устройства? В моем конкретном случае это синезубая клавиатура.
     
  2. C2H5OH

    C2H5OH New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    42
    обработка IRP_MN_START_DEVICE не подойдет?
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Думаю, стоит написать WDM-фильтр для класса клавиатур. В качестве колбека задействовать функцию AddDevice() своего драйвера - она вызывается по стеку аналогично пакетам запросов ввода/вывода (IRP), т.е. от верхних драйверов (например, фильтры) к нижнему (обычно это непосредственно физическое устройство).
     
  4. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    К сожалению в WDM откровенно слаб (надеюсь в скором времени восполнить пробелы). Можно ли зарегитрировать свой драйвер на класс усторйств без прописывания его в UpperFilters в регистре? В прошлом несколько раз сталкивался с неприятной ситуацией, когда драйвер удален с диска, но зарегитрирован в UpperFilters. Хотелось бы сделать драйвер максимальным образом self-contained.
     
  5. tchunya

    tchunya New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    29
    IoRegisterPlugPlayNotification не подойдет?
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Скорее всего должно подойти, но делаю, что то типа:
    Код (Text):
    1. IoRegisterPlugPlayNotification(
    2.             EventCategoryHardwareProfileChange,
    3.             PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
    4.             (PVOID)&GUID_DEVINTERFACE_HID,  // или GUID_DEVINTERFACE_KEYBOARD
    5.             DriverObject,
    6.             KeyboardClassPlugPlayNotification,
    7.             NULL,
    8.             &TargetNotifyHandle);
    Функция возвращает STATUS_SUCCESS, но когда включаю/выключаю USB клавиатуру, KeyboardClassPlugPlayNotification не вызывается.
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    EventCategoryTargetDeviceChange
     
  8. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Извиняюсь - заработало!
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вообще-то это не совсем то, что тебе нужно. Для EventCategoryDeviceInterfaceChange там сказано:

    Т.е. если я всё правильно понял, то может получится такая ситуация, что интерфейс положим будет удалён, но девайс всё ещё будет присутствовать в системе. Я в эти тонкости не вникал, поэтому настоятельно советую поэкспериментировать с этим колбеком, а лучше всего сразу переписать под WDM-фильтр - это решение, во всяком случае, стабильно совершенно точно.
     
  10. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    А как обойтись без UpperFilters? У меня это больной вопрос.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не понял, а зачем в WDM-фильтре "обойтись без UpperFilters"? Это как бы две несовместимые вещи.
     
  12. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Дело в том, что есть необходимость оставить систему в работоспособном состоянии, даже если драйвер был физически удален. Несколько раз сталкивался с неприятной ситуацией когда остается регистрация в UpperFilters а драйвера нет.
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Подобная проблема может возникнуть только для boot-фильтров. Клавиатуры это явно не тот случай, т.е. проблем как бы и не должно быть.
     
  14. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Может и не должно, но проблема есть. Попробуй добавить в
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}\UpperFilters какой нибудь несуществующий драйвер. После рестарта первое-же нажатие на любую клавишу замораживает систему.
     
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Мне лень. Возьми отладчик, посмотри где висит. В гуглогруппах можно поискать, на MSDN-овских форумах что-нибудь. Я вот сейчас мельком глянул, да, люди пишут, что драйвер физического девайса реально может не запуститься в случае ошибки фильтра. Но мне всё таки кажется, что здесь должно быть какое-то просто решение проблемы. В поиск!
     
  16. ViP

    ViP New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    7
    не замораживает, просто клавиатура перестает работать. Был у меня такой драйверок, когда стирали этот ключ - помогала правка через удаленный реестр. Иногда, правда, помогало переподключение клавиатуры.