windows网络适配器驱动开发-使用 NetAdapterCx PLDR 恢复无响应的 NIC(上)

windows网络适配器驱动开发-使用 NetAdapterCx PLDR 恢复无响应的 NIC(上) NetAdapterCx 提供了一种通过平台级设备重置 (PLDR) 重置和恢复故障网络设备的有效方法。 在不重新启动整个 Windows 系统的情况下PLDR 操作会拆除受影响的网络设备的堆栈确保其硬件和驱动程序从空白状态重启。 NetAdapterCx 还允许客户端驱动程序在进行平台级重置之前从故障设备收集诊断。检测到异常设备行为时将触发 PLDR。 它可以通过以下任一方式触发操作系统 (OS) 。 例如当传输中的数据包在驱动程序中卡住太长时间时OS 端可能会触发 PLDR。独立硬件供应商 (IHV) 客户端驱动程序。 例如当驱动程序检测到其设备对其控制命令无响应时客户端驱动程序可能会请求 NetAdapterCx 触发 PLDR。为了提供用户友好的设备故障和恢复微软建议 IHV 和原始设备制造商 (OEM) 为其网络设备支持 PLDR。注册可选的 诊断 集合回调作为 NetAdapterCx 重置和恢复过程的一部分客户端驱动程序可以在设备进行平台级重置之前从故障设备收集特定于设备的诊断。 IHV 和 Microsoft 可以在故障后分析中使用此数据来提高其产品质量。注册NET_DEVICE_RESET_CAPABILITIES客户端驱动程序需要在其EVT_WDF_DRIVER_DEVICE_ADD回调函数中初始化和注册NET_DEVICE_RESET_CAPABILITIES结构以便收集特定于设备的诊断。NET_DEVICE_RESET_CAPABILITIES 包含唯一 GUID。 IHV 指定此 GUID稍后使用它从内存转储识别和检索重置诊断。 例如.enumtag 命令可用于检索诊断。EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS事件回调函数。 NetAdapterCx 调用此回调来收集诊断。 如果客户端驱动程序提供 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回调NetAdapterCx 将使用 专用 线程在客户端驱动程序上调用它。以下示例演示如何 将NET_DEVICE_RESET_CAPABILITIES 注册到 NetAdapterCxEVT_WDF_DRIVER_DEVICE_ADD EvtWdfDriverDeviceAdd; EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtDeviceCollectResetDiagnostics; NTSTATUS EvtWdfDriverDeviceAdd( WDFDRIVER Driver, PWDFDEVICE_INIT DeviceInit ) { ... NET_DEVICE_RESET_CAPABILITIES resetCapabilities; NET_DEVICE_RESET_CAPABILITIES_INIT( resetCapabilities, DUMMY_GUID, EvtDeviceCollectResetDiagnostics); NetDeviceInitSetResetCapabilities(DeviceInit, resetCapabilities); ... }有关如何初始化 NET_DEVICE_RESET_CAPABILITIES 结构的信息请参考下面的原型定义void NET_DEVICE_RESET_CAPABILITIES_INIT( [_Out_] NET_DEVICE_RESET_CAPABILITIES *ResetCapabilities, [_In_] GUID ResetDiagnosticsGuid, [_In_] PFN_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtNetDeviceCollectResetDiagnostics );若要了解如何将 NET_DEVICE_RESET_CAPABILITIES 结构播发到 NetAdapterCx请参考下面的原型定义void NetDeviceInitSetResetCapabilities( [_Inout_] PWDFDEVICE_INIT DeviceInit, [_In_] const NET_DEVICE_RESET_CAPABILITIES *ResetCapabilities );