共用方式為


處理設定電源要求

中繼驅動程式必須處理將電源設定為工作狀態的要求(網路裝置電源狀態為 D0)和睡眠狀態(D1、D2 或 D3 的網路裝置電源狀態)。 中繼驅動程式也應該維護電源狀態變數和 StandBy 旗標。 本主題會進一步討論這些問題。

如需中繼驅動程式電源管理的範例,請參閱 GitHub 上 Windows 驅動程式範例存放庫中的 NDIS MUX 中繼驅動程式和通知物件驅動程式範例。

處理設定電源要求至睡眠狀態

有兩種情況:中繼驅動程序必須處理睡眠狀態的設定電源要求:

  • NDIS 要求中繼驅動程式的虛擬迷你埠上邊緣進入睡眠狀態。

  • 中繼驅動程式通訊協定下邊緣會在收到 隨插即用 (PnP) 事件通知時,處理基礎迷你埠驅動程序轉換為睡眠狀態。

這些事件可以依任何順序發生,且一個事件不一定會伴隨另一個事件。

當中繼驅動程式的虛擬迷你埠上邊緣收到將電源設定為睡眠狀態的要求時,處理要求的事件順序如下所示:

  1. NDIS 會呼叫 系結至虛擬迷你埠之每個通訊協定驅動程式的 ProtocolNetPnPEvent 函式。 對 ProtocolNetPnPEvent呼叫會指定睡眠狀態的 NetEventSetPower 事件。 系結至中繼驅動程式的通訊協定驅動程式會停止傳送網路數據,並將 OID 要求傳送至中繼驅動程式虛擬迷你埠。 中繼驅動程式的通訊協定下邊緣可以繼續傳送網路數據和要求,直到 NDIS 指出基礎迷你埠驅動程式正在轉換到睡眠狀態為止。

  2. NDIS 會在發出 NetEventSetPower 事件之後暫停過度的驅動程式,然後暫停虛擬迷你埠。 暫停的指定原因是轉換成低功率狀態。 如需暫停虛擬迷你埠的詳細資訊,請參閱 暫停配接器

    注意 除了OID_PNP_SET_POWER之外,沒有 OID 要求可以在處於低功率狀態時傳送至虛擬迷你埠。

  3. NDIS 會向中繼驅動程式的虛擬迷你埠發出 OID_PNP_SET_POWER 要求。 中繼驅動程式會藉由傳回NDIS_STATUS_SUCCESS來接受要求。 中繼驅動程式不得將OID_PNP_SET_POWER要求傳播至基礎迷你埠驅動程式。 中繼驅動程式完成此要求之後,即使它持續接收來自基礎迷你埠驅動程式的網路數據和狀態指示,它不應該指出更多已接收的網路數據或狀態。

當中繼驅動程式的通訊協定下邊緣將基礎迷你埠驅動程序轉換為睡眠狀態時,處理轉換的事件順序如下所示:

  1. NDIS 會呼叫 中繼驅動程式通訊協定下邊緣的 ProtocolNetPnPEvent 函式。 對 ProtocolNetPnPEvent呼叫會指定睡眠狀態的 NetEventSetPower 事件。 中繼驅動程式必須停止傳送網路數據,並將 OID 要求傳送至基礎迷你埠驅動程式。 如果有未處理的要求或傳送,中繼驅動程式應該從對 ProtocolNetPnPEvent 的呼叫傳回NDIS_STATUS_PENDING。 中繼驅動程式會呼叫 NdisCompleteNetPnPEvent,以完成對 ProtocolNetPnPEvent 的呼叫。 中繼驅動程式的通訊協定邊緣仍然可以從基礎迷你埠驅動程式收到封包和狀態指示。 可以忽略已接收的網路數據。 如果中繼驅動程序的實作取決於監視基礎迷你埠驅動程式的狀態,仍應監視狀態指示。

  2. NDIS 會暫停中繼驅動程式的通訊協定邊緣,然後在發出 NetEventSetPower 事件之後暫停基礎迷你埠配接器。 暫停的指定原因是轉換成低功率狀態。 如需暫停通訊協議系結的詳細資訊,請參閱 暫停系結。

    注意 除了OID_PNP_SET_POWER之外,沒有 OID 要求可以在處於低電源狀態時傳送至基礎迷你埠適配卡。

  3. NDIS 會向基礎迷你埠驅動程序發出 OID_PNP_SET_POWER 要求。 不過,如果基礎迷你埠驅動程式不支援電源管理,將會停止。 在此情況下,即使 NDIS 停止基礎迷你埠驅動程式,也不會要求中繼驅動程式通訊協定從基礎迷你埠驅動程式和 NIC 解除系結。 在基礎迷你埠驅動程序順利完成處理 OID 之後(或迷你埠驅動程式已停止),它不會再指出任何網路數據或狀態。

