Тесты PnP (основы устройства)

Тесты PnP на основе основных устройств позволяют драйверу обрабатывать почти все PnP IRP; однако есть три области, которые подчеркиваются специально: удаление, перебалансация и неожиданное удаление. Тест PnP предоставляет механизм для проверки каждого из этих отдельно или для их тестирования все вместе (то есть в качестве стресс-теста). Это тестирование PnP выполняется с помощью сочетания вызовов API в пользовательском режиме (через тестовое приложение) и вызовов API в режиме ядра (через драйвер верхнего фильтра).

Тесты PNP

Тесты Plug and Play (PnP) выполняют различные пути кода, связанные с PnP, в компонентах драйвера и пользовательского режима. Тесты PnP должны выполняться с включенным средство проверки драйверов на тестовом компьютере. Сведения о включении средства проверки драйверов см. в разделе "Свойства средства проверки драйверов" для проектов драйверов.

Тест Описание

Отключение поддержки расширенного тестирования устройств (EDT)

Этот тест удаляет драйвер тестового фильтра (msdmfilt.sys) в качестве верхнего фильтра на устройствах, указанных с помощью параметра DQ. Этот фильтр тестирования устанавливается в рамках выполнения тестов в этой категории тестов

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Перезагрузка PNP (отключение и включение) с помощью операций ввода-вывода до и после нее

Этот тест выполняет базовое отключение и включение PnP, а также ввод/вывод на устройствах во время перезагрузки системы.

Тестовый двоичный файл: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

Метод испытаний: PNP_DisableEnable_Reboot_With_IO_Before_And_After

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

IOPeriod

PNP (отключение и включение) с операциями ввода-вывода до и после

Этот тест выполняет операции ввода-вывода и базовое отключение/включение PnP на устройствах.

Этот тест выполняет следующее:

  1. Проверяет, отсутствуют ли в системе устройства, сообщающие о кодах ошибок.
  2. Проверяет операции ввода-вывода на каждом устройстве в системе с помощью подключаемых модулей простого ввода-вывода WDTF. См. раздел Подключаемые модули простого ввода-вывода WDTF для получения дополнительной информации.
  3. Отключает и включает каждое устройство в системе с помощью интерфейсов управления действиями WDTF PnP, см. сведения о методах IWDTFPNPAction2::DisableDevice и IWDTFPNPAction2::EnableDevice.
  4. Проверяет, отсутствуют ли в системе устройства, сообщающие о кодах ошибок.
  5. Проверяет операции ввода-вывода на каждом устройстве в системе с помощью подключаемых модулей простого ввода-вывода WDTF. См. раздел Подключаемые модули простого ввода-вывода WDTF для получения дополнительной информации.
  6. Повторяет шаги 3-5 несколько раз.

Тестовый двоичный файл: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

Метод испытаний: PNP_DisableEnable_With_IO_Before_And_After

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

IOPeriod

Проверка отмены удаления устройства PNP

Этот тест использует драйвер фильтра EDT для отправки IRP_MN_CANCEL_REMOVE_DEVICE в целевые стеки устройств.

Дополнительные сведения см. в разделе "Сведения о тестах удаления устройств".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPCancelRemoveDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

Проверка остановки устройства PNP

Этот тест использует драйвер фильтра EDT для отправки IRP_MN_CANCEL_STOP_DEVICE в целевые стеки устройств.

Дополнительные сведения см. в разделе "О тестах повторного балансировки".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPCancelStopDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF тест на удаление устройства

Этот тест использует API SetupDi для отправки запроса DIF_REMOVE установщикам для удаления устройства.

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPDIFRemoveAndRescanParentDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

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

Этот тест отключает и включает целевые устройства.

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPDisableAndEnableDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Тест устройства на сбой перезапуска ребалансировки PNP

Этот тест использует драйвер фильтра EDT для отправки IRP_MN_STOP_DEVICE на целевые стеки устройств. Драйвер фильтра EDT затем отвергает запросы IRP_MN_START_DEVICE, которые следуют за запросами IRP_MN_STOP_DEVICE, чтобы инициировать внезапное удаление целевых устройств.

Дополнительные сведения см. в разделе "О тестах повторного балансировки".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод тестирования: PNPTryStopDeviceAndFailRestart

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP запрос на повторное распределение ресурсов тест нового устройства

Этот тест использует фильтрующий драйвер EDT для попытки отправки IRP_MN_STOP_DEVICE на целевые стеки устройств. Он также управляет требованиями к ресурсам устройств, чтобы максимально повысить вероятность того, что новые ресурсы выделены устройствам.

Дополнительные сведения см. в разделе "О тестах повторного балансировки".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Испытательный метод: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

Тест на удаление устройства PNP

Этот тест приводит к отправке IRP_MN_QUERY_REMOVE_DEVICE и IRP_MN_REMOVE_DEVICE на целевые стеки устройств.

Дополнительные сведения см. в разделе "Сведения о тестах удаления устройств".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPRemoveAndRestartDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

Тест устройства остановки (перебалансации) PNP

Этот тест использует фильтрующий драйвер EDT для отправки IRP_MN_STOP_DEVICE на целевые стеки устройств.

Дополнительные сведения см. в разделе "О тестах повторного балансировки".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPTryStopAndRestartDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

Тест на неожиданное удаление устройства PNP

Этот тест использует драйвер фильтра EDT для отправки IRP_MN_SURPRISE_REMOVAL в целевые стеки устройств.

Дополнительные сведения см. в разделе "О тесте на удаление сюрпризов".

Тестовый двоичный файл: Devfund_PnPDTest.dll

Метод испытаний: PNPSurpriseRemoveAndRestartDevice

Параметры : — см. раздел Параметры тестирования основных устройств

DQ

Тестовые циклы

DoSimpleIO

IOPeriod

DoConcurrentIO

Сведения о тестах удаления устройств

  • Тест удаления устройства PNP
  • Тест отмены удаления устройства PNP

Тест удаления устройств охватывает IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE и IRP_MN_REMOVE_DEVICE.

Тест пытается установить свой драйвер верхнего фильтра в целевой стек устройств. Эта попытка приводит к удалению запроса IRP.

Если запрос на удаление IRP не удается, тест перезагружает компьютер, чтобы добавить драйвер фильтра в стек устройства. Если запрос на удаление не ветоирован, стек устройств будет удален и перезапущен с драйвером фильтра в стеке устройств.

Тест с помощью API установки приводит к отправке IRP для удаления запросов в стек устройств. Драйвер фильтра отклоняет этот запрос на удаление, поэтому отправляется IRP (пакет запросов ввода-вывода) для отмены удаления. Драйвер фильтра подтверждает, что операция отмены-удаления завершилась успешно.

Затем тестовое приложение вызывает соответствующий установщик классов и всех зарегистрированных ко-установщиков для отключения или включения и удаления или повторного перечисления устройства (это проверяет обработку DIF_PROPERTYCHANGE класса и ко-установщика с помощью DICS_DISABLE, DICS_ENABLE и DICS_PROPCHANGE). При получении IRP_MN_REMOVE_DEVICE драйвер фильтра утверждает, что более низкие драйверы успешно завершили его.

Каждый из этих шагов включает предварительный запрос на удаление. Если этот запрос ветоирован, устройство не будет удалено. Вы можете наложить вето на запрос на удаление, например, при потоковой передаче видео с USB-камеры или когда целевое устройство находится на пути загрузки или в пути подкачки. Помните, что просто отклонять все запросы на удаление, как правило, плохая практика. Сбой всех запросов на удаление не гарантирует, что драйвер никогда не получит удаление, так как удаление IRP по-прежнему будет выдано после неожиданного удаления, или если любой пользователь в стеке устройств завершает запуск IRP.

