设备基础 PnP 测试要求驱动程序处理几乎所有 PnP IRP;但是,有三个方面特别强调:移除、重新平衡和意外移除。 PnP 测试提供一种机制来单独测试其中每个测试,或一起测试它们(即作为压力测试)。 此 PnP 测试通过使用用户模式 API 调用(通过测试应用程序)和内核模式 API 调用(通过上层筛选器驱动程序)的组合来完成。
PNP 测试
即插即用(PnP)测试在驱动程序和用户模式组件中执行与 PnP 相关的各种代码路径。 应在测试计算机上启用 驱动程序验证程序 的情况下运行 PnP 测试。 有关启用驱动程序验证程序的信息,请参阅 驱动程序项目的驱动程序验证程序属性。
| 测试 | DESCRIPTION |
|---|---|
禁用增强型设备测试 (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 禁用/启用。 此测试执行以下操作
测试二进制文件: 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。
测试尝试在目标设备堆栈上安装其上筛选器驱动程序。 此次尝试会生成一个Query-Remove 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 停止 (重新平衡) 设备测试
- PNP 重新平衡请求新资源设备测试
- PNP 重新平衡失败后重启设备测试
- PNP 取消停止设备测试
与删除测试一样,测试应用程序会尝试将上部筛选器添加到目标设备堆栈,然后使用 setupDiCallClassInstaller 和 DIF_PROPERTYCHANGE 重新启动设备堆栈。 如果此尝试未成功(也就是说,如果目标设备堆栈上的某人未能通过查询删除 IRP),测试将重启计算机以测试重新平衡。
根据所选的重新平衡测试,会发生以下事件:
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 完成重新均衡过程。
使用此选项时,设备的资源不会更改。
PNP 取消停止设备测试:此测试启动重新均衡过程,但筛选器驱动程序故意导致查询停止 IRP(输入/输出请求包)失败。 IRP 的顺序类似于IRP_MN_QUERY_STOP_DEVICE(筛选器驱动程序在出现时失败),导致重新平衡取消)和IRP_MN_CANCEL_STOP_DEVICE。
使用此选项时,设备的资源不会更改
PNP 重新平衡请求新资源设备测试 此测试会启动重新平衡,并调整设备的资源需求,以最大限度地增加实际新资源分配给设备的机会。 此选项还有助于没有资源的设备实际完成完整的重新平衡过程:
首先启动简单的重新平衡,导致以下 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。 同样,如果设备资源要求列表具有任何备用要求,它将更改其顺序,以便备用要求早于列表中。
现在,设备应始终完成重新平衡过程。
IRP_MN_STOP_DEVICE
IRP_MN_START_DEVICE (新分配的资源。如果创建了虚假要求,请屏蔽实际驱动程序中的新资源。
PNP 重新均衡失败重启设备测试 此测试会启动重新均衡,但当筛选器驱动程序在重新平衡后开始时,它会故意失败,这会导致意外删除 IRP 后删除 IRP。
首先,它会启动重新平衡过程,并确保驱动程序通过生成不消耗任何资源的设备的虚假资源要求来停止和启动。
- IRP_MN_QUERY_STOP_DEVICE(假设此 IRP 由所有驱动程序传递)。测试已涵盖此 IRP 失败的情况。
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS(如果实际资源需求为空,则将筛选并分配虚拟资源需求,因此会发生一次停止和启动。)
- IRP_MN_STOP_DEVICE
- IRP_MN_START_DEVICE(筛选器在上升过程中使该 IRP 失败。此操作会导致意外移除 IRP。)
- IRP_MN_SURPRISE_REMOVAL
- IRP_MN_REMOVE
重新平衡测试完成后,设备将卸载并恢复,同时从堆栈中删除筛选器驱动程序。
设备错误代码
如果测试显示一条错误消息,指出设备状态不正常,则可以通过设备管理器了解有关设备状态的详细信息。 有关各种设备错误代码的摘要,请参阅 Device Manager 错误消息。
使用安装 API 日志调试安装失败
安装程序 API 日志(setupapi.app.log和setupapi.dev.log)可能包含用于调试此测试记录的驱动程序安装失败的有用信息。 可以在测试系统上的 %windir%\inf\ 目录下找到安装程序 API 日志。
若要增加这些日志的详细程度和潜在用途,请在运行“重新安装”测试之前,将以下注册表项设置为0x2000FFFF:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel