取消 NDIS 選擇性暫停閑置通知
如果網路適配器在空閒超時期間變為非活動狀態,NDIS 會啟動選擇性暫停作業。 透過這項作業,網路適配器會轉換為低功率狀態。 NDIS 會發出閑置通知給迷你埠驅動程式,以開始這項作業。 如需這項作業的詳細資訊,請參閱 處理 NDIS 選擇性暫停閑置通知。
NDIS 會呼叫 MiniportIdleNotification 處理程式函式,通知驅動程式基礎網路介面卡似乎處於閒置狀態。 發出閑置通知之後,如果下列一或多個條件成立,NDIS 會取消擱置的閑置通知:
上層通訊協議或篩選驅動程式會向小型端口驅動程式發出封包傳送請求或物件識別碼(OID)請求。
如需了解 NDIS 如何於上層驅動程式活動中取消此案例的閒置通知的詳細資訊,請參閱 取消因上層驅動程式活動而產生的閒置通知。
基礎配接器會發出喚醒事件訊號,例如接收封包或偵測其媒體連線狀態的變更。
如需了解有關 NDIS 如何取消此情境閑置通知的詳細資訊,請參閱 因為喚醒事件取消閑置通知之原因。
NDIS 會呼叫基礎迷你埠驅動程式的 MiniportCancelIdleNotification 處理程式函式來取消閑置通知。 當此函式被呼叫時,迷你端口驅動程式必須完成閒置通知,以將配接器恢復到全電源狀態。 如需此過程的指導方針,請參閱 完成 NDIS 選擇性暫停閑置通知。
如需了解如何實作 MiniportCancelIdleNotification 處理程序函式的詳細資訊,請參閱 實作 MiniportCancelIdleNotification 處理程序函式。
因為驅動程序的重疊活動,取消閒置通知
NDIS 監視器會傳送要求和 OID 要求,這些要求會發出給已暫停網路適配器且處於低功率狀態的迷你埠驅動程式。 發生這種情況時,NDIS 會取消未處理的閑置通知,讓網路適配器可以繼續進入全電源狀態。
取消閑置通知時,NDIS 和迷你埠驅動程式會遵循下列步驟:
NDIS 會呼叫 MiniportCancelIdleNotification handler 函式來取消未處理的閑置通知。 呼叫此處理程式函式時,迷你埠驅動程序必須取消先前針對閑置通知發出的任何總線特定 I/O 要求封包(IRP)。
例如,呼叫 MiniportCancelIdleNotification 時,USB 網路適配器的迷你埠會執行下列步驟:
迷你埠驅動程式會取消待處理的 USB 閒置通知 (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP。 先前當 NDIS 呼叫驅動程式的 MiniportIdleNotification 函式時,迷你埠驅動程式將此 IRP 發送給基礎的 USB 總線驅動程式。 迷你埠驅動程式會呼叫 IoCancelIrp來取消此 IRP。
當總線驅動程式取消 USB 閑置要求 IRP 時,它會呼叫 IRP 的迷你埠驅動程式完成例程。 此呼叫會通知驅動程式 IRP 已完成,而且網路適配器可以轉換為全電源狀態。 從完成例程的內容中,驅動程式會呼叫 NdisMIdleNotificationComplete,以通知 NDIS 網路適配器可以轉換為全電源狀態。
注意 根據取消總線特定閒置要求的相依性,迷你埠驅動程式會在呼叫 MiniportCancelIdleNotification 時以同步方式,或在 MiniportCancelIdleNotification 傳回後以異步方式,呼叫 NdisMIdleNotificationComplete。
如需如何實作 USB 閑置要求 IRP 完成例程的詳細資訊,請參閱 實作 USB 閑置要求 IRP 完成例程。
迷你埠驅動程式在取消所有與閒置通知相關的總線特定 IRP 之後,會呼叫 NdisMIdleNotificationComplete。 此呼叫會通知 NDIS 閑置通知已完成。 NDIS 接著會將網路適配器轉換為全電源狀態,以完成選擇性暫停作業。
呼叫 NdisMIdleNotificationComplete 時,NDIS 會執行下列步驟:
NDIS 發出 IRP_MN_SET_POWER 給基礎總線驅動程式。 此 IRP 要求總線驅動程式將網路適配器的電源狀態設定為 PowerDeviceD0。
NDIS 對迷你埠驅動程序發出 OID_PNP_SET_POWER 的 OID 集合要求。 在此 OID 要求中,NDIS 指定網路適配器現在正轉換為 NdisDeviceStateD0 的完整電源狀態。
處理此 OID 集合要求時,驅動程式會準備適配卡以進行全電源作業。 這包括將接收和傳送引擎還原到轉換至低功率狀態之前所在的相同狀態。 驅動程式接著會使用 NDIS_STATUS_SUCCESS完成 OID 要求。
下圖顯示 NDIS 取消針對 USB 網路適配器的迷你埠驅動程式發出的閑置通知時所涉及的步驟。
因為喚醒事件而取消閑置通知
在網路適配器轉換為低功耗狀態之前,NDIS 會向網路適配器發出一個 OID 設定請求,OID_PM_PARAMETERS。 此 OID 要求會指定適配卡可以發出訊號以繼續進入全電源狀態的喚醒事件類型。 針對 NDIS 選擇性暫停,適配卡會設定為發出下列任何喚醒事件的訊號:
封包的接收,該封包符合先前透過 OID_PM_ADD_WOL_PATTERN 或 OID_GEN_CURRENT_PACKET_FILTER的 OID 集合要求所設定的篩選。
適配卡上媒體連線狀態的變更。
NDIS 和小型埠驅動程式在因為網路卡產生的喚醒信號而取消閒置通知時,會遵循以下步驟:
總線驅動程式會先完成 NDIS 發出的 IRP_MN_WAIT_WAKE,再將適配卡轉換為低功率狀態。 藉由完成 IRP,總線驅動程式會通知 NDIS 網路適配器已產生喚醒訊號。
NDIS 會呼叫 MiniportCancelIdleNotification handler 函式,以啟動取消閑置通知的作業。 此操作所涉及的步驟與 取消閒置通知 中所述的步驟相同,這是因為重疊的驅動程式活動。
例如,下方圖片顯示在 NDIS 因 USB 網路適配器發出的喚醒事件訊號而取消閒置通知的過程中所涉及的步驟。