中繼驅動程式必須處理將電源設定為工作狀態的要求(網路裝置電源狀態為 D0)和睡眠狀態(D1、D2 或 D3 的網路裝置電源狀態)。 中繼驅動程式也應該維護電源狀態變數和 StandBy 旗標。 本主題會進一步討論這些問題。
如需中繼驅動程式電源管理的範例,請參閱 GitHub 上 Windows 驅動程式範例 存放庫中的 NDIS MUX 中繼驅動程式和 Notify Object 驅動程式範例。
處理將電源設置為睡眠狀態的請求
當中繼驅動程序必須處理將電源設置為睡眠狀態的要求時,會有兩種情況發生:
NDIS 要求中繼驅動程式的虛擬迷你埠上邊緣進入睡眠狀態。
中繼驅動程式通訊協定下邊緣會在收到隨插即用 (PnP) 事件通知時,處理基礎迷你埠驅動程序轉換為睡眠狀態。
這些事件可以依任何順序發生,且一個事件不一定會伴隨另一個事件。
當中繼驅動程式的虛擬迷你埠上邊緣收到將電源設定為睡眠狀態的要求時,處理要求的事件順序如下所示:
NDIS 會呼叫每個系結至虛擬小型端口的協定驅動程式的 ProtocolNetPnPEvent 函數。 對 ProtocolNetPnPEvent 的呼叫指定了 NetEventSetPower 事件,用於睡眠狀態。 系結到中繼驅動程式的通訊協定驅動程式會停止向中繼驅動程式虛擬迷你埠傳送網路資料和發送 OID 要求。 中介驅動程式的協定低層可以繼續向下傳送網路數據和請求,直到 NDIS 指示基礎迷你埠驅動程式正在過渡到休眠狀態。
NDIS 會在發出 NetEventSetPower 事件之後暫停上層驅動程式,然後暫停虛擬小型埠。 暫停的指定原因是轉換成低功率狀態。 如需暫停虛擬迷你連接埠的詳細資訊,請參閱 暫停配接器。
注意 虛擬迷你埠在處於低功率狀態時,除了 OID_PNP_SET_POWER之外,任何 OID 要求都不能被傳送至其上。
NDIS 會向中繼驅動程式的虛擬迷你埠發出 OID_PNP_SET_POWER 要求。 中繼驅動程式會藉由傳回NDIS_STATUS_SUCCESS來接受要求。 中繼驅動程式不得將OID_PNP_SET_POWER要求傳播至基礎迷你埠驅動程式。 中繼驅動程式完成此要求之後,即使它持續接收來自基礎迷你埠驅動程式的網路數據和狀態指示,它不應該指出更多已接收的網路數據或狀態。
當中繼驅動程式的通訊協定下邊緣將基礎迷你埠驅動程序轉換為睡眠狀態時,處理轉換的事件順序如下所示:
NDIS 會呼叫中繼驅動程式通訊協定下邊緣的 ProtocolNetPnPEvent 函式。 對 ProtocolNetPnPEvent 的呼叫指定了 NetEventSetPower 事件,用於睡眠狀態。 中繼驅動程式必須停止傳送網路資料和向基礎迷你埠驅動程式發出 OID 要求。 如果有尚未完成的要求或傳送,中繼驅動程式應該會從呼叫 ProtocolNetPnPEvent傳回NDIS_STATUS_PENDING。 中繼驅動程式會呼叫 NdisCompleteNetPnPEvent,以完成 對 protocolNetPnPEvent的呼叫。 中繼驅動程式的通訊協定邊緣仍然可以從基礎迷你埠驅動程式收到封包和狀態指示。 可以忽略已接收的網路數據。 如果中繼驅動程序的實作取決於監視基礎迷你埠驅動程式的狀態,仍應監視狀態指示。
NDIS 會暫停中繼驅動程式的協定邊界,然後在發出 NetEventSetPower 事件之後暫停基礎小型埠配接卡。 暫停的指定原因是轉換成低功率狀態。 如需暫停通訊協定系結的詳細資訊,請參閱 暫停系結。
請注意: 當基礎迷你埠適配器處於低功耗狀態時,無法發送任何 OID 請求,OID_PNP_SET_POWER是例外。
NDIS 會向基礎迷你埠驅動程序發出 OID_PNP_SET_POWER 要求。 不過,如果基礎迷你埠驅動程式不支援電源管理,將會停止。 在此情況下,即使 NDIS 停止基礎迷你埠驅動程式,也不會要求中繼驅動程式通訊協定從基礎迷你埠驅動程式和 NIC 解除系結。 在基礎迷你埠驅動程序順利完成處理 OID 之後(或迷你埠驅動程式已停止),它不會再指出任何網路數據或狀態。
處理設定電源請求轉為工作狀態
有兩種情況涉及中繼驅動程式處理電源要求以達到工作狀態:
NDIS 要求中繼驅動程式的虛擬迷你埠上邊緣移至工作狀態。
中介驅動程式協定的下層在收到隨插即用(PnP)事件通知時,負責處理底層微型埠驅動程式的轉換進入運作狀態。
這些事件可以依任何順序發生,而且一個事件不一定伴隨另一個事件。
當中繼驅動程式的虛擬迷你埠上邊緣收到將電源設定為工作狀態的要求時,處理要求的事件順序如下所示:
NDIS 對中繼驅動程式的虛擬小端口發出 OID_PNP_SET_POWER。 中繼驅動程式在設定電源要求後回傳NDIS_STATUS_SUCCESS。 中繼驅動程式不得將OID_PNP_SET_POWER要求傳播至基礎迷你埠驅動程式。
NDIS 會重新啟動虛擬小型埠,然後在發出設定電源 OID 後重新啟動上層驅動程式。 如需重新啟動虛擬迷你連接埠的詳細資訊,請參閱 啟動配接器。
NDIS 會呼叫上層通訊協定驅動程式的 ProtocolNetPnPEvent 函式。 呼叫 ProtocolNetPnPEvent 會指定 NetEventSetPower 事件來設定工作狀態 (D0)。 系結通訊協定驅動程式可以開始將網路數據傳送至中繼驅動程式的虛擬迷你埠。
當中繼驅動程式的通訊協定下邊緣將基礎迷你埠驅動程序轉換為工作狀態時,處理轉換的事件順序如下所示:
NDIS 會發出 OID_PNP_SET_POWER 給基礎迷你埠驅動程式,或在基礎迷你埠驅動程式停止時,呼叫其 MiniportInitializeEx 處理程式。
NDIS 會重新啟動基礎迷你埠驅動程式,然後在發出 OID 之後,重新啟動中繼 NDIS 和基礎迷你埠適配卡的通訊協議邊緣。 如需暫停通訊協定系結的詳細資訊,請參閱 重新啟動系結。
NDIS 會呼叫中繼驅動程式的 ProtocolNetPnPEvent 函式。 呼叫 ProtocolNetPnPEvent 會指定 NetEventSetPower 事件來設定工作狀態 (D0)。 中繼驅動程式可以開始將網路數據傳送至基礎迷你埠驅動程式。
電源狀態和待機旗標
中繼驅動程式應為每個虛擬迷你埠實例以及它所系結的每個基礎迷你埠驅動程式維護個別的電源狀態變數。 中繼驅動程式也應該針對每個虛擬迷你埠維護一個 StandingBy 旗標,也就是:
當虛擬迷你埠或基礎迷你埠驅動程式的電源狀態離開 D0 時,設定為 TRUE。
當虛擬迷你埠或基礎迷你埠驅動程式的電源狀態回到 D0 時,設定為 FALSE。
注意 針對 MUX 中繼驅動程式,可以有多個與基礎迷你埠驅動程式相關聯的虛擬迷你埠,或與每個虛擬迷你埠相關聯的多個基礎迷你埠。 當任何迷你埠適配卡的電源狀態變更時,所有相關聯迷你埠的行為也會受到影響。 行為受影響的方式是取決於具體的實作。 例如,實作負載平衡故障轉移 (LBFO) 解決方案的驅動程式,在停用單一基礎迷你埠驅動程式時,可能不會停用虛擬迷你埠。 然而,依賴於所有基礎迷你埠驅動程式的驅動程序實作,在任何基礎迷你埠驅動程式停用時,都需要停用虛擬迷你埠。
中繼驅動程式在處理要求時,應該使用 StandingBy 旗標和電源狀態變數,如下所示:
除非虛擬迷你埠及其基礎迷你埠適配卡都位於 D0 中,否則驅動程式的 MiniportSendNetBufferLists 函式應該會失敗。
驅動程式的 MiniportOidRequest 函式應該一律成功執行 OID_PNP_QUERY_POWER,以確保驅動程式能接收到後續的 OID_PNP_SET_POWER 要求。
驅動程式的 MiniportOidRequest 函式如果虛擬迷你埠不在 D0 中,或當 StandingBy TRUE時,應該會失敗。 否則,如果基礎迷你埠驅動程式不在 D0 中,它應該將單一要求排入佇列。 當基礎迷你端口驅動程式的狀態進入 D0 時,應處理佇列中的請求。
中繼驅動程式虛擬迷你埠只有在基礎迷你埠驅動程式和虛擬迷你埠都位於 D0 時,才應該報告狀態。