О тесте внезапного удаления

  • Тест внезапного удаления устройства PNP

Тест на удаление без предупреждения охватывает IRP_MN_SURPRISE_REMOVAL после которого следует IRP_MN_REMOVE_DEVICE.

Как и в предыдущих тестах, тестовое приложение попытается добавить верхний фильтр в стек целевого устройства, а затем перезапустить стек. Если эта попытка не выполнена, тест перезагрузит компьютер.

При срабатывании тестового приложения драйвер фильтра вызовет отправку IRP_MN_SURPRISE_REMOVAL в стек устройства, а затем IRP_MN_REMOVE_DEVICE. Драйвер фильтра гарантирует, что оба этих запроса ввода-вывода (IRP) успешно завершаются нижестоящими драйверами.

После завершения теста неожиданного удаления устройство будет удалено и повторно перечислено, а драйвер фильтра удаляется из стека.

Сведения о тестах повторного балансировки

  • Тестирование устройства PNP Stop (Rebalance)
  • Запрос PNP на ребалансировку - тест устройства на новые ресурсы.
  • Тест устройства ребалансировки PNP с ошибкой перезапуска
  • Проверка остановки устройства PNP

Как и при тестировании удаления, тестовое приложение пытается добавить верхний фильтр в стек целевого устройства, а затем перезапустить его с помощью SetupDiCallClassInstaller с DIF_PROPERTYCHANGE. Если эта попытка не успешна (т. е. если кто-то на целевом стеке устройств не смог выполнить запрос на удаление IRP), тест перезагрузит компьютер для тестирования перебалансировки.

