Поделиться через


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

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

Тесты PNP

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

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

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

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

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

TestCycles

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::D isableDevice и 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

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

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

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

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

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

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

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF Remove Device Test

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

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

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

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

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

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

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

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

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP Rebalance Fail Restart Device Test

В этом тесте используется драйвер фильтра EDT для отправки IRP_MN_STOP_DEVICE в целевые стеки устройств. Затем драйвер фильтра EDT завершается сбоем IRP_MN_START_DEVICE запросов (которые следуют за запросами IRP_MN_STOP_DEVICE), чтобы активировать неожиданное удаление целевых устройств.

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

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

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

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Rebalance Request New Resources Device Test

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

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

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

Метод теста: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Remove Device Test

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

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

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

Метод теста: PNPRemoveAndRestartDevice

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

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

В этом тесте используется драйвер фильтра EDT для отправки IRP_MN_STOP_DEVICE в целевые стеки устройств.

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

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

Метод теста: PNPTryStopAndRestartDevice

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Тест PNP Surprise Remove Device

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

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

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

Метод теста: PNPSurpriseRemoveAndRestartDevice

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

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

  • PNP Remove Device Test
  • Тест отмены удаления устройства 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 Surprise Remove Device

Тест "Неожиданное удаление" включает IRP_MN_SURPRISE_REMOVAL, за которым следует IRP_MN_REMOVE_DEVICE.

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

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

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

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

  • Проверка устройства остановки PNP (повторная балансировка)
  • PNP Rebalance Request New Resources Device Test
  • PNP Rebalance Fail Restart Device Test
  • Проверка устройства отмены отмены PNP

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

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

  1. Проверка устройства остановки PNP (повторная балансировка) Этот тест инициирует процедуру повторного балансировки, которая приводит к IRP_MN_QUERY_STOP_DEVICE PnP IRP в драйвер устройства.

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

    Если все стеки устройств, участвующие в передаче запроса, останавливаются, тест продолжается с повторной балансировкой и отправляет IRP_MN_QUERY_RESOURCE_REQUIREMENTS и IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS для поиска требований к ресурсам устройств.

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

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

      Если устройство действительно потребляет ресурсы, процедура повторного балансировки завершается с IRP_MN_STOP_DEVICE и IRP_MN_START_DEVICE IRP.

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

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

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

  3. PNP Rebalance Request New Resources Device Test Этот тест инициирует повторную балансировку, а также управляет потребностью устройства в ресурсах, чтобы максимально увеличить вероятность того, что на самом деле новые ресурсы будут выделены устройству. Этот параметр также помогает устройству без ресурсов пройти полную процедуру повторной балансировки:

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

      • 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 Rebalance Fail Restart Device Test Этот тест инициирует повторную балансировку, но когда драйвер фильтра получает запуск после повторного балансировки, он намеренно завершается ошибкой, что приводит к неожиданному удалению 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

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

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

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

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

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

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

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

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

Выбор и настройка тестов "Основы устройства"

Тесты по основам устройств

Предоставленные подключаемые модули простого ввода-вывода WDTF

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