排除对设备基本组件测试记录的 WLAN SimpleIO 插件故障
Windows Hardware Lab Kit (Windows HLK) 和 Windows Drivers Kit (WDK) 中的设备基本组件测试使用 Windows 设备测试框架 (WDTF)SimpleIO 插件在运行时测试特定于设备的 IO。 如果对于进行测试的设备类型,存在 WDTF 插件,则测试会使用 IWDTFSimpleIOStressAction2 接口对设备测试 I/O。
本文包含的信息可帮助对 WDTF WLAN SimpleIO 插件在 WDK 和 Windows HLK 中进行设备和系统测试期间用于对无线网络适配器测试 IO 时所记录的故障进行故障排除。
配置要求
WLAN SimpleIO 插件需要使用可在运行时连接到的 AES 的基本 WPA2-PSK 无线网络。 无线网络的 SSID 和密码必须作为参数传递给需要它们的测试。 这些参数在需要它们的测试中按如下所示进行命名:Wpa2PskAesSsid 和 Wpa2PskPassword。 这两个参数的默认值分别为 kitstestssid 和 password。
测试覆盖率概述
WLAN SimpleIO 插件对受测无线适配器执行以下测试:
通过调用 WlanEnumInterfaces 函数来查找进行测试的 Wlan 接口。
通过调用 WlanGetProfile() 函数和 WlanDeleteProfile() 函数来删除名为 WDTFWlanTestProfile 的测试配置文件(如果存在)。
通过调用 WlanSetProfile() 函数并使用配置文件 XML 来创建名为 WDTFWlanTestProfile 的新测试配置文件。 该配置文件使用无线网络的 SSID 和密码作为测试的输入参数。
通过调用 WlanConnect() 函数来连接到新创建的配置文件。 应在 30 秒内收到“连接完成”通知。
通过调用网络列表管理器 API 的 INetworkListManager::GetConnectivity 方法来检查连接,并查找要设置的 NLM_CONNECTIVITY 枚举 NLM_CONNECTIVITY_IPV4_INTERNET 或 NLM_CONNECTIVITY_IPV4_LOCALNETWORK 标志。 插件在等待连接时会多次调用 GetConnectivity() 函数(如果需要),直到它最终超时并报告错误。
调用 GetAdaptersInfo() 函数以确定对应于测试适配器的网关地址。
通过调用 IcmpCreateFile() 函数来打开 ICMP 句柄,并在循环中调用某个内部函数几分钟,该函数在每次调用时都会对 IPv4 网关地址执行 ping 操作 500 次(使用 IcmpSendEcho() 函数以及 1 秒超时),如果在任何时候调用它时,失败率 > 10%,则记录错误消息。
通过调用 WlanDisconnect() 函数与网络断开连接。
通过调用 WlanGetProfile() 函数和 WlanDeleteProfile() 函数来删除测试配置文件。
故障排除指南
标识 WLAN SimpleIO 插件记录的故障
插件记录的错误消息会包含文本“WirelessPlugin:”。 紧跟在“WirelessPlugin:”后面的文本提供了有关错误的更多上下文。 例如:
WDTF_SIMPLE_IO : ERROR : - Open(802.11n USB Wireless LAN Card USB\VID_XXXX&PID_XXXX\5&35DEE9D9&0&5 ) Failed : WirelessPlugin: ConnectToTestProfile() - Failed to connect to test profile; Reason string: "The specific network is not available." HRESULT=0x80004005
常规故障排除指南
建议按照列出的顺序执行故障排除步骤:
查看测试文档以了解测试方案。
查看测试覆盖率概述以了解插件如何测试设备或驱动程序。
仔细查看错误消息前面的日志条目以及错误消息本身,以了解测试方案和故障原因。
对路由器设置进行故障排除。 请确保你可以手动连接到路由器、在建立连接后可以对网关地址执行 ping 操作并且路由器处于到测试计算机的范围内。 如果路由器未通过其中任何测试,请重置路由器。
在测试驱动程序中启用跟踪,并查看从测试记录错误以来的驱动程序跟踪。
启用 WLAN OS 跟踪,并查看从记录错误以来所记录的跟踪。 有关 WLAN OS 跟踪的详细信息,请参阅在 Windows 7 中使用网络跟踪进行故障排除的工具。
在某些情况下,从命令行手动运行失败测试(不使用 Windows HLK 或 WDK),然后查看插件的 WPP 跟踪会十分有用。 请参阅如何从命令行运行测试以及查看 WLAN 插件跟踪。
如何从命令行运行测试
建议使用 Windows HLK 客户端手动运行测试,因为 Windows HLK 客户端上安装了 WDTF。 按照如何在命令行上运行 Windows HLK 设备基本组件测试中的步骤执行操作。 在 Ndis.sys 和测试 Wi-Fi 驱动程序中启用驱动程序验证程序。
查看 WLAN 插件跟踪
WLAN 插件会使用 WPP 跟踪来跟踪信息和错误,你在调查 WLAN 插件记录的故障时可能会发现这些内容十分有用。 有关如何收集和查看 WDTF 跟踪的说明,请参阅收集和查看 Windows 设备测试框架 (WDTF) 跟踪。
注意
WDTF_Action_SimpleIO_Wireless 是可用于筛选的提供程序的名称。
示例跟踪输出
-->this(047BB318):?FinalConstruct@CWirelessImpl@@QEAAJXZ(void)
<--this(047BB318):?FinalConstruct@CWirelessImpl@@QEAAJXZ(): S_OK
o->this(047BB318):?SetTarget@CWirelessImpl@@UEAAJPEAUITarget@@UtagVARIANT@@@Z(pMainTarget = 0476BBAC, MoreTargets = 8)
INFO:Calling WlanOpenHandle() function
INFO:Calling WlanEnumInterfaces() function to find wlan interface under test: N300 USB Network Adapter" ({4138C082-E821-433C-ABB8-6FF864BF80B5})"
INFO:Found 1 wlan interfaces in total
INFO:Processing wlan interface: N300 USB Network Adapter""
INFO:Found the wlan interface under test!
INFO:Interface information: Interface Guid: {4138C082-E821-433C-ABB8-6FF864BF80B5}; Interface State: disconnected""
o<-this(047BB318):?SetTarget@CWirelessImpl@@UEAAJPEAUITarget@@UtagVARIANT@@@Z(): S_OK
o->this(047BB318):?Open@CWirelessImpl@@UEAAJXZ(void)
INFO:Calling WlanOpenHandle() function
-->this(047BB318):?FindAndDeleteTestProfile@CWirelessImpl@@AEAAJXZ(void)
INFO:Test profile WDTFWlanTestProfile" doesn't exist"
o<-this(047BB318):?FindAndDeleteTestProfile@CWirelessImpl@@AEAAJXZ(): S_OK
-->this(047BB318):?CreateTestProfile@CWirelessImpl@@AEAAJXZ(void)
INFO:Calling WlanSetProfile() with a profile XML to create a profile with name: WDTFWlanTestProfile"
o<-this(047BB318):?CreateTestProfile@CWirelessImpl@@AEAAJXZ(): S_OK
-->this(047BB318):?ConnectToTestProfile@CWirelessImpl@@AEAAJXZ(void)
INFO:Calling WlanRegisterNotification() to get notified of connect complete event
INFO:Calling WlanConnect() to connect to test profile with name: WDTFWlanTestProfile""
INFO:Waiting to receive connect complete notification
INFO:Received connect complete notification: 0
INFO:Calling WlanRegisterNotification() to unregister from notifications
o<-this(047BB318):?ConnectToTestProfile@CWirelessImpl@@AEAAJXZ(): S_OK
INFO:Calling an internal helper function to check for the connectivity state of the network connection
-->this(047BB318):?CheckForConnectivity@CWirelessImpl@@AEAAJPEA_N@Z(void)
INFO:Creating an instance of the NLM COM object
INFO:Calling NLM GetNetworkConnections() to get a list of network connections
INFO:Iterating through the network connections found looking for the connection corresponding to the test adapter ({4138C082-E821-433C-ABB8-6FF864BF80B5})
INFO:Calling NLM GetAdapterId() on a network connection found
INFO:Calling NLM GetAdapterId() on a network connection found
INFO:Found a network connection using the test adapter!
INFO:Calling NLM GetConectivity() on a network connection using the test adapter
INFO:NLM GetConectivity() reported the following connectivity state: 66
INFO:NLM GetConectivity() reported IPv4 connectivity!
o<-this(047BB318):?CheckForConnectivity@CWirelessImpl@@AEAAJPEA_N@Z(): S_OK
-->this(047BB318):?RefreshIPInfo@CWirelessImpl@@AEAAJXZ(void)
INFO:Calling GetAdaptersInfo() function to find IP address info for adapter {4138C082-E821-433C-ABB8-6FF864BF80B5}""
INFO:Found the adapter we are looking for!
INFO:Adapter Info: Index: 4, IPv4 Address: 192.168.1.147, Gateway Address: 192.168.1.1
o<-this(047BB318):?RefreshIPInfo@CWirelessImpl@@AEAAJXZ(): S_OK
INFO:Calling IcmpCreateFile() function
INFO:Pinging gateway (192.168.1.1) 10 times
-->this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(numPings: 10)
INFO:Calling IcmpSendEcho() to ping gateway (192.168.1.1) 10 times with a random input buffer of size 255 and a timeout value of 1000 milliseconds
o<-this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(): S_OK
o<-this(047BB318):?Open@CWirelessImpl@@UEAAJXZ(): S_OK
o->this(047BB318):?RunIO@CWirelessImpl@@UEAAJXZ(void)
-->this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(numPings: 500)
INFO:Calling IcmpSendEcho() to ping gateway (192.168.1.1) 500 times with a random input buffer of size 255 and a timeout value of 1000 milliseconds
o<-this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(): S_OK
o<-this(047BB318):?RunIO@CWirelessImpl@@UEAAJXZ(): S_OK
o->this(047BB318):?RunIO@CWirelessImpl@@UEAAJXZ(void)
-->this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(numPings: 500)
INFO:Calling IcmpSendEcho() to ping gateway (192.168.1.1) 500 times with a random input buffer of size 255 and a timeout value of 1000 milliseconds
o<-this(047BB318):?TestPingGateway@CWirelessImpl@@AEAAJHH@Z(): S_OK
o<-this(047BB318):?RunIO@CWirelessImpl@@UEAAJXZ(): S_OK
...
...
...
o->this(047BB318):?Close@CWirelessImpl@@UEAAJXZ(void)
-->this(047BB318):?DisconnectFromTestProfile@CWirelessImpl@@AEAAJXZ(void)
INFO:Calling WlanDisconnect() to disconnect
o<-this(047BB318):?DisconnectFromTestProfile@CWirelessImpl@@AEAAJXZ(): S_OK
-->this(047BB318):?FindAndDeleteTestProfile@CWirelessImpl@@AEAAJXZ(void)
INFO:Calling WlanDeleteProfile() to delete the previously created test profile with name WDTFWlanTestProfile""
o<-this(047BB318):?FindAndDeleteTestProfile@CWirelessImpl@@AEAAJXZ(): S_OK
o<-this(047BB318):?Close@CWirelessImpl@@UEAAJXZ(): S_OK