В зависимости от выбранного теста перебалансировки происходят следующие события:

  1. Тест устройства PnP остановки (перенастройка) Этот тест инициирует процедуру перенастройки, которая приводит к отправке запроса IRP_MN_QUERY_STOP_DEVICE PnP IRP драйверу устройства.

    Если любой драйвер в стеке завершается сбоем при обработке этого IRP, процедура перебалансировки отменяется. Обратите внимание, что в Windows Vista поддерживается перебалансация на нескольких уровнях. Если перебалансировка запущена на неконечном устройстве-узле, все стеки устройств, присутствующие в дереве устройств, где этот узел устройства является корневым, также проходят перебалансировку. И если любой из дочерних стеков устройств терпит неудачу при попытке остановки запроса, то вся процедура перебалансировки будет прекращена. Поэтому драйверы не должны пропускать остановку запросов без подлинной на то причины. Если эта неисправность случится, диспетчер PnP отправит отмену остановки (IRP_MN_CANCEL_STOP) всем стекам устройств, которым ранее была отправлена остановка запроса.

    Если все стеки устройств проходят остановку запроса, тест продолжается с перебалансировкой ресурсов и отправляет IRP_MN_QUERY_RESOURCE_REQUIREMENTS и IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP, чтобы определить требования к ресурсам устройств.

    После этого два разных пути возможны в зависимости от того, потребляет ли целевое устройство какие-либо ресурсы или нет:

    • Если устройство не использует никаких ресурсов, диспетчер PnP сам отправляет запрос на отмену остановки (IRP_MN_CANCEL_STOP_DEVICE) в качестве оптимизации.

      Если устройство фактически потребляет ресурсы, процедура перебалансовки завершается с помощью IRP_MN_STOP_DEVICE и IRP_MN_START_DEVICE irPs.

    С помощью этого параметра ресурсы устройства не изменяются.

  2. Тест удаления устройства отмены остановки PNP: этот тест инициирует процедуру перезапуска, но драйвер фильтра намеренно отклоняет запрос на остановку IRP. Порядок IRP совпадает с IRP_MN_QUERY_STOP_DEVICE (которое было отклонено драйвером фильтра при инициализации, вызвав отмену перебалансировки) и IRP_MN_CANCEL_STOP_DEVICE.

    С помощью этого параметра ресурсы устройства не изменяются.

  3. Запрос PNP на перебалансировку и выделение новых ресурсов устройству Этот тест инициирует ребалансировку, а также управляет требованиями к ресурсам устройства, чтобы максимально увеличить шансы на выделение фактически новых ресурсов устройству. Этот параметр также помогает устройству без ресурсов на самом деле пройти полную процедуру перебаланса:

    1. Сначала запускается простая ребалансировка, что приводит к следующим IRPs.

      • IRP_MN_QUERY_STOP_DEVICE (если этот IRP передается всеми драйверами. Тест уже охватывал случай, когда этот IRP отклонен.)
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS. В ответ на этот IRP, при повышении уровня, драйвер фильтра действует в зависимости от того, использует ли устройство какие-либо ресурсы.
        • Если у устройства нет требований к ресурсу, фильтр назначает поддельный ресурс.
        • Если у устройства есть требование к ресурсу, он пытается переструктурировать список требований к ресурсу таким образом, чтобы максимально повысить вероятность изменения текущего назначения. Например, если устройству требуется 2 байта памяти в диапазоне от 00 до FF и в настоящее время назначается 3A-3B, измените, чтобы новое требование к ресурсу (в порядке предпочтения) выглядело как 00-39 или 3C-FF или 3A-3B. Аналогичным образом, если список требований к ресурсам устройства имеет какие-либо альтернативные требования, он изменит их порядок, чтобы альтернативное требование было указано ранее в списке.
    2. Теперь устройство должно всегда выполнять процедуру перебаланса.

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE (Новые выделенные ресурсы. Если были созданы поддельные требования, скрывайте новые ресурсы от фактических драйверов.)

  4. Тест на сбой перебалансировки и перезапуска устройства PNP Этот тест инициирует перебалансировку, но когда драйвер фильтра получает команду на запуск после перебалансировки, он намеренно завершает её сбоем. Это приводит к неожиданному удалению IRP, за которым следует удаление IRP.

    Сначала процедура перебалансировки запускается и обеспечивает, чтобы драйвер был остановлен и снова запущен путем создания искусственных требований к ресурсам для устройства, которое не потребляет никакие ресурсы.

    • IRP_MN_QUERY_STOP_DEVICE (если этот IRP передается всеми драйверами. Тест уже охватывал случай, когда этот IRP отклонен.)
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS (если фактическое требование к ресурсу имеет значение NULL, фильтр назначает поддельные требования к ресурсу, поэтому существует остановка и запуск.)
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE (фильтр вызывает сбой этого IRP при подъеме. Это действие приводит к неожиданному инициированию удаления IRP.)
    • IRP_MN_SURPRISE_REMOVAL
    • IRP_MN_REMOVE (удаление запроса IRP)

    После завершения теста перебалансировки устройство будет удалено и переопределено, а также драйвер фильтра будет удален из стека.

Коды ошибок устройства

Если тест выдает сообщение об ошибке о том, что состояние устройства не в порядке, вы можете узнать больше о состоянии устройства с помощью диспетчера устройств. Сводка по различным кодам ошибок устройства см. в разделе "Сообщения об ошибках диспетчера устройств".

Отладка сбоев установки с помощью журналов API установки

Журналы API установки (setupapi.app.log и setupapi.dev.log) могут содержать полезные сведения для отладки сбоев установки драйвера, зарегистрированных этим тестом. Журналы API установки можно найти в каталоге %windir%\inf\ в тестовой системе.

Чтобы увеличить детализацию и потенциальную полезность этих журналов, установите следующий ключ реестра на 0x2000FFFF перед запуском теста на переустановку:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel

Как протестировать драйвер во время выполнения с помощью Visual Studio

Как выбрать и настроить тесты основной функциональности устройства

Тесты на основные функции устройств

Предоставленные простые плагины ввода-вывода WDTF

Как протестировать драйвер во время выполнения из командной строки