PnP 测试(设备基础功能)

设备基础知识 PnP 测试强制驱动程序处理几乎所有 PnP IRP;但是,有三个特别强调的领域:删除、重新平衡和意外删除。 PnP 测试提供了一种机制,用于单独测试其中的每一个,或 (即作为压力测试) 一起测试它们。 此 PnP 测试是结合使用用户模式 API 调用 (通过测试应用程序) 和内核模式 API 调用 (通过上层筛选器驱动程序) 完成的。

PNP 测试

即插即用 (PnP) 测试在驱动程序和用户模式组件中执行与 PnP 相关的各种代码路径。 应在测试计算机上启用 驱动程序验证程序 的情况下运行 PnP 测试。 有关启用驱动程序验证程序的信息,请参阅 驱动程序项目的驱动程序验证程序属性

测试 说明

禁用增强型设备测试 (EDT) 支持

此测试将测试筛选器驱动程序 (msdmfilt.sys) 作为使用 DQ 参数指定的设备上的上层筛选器进行卸载。 此测试筛选器作为在此测试类别中运行测试的一部分进行安装

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP (禁用和启用) 重启之前和之后使用 IO

此测试在系统重启的设备上执行基本的 PnP 禁用/启用和 I/O。

测试二进制文件: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

测试方法: PNP_DisableEnable_Reboot_With_IO_Before_And_After

参数: - 请参阅 设备基础知识测试参数

DQ

IOPeriod

PNP (在前后禁用和启用 I/O)

此测试在设备上执行 I/O 和基本 PnP 禁用/启用。

此测试执行以下操作:

  1. 验证系统中是否没有设备报告设备问题代码。
  2. 使用 WDTF 简单 I/O 插件测试系统中每台设备的 I/O。 有关详细信息,请参阅提供的 WDTF 简单 I/O 插件
  3. 使用 WDTF PnP 操作接口禁用和启用系统上的每个设备,有关详细信息,请参阅 IWDTFPNPAction2::D isableDeviceIWDTFPNPAction2::EnableDevice 方法。
  4. 验证系统中是否没有设备报告设备问题代码。
  5. 使用 WDTF 简单 I/O 插件测试系统中每台设备的 I/O。 有关详细信息,请参阅提供的 WDTF 简单 I/O 插件
  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 删除设备测试

此测试使用 SetupDi API 发送 DIF_REMOVE 请求,让安装程序删除设备。

测试二进制文件:Devfund_PnPDTest.dll

测试方法:PNPDIFRemoveAndRescanParentDevice

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 禁用和启用设备测试

此测试禁用和启用目标设备。

测试二进制文件:Devfund_PnPDTest.dll

测试方法:PNPDisableAndEnableDevice

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP 重新平衡失败重启设备测试

此测试使用 EDT 筛选器驱动程序尝试将IRP_MN_STOP_DEVICE发送到目标设备堆栈。 然后,EDT 筛选器驱动程序IRP_MN_START_DEVICE遵循IRP_MN_STOP_DEVICE请求 (失败,) 触发意外删除目标设备。

有关详细信息,请参阅 关于重新平衡测试

测试二进制文件:Devfund_PnPDTest.dll

测试方法:PNPTryStopDeviceAndFailRestart

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 重新平衡请求新资源设备测试

此测试使用 EDT 筛选器驱动程序尝试将IRP_MN_STOP_DEVICE发送到目标设备堆栈。 它还操作设备的资源要求,以最大程度地提高将新资源分配给设备的机会。

有关详细信息,请参阅 关于重新平衡测试

测试二进制文件:Devfund_PnPDTest.dll

测试方法:PNPTryStopDeviceRequestNewResourcesAndRestartDevice

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 删除设备测试

此测试会导致将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 意外删除设备测试

此测试使用 EDT 筛选器驱动程序将IRP_MN_SURPRISE_REMOVAL发送到目标设备堆栈。

有关详细信息,请参阅 关于意外删除测试

测试二进制文件:Devfund_PnPDTest.dll

测试方法:PNPSurpriseRemoveAndRestartDevice

参数: - 请参阅 设备基础知识测试参数

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

关于设备删除测试

  • PNP 删除设备测试
  • PNP 取消删除设备测试

设备删除测试包括IRP_MN_QUERY_REMOVE_DEVICE、IRP_MN_CANCEL_REMOVE_DEVICE和IRP_MN_REMOVE_DEVICE。

测试尝试在目标设备堆栈上安装其上层筛选器驱动程序。 此尝试会导致生成查询删除 IRP。

如果此查询删除 IRP 失败,测试会重启计算机,将筛选器驱动程序放到设备堆栈上。 如果未阻止删除请求,设备堆栈将被删除,然后使用设备堆栈上的筛选器驱动程序重启。

使用设置 API 进行测试会导致将查询删除 IRP 发送到设备堆栈。 筛选器驱动程序会使此删除请求失败,因此会发送取消删除 IRP。 筛选器驱动程序将断言取消删除已成功。

接下来,测试应用程序调用相应的类安装程序和任何已注册的共同安装程序来禁用或启用并删除或重新枚举设备(这会测试使用 DICS_DISABLE、DICS_ENABLE 和 DICS_PROPCHANGE 处理 DIF_PROPERTYCHANGE 的类和共同安装程序)。 收到 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 停止 (重新平衡) 设备测试
  • 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 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 重新平衡请求新资源设备测试 此测试启动重新平衡,并操作设备的资源要求,以最大程度地提高实际新资源分配给设备的机会。 此选项还有助于没有资源的设备实际完成完整的重新均衡过程:

    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 (新分配的资源。如果创建了虚假要求,请从实际 drivers 中屏蔽新资源。)

  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

    重新平衡测试完成后,将卸载设备并重新进行枚举,同时从堆栈中删除筛选器驱动程序。

设备错误代码

如果测试显示一条错误消息,指出设备状态不正常,可以通过设备管理器了解有关设备状态的详细信息。 有关各种设备错误代码的摘要,请参阅设备管理器错误消息

使用安装 API 日志调试安装失败

安装程序 API 日志 (setupapi.app.log 和 setupapi.dev.log) 可能包含用于调试此测试记录的驱动程序安装失败的有用信息。 可以在测试系统上的 %windir%\inf\ 目录下找到安装 API 日志。

若要增加这些日志的详细程度和潜在用途,请在运行重新安装测试之前将以下注册表项设置为 0x2000FFFF:

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

如何在运行时使用 Visual Studio 测试驱动程序

如何选择和配置设备基础功能测试

设备基础功能测试

Provided WDTF Simple I/O plug-ins(提供的 WDTF 简单 I/O 插件)

如何在运行时通过命令提示符测试驱动程序