共用方式為


使用 NetAdapterCx PLDR 復原沒有回應的 NIC

NetAdapterCx 透過平臺層級裝置重設 (PLDR) 提供有效方法,以重設和復原故障的網路裝置。 若未重新啟動整個 Windows 系統,PLDR 作業會卸除受影響的網路裝置堆疊,以確保其硬體和驅動程式會從空白狀態重新啟動。 NetAdapterCx 也可讓用戶端驅動程式在進行平臺層級重設之前,先從失敗的裝置收集診斷。

偵測到異常裝置行為時,會觸發 PLDR。 它可以由下列其中一項觸發:

  • 操作系統(OS)。 例如,當傳輸中的封包在驅動程式中卡得太久時,作業系統端可能會觸發 PLDR。

  • 獨立硬體廠商 (IHV) 客戶端驅動程式。 例如,當驅動程式偵測到其裝置沒有回應其控制命令時,用戶端驅動程式可能會要求 NetAdapterCx 觸發 PLDR。

為了提供使用者友好的裝置故障與復原,我們建議 IHV 和原始設備製造商(OEM)支援其網路裝置的 PLDR。 如需 PLDR 的詳細資訊,請參閱 重設和復原裝置。 NetAdapterCx 不會透過函式層級裝置重設來復原網路裝置。

註冊可選的診斷資料收集的回呼功能

在 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 註冊至 NetAdapterCx:

EVT_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 結構的詳細資訊,請參閱 NET_DEVICE_RESET_CAPABILITIES_INIT

若要瞭解如何將 NET_DEVICE_RESET_CAPABILITIES 結構公告至 NetAdapterCx,請參閱 NetDeviceInitSetResetCapabilities

實作 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS

重設和復原順序可以隨時發生。 因此,客戶端驅動程式的 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回呼實作必須考慮下列事項:

  • NetAdapterCx 會將 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回呼與 關閉電源序列期間可能發生的其他回呼同步處理。 客戶端驅動程式可以假設,直到 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 返回之前,NetAdapterCx 不會調用像是封包佇列取消/停止、硬體釋放和設備物件刪除等回調。

  • 處理診斷收集時,客戶端驅動程序必須特別小心,以避免死結。 它必須考慮到硬體可能已經處於失敗狀態。

  • EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 必須儘快完成,讓 PLDR 程式的其餘部分可以繼續進行。 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 必須可靠,而且必須在 3 秒內傳回。

  • NetAdapterCx 總是會在PASSIVE_LEVEL 調用 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS

若要將診斷提交至 NetAdapterCx,用戶端驅動程式會執行下列步驟:

  1. 從分頁或非分頁集區預先配置平面緩衝區,以收集重置診斷資訊。 驅動程式應該預先配置此緩衝區,以避免在裝置重設期間發生記憶體不足錯誤。

  2. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回呼內,通過呼叫 NetDeviceStoreResetDiagnostics API,將診斷提交為平面資料緩衝區。 用戶端驅動程序必須在 PASSIVE_LEVEL 呼叫 NetDeviceStoreResetDiagnostics API。

  3. NetDeviceStoreResetDiagnostics 傳回之後,請釋放數據緩衝區。

重要

NetDeviceStoreResetDiagnostics API 只能在 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回呼中呼叫。 在先前 NetDeviceStoreResetDiagnostics 傳回之後,它也無法用來重新傳送診斷數據。 違反上述任一情形會導致系統檢查錯誤。

重要

重設診斷的大小限制為 1 MB。

客戶端驅動程式如何請求 PLDR

用戶端驅動程式會在偵測到裝置失敗時,使用 NetAdapterCx NetDeviceRequestReset API 觸發 PLDR。 NetDeviceRequestReset 會立即返回給用戶端驅動程式。 NetAdapterCx 重設和復原順序 所描述的重設和復原程序會被觸發,並且與 NetDeviceRequestReset 呼叫是非同步的。

在任何指定時間,都只能執行一個 PLDR 作業。 因此,當 PLDR 作業已啟動時,NetDeviceRequestReset 的後續呼叫沒有任何作用。

呼叫 NetDeviceRequestReset 如果 關閉電源序列已經啟動,則也不會有任何作用。

NetAdapterCx 重置和復原次序

當 OS 或用戶端驅動程式觸發 PLDR 時,會發生下列順序:

  1. 收集重設診斷:NetAdapterCx 會叫用用戶端驅動程式的 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 回呼,以從失敗的裝置收集診斷。 例如,驅動程式可能會收集裝置韌體快照集。 此步驟是選擇性的,只有在用戶端驅動程式已註冊 NET_DEVICE_RESET_CAPABILITIES 結構時才會發生。 否則,NetAdapterCx 會略過此步驟。

  2. 執行 PLDR:NetAdapterCx 會執行平臺層級的裝置重設作業。 NetAdapterCx 電源會回收硬體,並卸除軟體裝置堆疊。

下圖說明 NetAdapterCx 重設和復原順序:

說明 NetAdapterCx 重設和復原順序的流程圖。