處理設定電源要求至工作狀態

有兩種情況:中繼驅動程式會處理工作狀態的設定電源要求:

  • NDIS 要求中繼驅動程式的虛擬迷你埠上邊緣移至工作狀態。

  • 中繼驅動程式通訊協定下邊緣會在收到 隨插即用 (PnP) 事件通知時,處理基礎迷你埠驅動程序轉換為工作狀態。

這些事件可以依任何順序發生,而且一個事件不一定伴隨另一個事件。

當中繼驅動程式的虛擬迷你埠上邊緣收到將電源設定為工作狀態的要求時,處理要求的事件順序如下所示:

  1. NDIS 對中繼驅動程式的虛擬迷你埠發出 OID_PNP_SET_POWER 。 中繼驅動程式會將NDIS_STATUS_SUCCESS傳回至設定電源要求。 中繼驅動程式不得將OID_PNP_SET_POWER要求傳播至基礎迷你埠驅動程式。

  2. NDIS 會重新啟動虛擬迷你埠,然後在發出設定電源 OID 之後重新啟動過度裝載的驅動程式。 如需重新啟動虛擬迷你埠的詳細資訊,請參閱 啟動配接器

  3. NDIS 會呼叫 過度配置通訊協定驅動程式的 ProtocolNetPnPEvent 函式。 對 ProtocolNetPnPEvent呼叫會指定 NetEventSetPower 事件來設定工作狀態 (D0)。 系結通訊協定驅動程式可以開始將網路數據傳送至中繼驅動程式的虛擬迷你埠。

當中繼驅動程式的通訊協定下邊緣將基礎迷你埠驅動程序轉換為工作狀態時,處理轉換的事件順序如下所示:

  1. NDIS 對基礎迷你埠驅動程序發出OID_PNP_SET_POWER,如果基礎迷你埠驅動程式已停止,則呼叫其MiniportInitializeEx處理程式。

  2. NDIS 會重新啟動基礎迷你埠驅動程式,然後在發出 OID 之後,重新啟動中繼 NDIS 和基礎迷你埠適配卡的通訊協議邊緣。 如需暫停通訊協議系結的詳細資訊,請參閱 重新啟動系結

  3. NDIS 會呼叫 中繼驅動程式的 ProtocolNetPnPEvent 函式。 對 ProtocolNetPnPEvent呼叫會指定 NetEventSetPower 事件來設定工作狀態 (D0)。 中繼驅動程式可以開始將網路數據傳送至基礎迷你埠驅動程式。

電源狀態和待命旗標

中繼驅動程式應該針對每個虛擬迷你埠實例維護個別的電源狀態變數,以及驅動程式所系結的每個基礎迷你埠驅動程式。 中繼驅動程式也應該針對每個虛擬迷你埠維護一個 StandingBy 旗標,也就是:

  • 當虛擬迷你埠或基礎迷你埠驅動程式的電源狀態離開 D0 時,設定為 TRUE

  • 當虛擬迷你埠或基礎迷你埠驅動程式的電源狀態返回 D0 時,設定為 FALSE

注意 針對 MUX 中繼驅動程式,可以有多個與基礎迷你埠驅動程式相關聯的虛擬迷你埠,或與每個虛擬迷你埠相關聯的多個基礎迷你埠。 當任何迷你埠適配卡的電源狀態變更時,所有相關聯迷你埠的行為也會受到影響。 行為如何影響實作特定。 例如,實作負載平衡故障轉移 (LBFO) 解決方案的驅動程式,在停用單一基礎迷你埠驅動程式時,可能不會停用虛擬迷你埠。 不過,視所有基礎迷你埠驅動程式而定的驅動程序實作,在停用任何基礎迷你埠驅動程式時,都需要停用虛擬迷你埠。

中繼驅動程式在處理要求時,應該使用 StandingBy 旗標和電源狀態變數,如下所示:

  • 除非虛擬迷你埠及其基礎迷你埠適配卡都位於 D0 中,否則驅動程式的 MiniportSendNetBufferLists 函式應該會失敗。

  • 驅動程式的 MiniportOidRequest 函式應該一律會成功OID_PNP_QUERY_POWER,以確保驅動程式會收到後續OID_PNP_SET_POWER要求。

  • 如果虛擬迷你埠不在 D0 中,或當 StandingBy 為 TRUE 時,驅動程式的 MiniportOidRequest 函式應該會失敗。 否則,如果基礎迷你埠驅動程式不在 D0 中,它應該將單一要求排入佇列。 當基礎迷你埠驅動程序狀態變成 D0 時,應該處理已排入佇列的要求。

  • 中繼驅動程式虛擬迷你埠只有在基礎迷你埠驅動程式和虛擬迷你埠都位於 D0 時,才應該報告狀態。