WDF USB драйвер и surprise removing

Тема в разделе "WASM.NT.KERNEL", создана пользователем vasalvit, 15 июл 2009.

  1. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Пишу WDF USB драйвер.
    Объект устройства можно открыть только один поток/процесс. Для этого в device extension поместил флажок, открыто устройство или нет. Для предотвращения удаления устройства:
    1. в EvtDeviceFileCreate вызываю WdfDeviceSetStaticStopRemove(device, FALSE) (после полной инициализации)
    2. в EvtFileClose - WdfDeviceSetStaticStopRemove(device, TRUE) (после полной очистки)
    3. при ошибках с USB устройством вызываю WdfDeviceSetFailed(device, WdfDeviceFailedAttemptRestart)

    Всё работает замечательно, пока пользователь ручками не удалит устройство когда оно используется.

    В этом случае система вызывает DeviceRelease, не смотря на то, что устройство открыто.
    Затем приложение обнаруживает, что устройство не отвечает и закрывает его.
    Система вызывает EvtFileClose. Внутри этого обработчика происходит обращение к device extension. Иногда очистка происходит без ошибок. Но иногда в середине цикла очистки (далеко не первое обращение к device extension) система показывает синий экран с кодом DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL (verifier включён).

    При анализе дампа видно, что идёт обращение к device extension, но оно почему-то уже не доступно (дебаггер его не показывает). Получается, что device extension кто-то удаляет.

    Что я сделал не так?

    ps. Есть идея - завести event. EvtFileClose будет устанавливать его когда очистка завершена. А в DeviceRelease ожидать по этому событию. Законен ли этот способ? Может есть противопоказания?
     
  2. je_

    je_ New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    143
    может reference +1 сделаешь?
     
  3. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Об этом не подумал. Сейчас у меня на event'е работает. Если будет сбоить - попробую твой вариант