發出 NDIS 喚醒原因狀態指示
如果迷你埠驅動程式支援 NDIS 喚醒原因狀態指示 (NDIS_STATUS_PM_WAKE_REASON) ,則必須在網路介面卡產生喚醒事件且介面卡繼續進入全電源狀態之後立即產生此狀態指示。
注意 對於行動寬頻 (MB) 迷你埠驅動程式,支援 NDIS 喚醒原因狀態指示是選擇性的。
迷你埠驅動程式是透過物件識別碼 (OID) OID_PM_PARAMETERS集要求,使用電源管理 (PM) 參數來設定。 此 OID 要求會透過 NDIS_PM_PARAMETERS 結構來指定 PM 參數。
NDIS_PM_PARAMETERS結構會指定下列喚醒事件種類的參數。
收到的封包喚醒事件
如果網路介面卡收到符合網路喚醒 (WOL) 模式的封包,則網路介面卡會產生喚醒事件。 WOL 模式包括下列各項:
與媒體無關的 WOL 模式,例如封包承載內的魔術封包或 TCP/IP 資料模式。 例如, NDIS_PM_PARAMETERS 結構可以指定 TCP SYN 框架的 WOL 模式。
媒體特定的 WOL 模式,例如 EAPOL 要求識別碼封包或行動寬頻 (MB) 簡短訊息服務 (SMS) 訊息。
符合透過 OID_GEN_CURRENT_PACKET_FILTER OID 集合要求所指定接收篩選的萬用字元模式。
注意 針對這種類型的喚醒原因狀態指示,網路介面卡必須能夠儲存收到的封包。 驅動程式必須在狀態指示內傳回收到的封包。
WOL 模式是透過NDIS_PM_PARAMETERS結構的EnabledWoLPacketPatterns成員來指定。
媒體特定的喚醒事件
網路介面卡會因為媒體特定原因而產生喚醒事件,例如中斷與 802.11 存取點 (AP) 或收到行動寬頻 (MB) 簡訊服務 (SMS) 訊息。
這個類型的喚醒事件是透過NDIS_PM_PARAMETERS結構的MediaSpecificWakeUpEvents成員來指定。
媒體獨立喚醒事件
網路介面卡會因為媒體無關的原因而產生喚醒事件,例如媒體連線或中斷連線。
此類型的喚醒事件是透過NDIS_PM_PARAMETERS結構的WakeUpFlags成員來指定。
如果網路介面卡產生喚醒訊號,迷你埠驅動程式必須發出 NDIS_STATUS_PM_WAKE_REASON 狀態指示。 驅動程式會在處理 OID_PNP_SET_POWER 的 OID 集合要求,以將介面卡轉換為全電源狀態時執行此動作。
注意 迷你埠驅動程式必須先發出 NDIS_STATUS_PM_WAKE_REASON 狀態指示,才能發出與喚醒事件相關的狀態指示。 例如,如果喚醒事件是因為媒體線上狀態有所變更,迷你埠驅動程式必須在發出 NDIS_STATUS_PM_WAKE_REASON 狀態指示之後發出 NDIS_STATUS_LINK_STATE 狀態指示。
當迷你埠驅動程式發出 NDIS_STATUS_PM_WAKE_REASON 狀態指示時,必須遵循下列步驟:
迷你埠驅動程式必須配置足以包含下列大小的緩衝區:
NDIS_PM_WAKE_PACKET結構以及導致網路介面卡產生喚醒事件的接收封包 (喚醒封包) 。
注意 如果迷你埠驅動程式指出媒體特定或與媒體無關的喚醒事件,則不需要配置此緩衝區空間。
迷你埠驅動程式會在緩衝區開頭初始化 NDIS_PM_WAKE_REASON 結構。 驅動程式會將 WakeReason 成員設定為定義喚醒事件種類的 NDIS_PM_WAKE_REASON_TYPE 列舉值。
例如,如果迷你埠驅動程式指出收到的封包喚醒事件,則必須將 WakeReason 成員設定為 NdisWakeReasonPacket。 否則,驅動程式會將 WakeReason 成員設定為列舉值,最能描述媒體特定或與媒體無關的喚醒事件。
如果 miniportdriver 發出已接收封包喚醒事件的 NDIS_STATUS_PM_WAKE_REASON 狀態指示,則必須遵循下列步驟:
迷你埠驅動程式會將InfoBufferOffset成員設定為緩衝區中NDIS_PM_WAKE_REASON結構之後NDIS_PM_WAKE_PACKET結構的位移。
注意 迷你埠驅動程式必須在 64 位界限上對齊 NDIS_PM_WAKE_PACKET 結構的開頭。
迷你埠驅動程式會將 InfoBufferSize 成員設定為 NDIS_PM_WAKE_PACKET 結構的大小,加上造成喚醒事件的封包大小。
迷你埠驅動程式會遵循緩衝區中的NDIS_PM_WAKE_REASON 結構, 初始化 NDIS_PM_WAKE_PACKET 結構。
迷你埠驅動程式會設定 NDIS_PM_WAKE_PACKET 結構的成員,如下所示:
PatternId成員會設定為符合喚醒封包的 WOL 模式識別碼。 此識別碼是由NDIS_PM_WOL_PATTERN結構的PatternId成員所指定,該成員會在OID_PM_ADD_WOL_PATTERN的 OID 集合要求期間傳遞給驅動程式。
PatternFriendlyName成員會設定為PatternId成員所指定喚醒模式的使用者可讀取描述。 這個值是由NDIS_PM_WOL_PATTERN結構的FriendlyName成員所指定。
注意 迷你埠驅動程式不需要初始化這個成員。 NDIS 會將 PatternFriendlyName 成員設定為正確的值,再將 NDIS_PM_WAKE_PACKET 結構傳遞至過度的驅動程式。
OriginalPacketSize成員會設定為網路介面卡所收到的封包長度。
SavedPacketSize成員必須設定為透過NDIS_STATUS_PM_WAKE_REASON狀態指示回報的封包長度。
注意這個成員的值不得大於在NDIS_PM_CAPABILITIES結構的MaxWoLPacketSaveBuffer成員中設定迷你埠驅動程式的值。 驅動程式報告其喚醒封包指示功能時,會傳回此結構。 如需詳細資訊,請參閱 報告喚醒原因狀態指示功能。
SavedPacketOffset成員必須設定為位移,以位元組為單位,設定為NDIS_PM_WAKE_PACKET結構後面的喚醒封包。
注意 迷你埠驅動程式必須在緩衝區的 64 位界限上對齊喚醒封包的開頭。
迷你埠會將喚醒封包複製到 SavedPacketOffset 成員所指定位移的緩衝區。
如果迷你埠驅動程式發出媒體特定或與媒體無關喚醒事件的NDIS_STATUS_PM_WAKE_REASON狀態指示,它會將NDIS_PM_WAKE_REASON結構的InfoBufferOffset和InfoBufferSize成員設定為零。
迷你埠驅動程式會初始化 NDIS_STATUS_INDICATION 結構。 驅動程式會將 StatusCode 成員設定為 NDIS_STATUS_PM_WAKE_REASON。 驅動程式也會將 StatusBuffer 成員設定為指向緩衝區,並將 StatusBufferLength 設定為緩衝區的長度,以位元組為單位。
迷你埠驅動程式會呼叫NdisMIndicateStatusEx,並將指標傳遞給StatusIndication參數中的NDIS_STATUS_INDICATION結構。
注意 在迷你埠驅動程式發出已接收封包喚醒事件的 NDIS_STATUS_PM_WAKE_REASON 狀態指示之後,它必須藉由呼叫 NdisMIndicateReceiveNetBufferLists來指出此收到的封包。