初始化微型端口適配器
當網絡設備可用時,系統會加載所需的 NDIS 微型端口驅動程序。 隨后,即插即用 (PnP) 管理器向 NDIS 發送即插即用 IRP 來啟動設備。 NDIS 調用微型端口驅動程序的 MiniportInitializeEx 函數來初始化用于網絡 I/O 操作的適配器。 初始化驅動程序后,NDIS 可以隨時調用 MiniportInitializeEx 。?
在 MiniportInitializeEx 返回之前,NDIS 不會提交要初始化的適配器的請求。 適配器處于“正在初始化”狀態。
微型端口驅動程序通常在 MiniportInitializeEx 中執行以下任務:
- 獲取適配器的配置信息;
- 獲取有關適配器的硬件資源的信息;
- 調用 NdisMSetMiniportAttributes 并提供以下與適配器關聯的屬性:
- 指向驅動程序分配的上下文區域的指針;
- 適當的屬性標志;
- 調用其 MiniportCheckForHangEx 函數的超時間隔;
- 接口類型;
- 初始化適配器特定的資源;
微型端口驅動程序指定 miniportInitializeEx 傳遞給 NdisMSetMiniportAttributes的 NDIS_MINIPORT_ADAPTER_ATTRIBUTES 結構中的適配器屬性。
通常, MiniportInitializeEx 按以下順序分配特定于適配器的資源:
- 非分頁池內存;
- NET_BUFFER 和 NET_BUFFER_LIST 池 ;
- 旋轉鎖;
- 定時器;
- IO 端口;
- DMA ;
- 共享內存;
- 中斷 ;
MiniportInitializeEx 成功返回后,適配器將處于 Paused 狀態。 NDIS 可以調用 MiniportRestart 函數,將適配器轉換為“正在運行”狀態。?
如果 MiniportInitializeEx 返回NDIS_STATUS_SUCCESS,驅動程序應在 MiniportHaltEx 函數中釋放適配器的所有資源。?
如果驅動程序返回NDIS_STATUS_SUCCESS,驅動程序必須調用 NdisMSetMiniportAttributes 并在NDIS_MINIPORT_ADAPTER_ATTRIBUTES結構中設置 GeneralAttributes。
如果 MiniportInitializeEx 失敗, MiniportInitializeEx 必須釋放它分配的所有資源,然后才能返回,適配器將返回到“已停止”狀態。
停止微型端口適配器
NDIS 調用 NDIS 微型端口驅動程序的 MiniportHaltEx 函數,以在從系統中刪除適配器時解除分配資源,并停止硬件。 驅動程序的 MiniportInitializeEx 函數成功返回后,NDIS 可以調用 MiniportHaltEx 。
MiniportHaltEx 必須釋放驅動程序為設備分配的任何資源。 驅動程序必須調用最初分配資源的 NdisXxx 函數的倒數。 一般情況下, MiniportHaltEx 函數應按初始化期間使用的相反順序調用倒數 NdisXxx 函數。
如果適配器生成中斷,則微型端口驅動程序的 MiniportHaltEx 函數可由該驅動程序的 MiniportInterrupt 函數搶占,直到 MiniportHaltEx 禁用中斷。
如果有未完成的 OID 請求或發送請求,NDIS 不會調用 MiniportHaltEx 。 在 NDIS 調用 MiniportHaltEx 后,NDIS 不會提交對受影響設備的進一步請求。
在 MiniportHaltEx 返回后,微型端口驅動程序將處于“已停止”狀態。
啟動適配器
NDIS 調用微型端口驅動程序的 MiniportRestart 函數,為處于“已暫停”狀態的適配器啟動重啟請求。 驅動程序可以在 NDIS 調用 MiniportRestart 之后和微型端口驅動程序以同步或異步方式完成重啟操作之前立即恢復接收的數據。
當它調用微型端口驅動程序的 MiniportRestart 函數時,NDIS 會將指向NDIS_RESTART_ATTRIBUTES結構的指針傳遞給 NDIS_MINIPORT_RESTART_PARAMETERS 結構的 RestartAttributes 成員中的微型端口驅動程序。
若要異步完成重啟操作, MiniportRestart 將返回NDIS_STATUS_PENDING并且驅動程序必須在操作完成后調用 NdisMRestartComplete 函數。
微型端口驅動程序應在完成重啟操作后準備好接受發送請求。 在重啟操作完成之前,NDIS 不會啟動任何其他即插即用操作,例如停止、初始化或暫停請求。
驅動程序準備好處理發送和接收操作后,適配器將處于“正在運行”狀態。
暫停適配器
NDIS 調用微型端口驅動程序的 MiniportPause 函數來啟動暫停操作。 適配器將一直處于暫停狀態,直到暫停操作完成。
在暫停狀態下,微型端口驅動程序必須完成未完成的接收操作。 驅動程序還必須完成任何未完成的發送操作,并且應拒絕任何新的發送請求。
若要完成接收操作,驅動程序將等待對 NdisMIndicateReceiveNetBufferLists 函數的所有調用返回,并且 NDIS 必須將所有未完成 的NET_BUFFER_LIST 結構返回到微型端口驅動程序的 MiniportReturnNetBufferLists 函數。
若要完成未完成的發送操作,微型端口驅動程序應為所有未完成的 NET_BUFFER_LIST 結構調用 NdisMSendNetBufferListsComplete 函數。 驅動程序應立即拒絕對其 MiniportSendNetBufferLists 函數發出的任何新發送請求。
微型端口驅動程序完成所有未完成的發送和接收操作后,驅動程序必須以同步或異步方式完成暫停請求。 如果暫停操作以異步方式完成,驅動程序將調用 NdisMPauseComplete 以完成暫停請求。 完成暫停請求后,微型端口驅動程序將處于“已暫停”狀態。
當微型端口驅動程序處于暫停狀態時,NDIS 不會啟動其他即插即用操作,例如停止、初始化、電源更改或重啟操作。 在微型端口驅動程序處于“暫停”狀態后,NDIS 可以啟動這些即插即用操作。
配置可選的服務
NDIS 調用微型端口驅動程序的 MiniportSetOptions 函數,以允許驅動程序配置可選服務。 NDIS 在微型端口驅動程序調用 NdisMRegisterMiniportDriver 函數的上下文中調用 MiniportSetOptions。
MiniportSetOptions 為可選 MiniportXxx 函數注冊默認入口點,并且可以分配其他驅動程序資源。 為了注冊可選的 MiniportXxx 函數,微型端口驅動程序調用 NdisSetOptionalHandlers 函數,并在 OptionalHandlers 參數處傳遞特征結構。
從 NDIS 6.0 開始,有效特征結構包括:
NDIS_MINIPORT_CO_CHARACTERISTICS:
NDIS_MINIPORT_PNP_CHARACTERISTICS:?
NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS:?
NDIS_PROVIDER_CHIMNEY_OFFLOAD_GENERIC_CHARACTERISTICS:??
NDIS_PROVIDER_CHIMNEY_OFFLOAD_TCP_CHARACTERISTICS:
從 NDIS 6.30 開始,有效特征結構還包括:
NDIS_MINIPORT_SS_CHARACTERISTICS:?
NDIS_NDK_PROVIDER_CHARACTERISTICS:?