在需要的時候,我們也許需要NDIS微型端口程序信息,下面會從多個方面來討論如何查詢NDIS微型端口驅動。
查詢無連接微型端口驅動程序
若要查詢無連接微型端口驅動程序維護的 OID,綁定協議調用 NdisOidRequest 并傳遞 一個NDIS_OID_REQUEST 結構,該結構指定對象 (OID) 正在查詢,該對象指向 NDIS 最終寫入所請求信息的緩沖區。
如果 NDIS 不響應微型端口驅動程序,則對 NdisOidRequest 的 調用會導致 NDIS 調用微型端口驅動程序的 MiniportOidRequest 函數,該函數將請求的信息返回到 NDIS。 MiniportOidRequest 可以通過調用 NdisMOidRequestComplete 以同步或異步方式完成。
NDIS 還可以自行調用微型端口驅動程序的 MiniportOidRequest 函數(例如,在微型端口驅動程序的 MiniportInitializeEx 函數返回NDIS_STATUS_SUCCESS)以查詢微型端口驅動程序的功能、狀態或統計信息之后。 下圖演示了查詢無連接微型端口驅動程序。
NDIS 代表微型端口驅動程序響應許多 OID 請求。 微型端口驅動程序在初始化期間和狀態指示中報告其許多 OID 值。?
使用 OID_GEN_MAC_OPTIONS 調用 MiniportOidRequest 時,它必須返回一個位掩碼,該位掩碼指定微型端口驅動程序執行的可選操作。 標志集包括:
- NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA。 此標志向協議驅動程序指示它可以通過任何方式訪問指示的數據。 如果微型端口驅動程序指示數據來自板載共享內存,則它不得設置此標志;
- NDIS_MAC_OPTION_NO_LOOPBACK。 如果設置了此標志,微型端口驅動程序不會環回傳遞給 MiniportSendNetBufferLists 的數據包 (數據包) 定向到同一計算機上的接收器,并且微型端口驅動程序預期 NDIS 執行環回。 如果 NDIS 執行數據包的環回,則數據包不會向下傳遞到微型端口驅動程序。 微型端口驅動程序始終設置此標志,除非 NIC 執行硬件環回;
- NDIS_MAC_OPTION_RECEIVE_SERIALIZED。 如果設置了此標志,微型端口驅動程序不會指示任何新接收的數據包,直到之前收到的數據包已完全處理,包括傳輸數據。 大多數微型端口驅動程序(通過調用 NdisMIndicateReceiveNetBufferLists 指示數據包的驅動程序除外)都設置此標志;
微型端口驅動程序不得使用標志NDIS_MAC_OPTION_RESERVED,該標志保留供 NDIS 內部使用。
MiniportOidRequest 還會使用特定于媒體的 OID 進行查詢,以確定 NIC 的當前地址。 例如,將使用 OID_802_3_CURRENT_ADDRESS 查詢類型為 802.3 的 NIC 的微型端口驅動程序。
某些媒體類型的微型端口驅動程序將收到特定于媒體的其他 OID。 例如,使用 OID_802.3_MAXIMUM_LIST_SIZE 查詢 NIC 類型為 802.3 的微型端口驅動程序。
查詢面向連接的微型端口驅動程序
若要查詢面向連接的微型端口驅動程序維護的信息對象,綁定協議調用 NdisCoOidRequest 并傳遞 NDIS_OID_REQUEST 結構,該結構指定正在查詢的 OID對象,并提供 NDIS 最終將請求的信息寫入其中的緩沖區。 調用 NdisCoOidRequest 會導致 NDIS 調用微型端口驅動程序的 MiniportCoOidRequest 函數,該函數將請求的信息返回給 NDIS。 MiniportCoOidRequest 可以通過調用 NdisCoOidRequestComplete 以同步或異步方式完成。
NDIS 還可以自行調用微型端口驅動程序的 MiniportCoOidRequest 函數(例如,在微型端口驅動程序的 MiniportInitializeEx 函數返回NDIS_STATUS_SUCCESS之后)來查詢微型端口驅動程序的功能、狀態或統計信息。 下圖說明了如何查詢面向連接的微型端口驅動程序。
?
面向連接的微型端口驅動程序必須能夠提供有關特定 NIC 的所有虛擬連接( (VC) )以及每個 VC 的全局基礎信息。 例如,如果將非 NULLNdisVcHandle 提供給 MiniportCoOidRequest 進行 OID_GEN_CO_RCV_CRC_ERROR查詢,則微型端口驅動程序將返回指定 VC 上所有接收中遇到的 CRC 錯誤數。 對于具有 NULLNdisVcHandle 的同一請求,微型端口驅動程序返回通過 NIC 接收的所有傳入接收時遇到的 CRC 錯誤總數。
以下列表包含面向連接的微型端口驅動程序的一組必需的常規操作 OID:
- OID_GEN_CO_SUPPORTED_LIST
- OID_GEN_CO_HARDWARE_STATUS
- OID_GEN_CO_MEDIA_SUPPORTED
- OID_GEN_CO_MEDIA_IN_USE
- OID_GEN_CO_LINK_SPEED
- OID_GEN_CO_VENDOR_ID
- OID_GEN_CO_VENDOR_DESCRIPTION
- OID_GEN_CO_VENDOR_DRIVER_VERSION
- OID_GEN_CO_DRIVER_VERSION
- OID_GEN_CO_MAC_OPTIONS
- OID_GEN_CO_MEDIA_CONNECT_STATUS
- OID_GEN_CO_MINIMUM_LINK_SPEED
微型端口驅動程序的 MiniportCoOidRequest 函數必須準備好對查詢或設置做出相應的響應,以響應上述任何 OID。
使用 OID_GEN_CO_MAC_OPTIONS 調用 MiniportCoOidRequest 時,它必須返回指定微型端口驅動程序執行的可選操作的位掩碼。 標志集包括:
- NDIS_MAC_OPTION_NO_LOOPBACK。 如果設置了此標志,微型端口驅動程序不會環回傳遞給 MiniportCoSendNetBufferLists 的 數據包,該數據包定向到同一計算機上的接收器,并且微型端口驅動程序希望 NDIS 執行環回。 如果 NDIS 執行數據包的環回,則數據包不會向下傳遞到微型端口驅動程序。 微型端口驅動程序始終設置此標志,除非 NIC 執行硬件環回;
- NDIS_MAC_ETOX_INDICATION。 如果設置了此標志,微型端口驅動程序會指示僅在 NIC 傳輸數據包后完成發送;
微型端口驅動程序不得使用保留供 NDIS 內部使用的 NDIS_MAC_OPTION_RESERVED 標志。
MiniportCoOidRequest 還將使用特定于媒體的 OID 進行查詢,以確定 NIC 的當前地址。
直接從用戶模式查詢微型端口驅動程序
應用程序可以使用 IOCTL_NDIS_QUERY_GLOBAL_STATS 直接從微型端口驅動程序的 NIC 查詢信息。 在此操作中,應用程序可以使用微型端口驅動程序支持的任何查詢 OID。
查詢 64 位統計信息 OID
對于某些統計信息 OID,每秒 1 GB (Gbps) 且速度較快的所有微型端口驅動程序都必須支持 64 位計數器。 所有每秒 100 兆字節 (Mbps) 和更快的微型端口驅動程序應支持此類 OID 的 64 位計數器。?
查詢統計信息 OID 的請求者NDIS_OID_REQUEST InformationBufferLength 設置為 4 字節,)表示 32 位統計信息請求,或設置為 8 字節以指示 64 位統計信息請求。 在其響應中,微型端口驅動程序將 NDIS_OID_REQUEST BytesNeeded 設置為微型端口驅動程序支持的統計信息值的大小, 4對于 32 位或 8對于 64 位。 微型端口驅動程序將 NDIS_OID_REQUEST BytesWritten 設置為 InformationBufferLength 值的較小值和微型端口驅動程序支持的統計信息大小。
以下部分介紹了支持 64 位統計信息 OID 的微型端口驅動程序如何響應此類 OID 查詢。
1. 64 位值的 64 位查詢: NDIS_OID_REQUEST InformationBufferLength 大于或等于 8。
微型端口驅動程序:
- 返回信息緩沖區中的 64 位值;
- 將 NDIS_OID_REQUEST BytesWritten 設置為 8;
- 從其 MiniportOidRequest 或 MiniportCoOidRequest 函數返回NDIS_STATUS_SUCCESS;
2. 64 位值的 32 位查詢: NDIS_OID_REQUEST InformationBufferLength 大于或等于 4 且小于 8。
微型端口驅動程序:
- 在信息緩沖區中,返回 64 位值的較低 32 位;
- 將 NDIS_OID_REQUEST BytesWritten 設置為 4;
- 將 NDIS_OID_REQUEST BytesNeeded 設置為 8;
- 從其 MiniportOidRequest 或 MiniportCoOidRequest 函數返回NDIS_STATUS_SUCCESS;
3. 64 位值的長度無效查詢: NDIS_OID_REQUEST InformationBufferLength 小于 4。
微型端口驅動程序:
- 不返回信息緩沖區中的任何值;
- 將 NDIS_OID_REQUEST BytesWritten 設置為 0;
- 將 NDIS_OID_REQUEST BytesNeeded 設置為 8;
- 從其 MiniportOidRequest 或 MiniportCoOidRequest 函數返回NDIS_STATUS_INVALID_LENGTH;
設置無連接微型端口驅動程序的信息
若要設置無連接微型端口驅動程序維護的 OID,綁定協議調用 NdisOidRequest 并傳遞一個 NDIS_OID_REQUEST 結構,該結構指定正在查詢 的 OID ,該對象指向包含應設置對象的值的緩沖區。 調用 NdisOidRequest 會導致 NDIS 調用微型端口驅動程序的 MiniportOidRequest 函數,該函數使用提供的值設置對象。
對 MiniportOidRequest 的 調用可以同步或異步完成。 若要異步完成調用,微型端口驅動程序調用 NdisMOidRequestComplete。 下圖演示了無連接微型端口驅動程序 (每個綁定) 的設置信息。
設置面向連接的微型端口驅動程序的信息
若要設置面向連接的微型端口驅動程序維護的 OID,綁定協議調用 NdisCoOidRequest 并傳遞一個 NDIS_OID_REQUEST 結構,該結構指定正在查詢的 OID) (對象,該對象指向包含應設置對象的值的緩沖區。 調用 NdisCoOidRequest 會導致 NDIS 調用微型端口驅動程序的 MiniportCoOidRequest 函數,該函數使用提供的值設置 對象。
對 NdisCoOidRequest 的 調用可以同步或異步完成。 若要異步完成調用,微型端口驅動程序調用 NdisCoOidRequestComplete。 下圖演示了面向連接的微型端口驅動程序中的設置信息。
設置微型端口驅動程序信息的場合
在初始化期間,將調用無連接微型端口驅動程序中的 MiniportOidRequest 函數和面向連接的微型端口驅動程序中的 MiniportCoOidRequest 函數。 還可以以下情況下調用函數:
- 在硬件重置期間;
- 如果協議調用 NdisCloseAdapterEx;
在硬件重置操作期間調用 MiniportOidRequest 或 MiniportCoOidRequest。 在這種情況下,將調用 MiniportOidRequest 或 MiniportCoOidRequest ,以將微型端口驅動程序重置為其地址的初始狀態。
當微型端口驅動程序的 NIC 被協議的 NdisCloseAdapterEx 調用關閉時,NDIS 調用 MiniportOidRequest 或 MiniportCoOidRequest。 將請求此類微型端口驅動程序更新其尋址信息。
報告硬件狀態
無連接微型端口驅動程序通過調用 NdisMIndicateStatusEx 指示硬件狀態到上層的更改。 面向連接的微型端口驅動程序通過調用 NdisMCoIndicateStatusEx 來指示更改。
NdisM (Co) IndicateStatusEx 采用常規狀態代碼和緩沖區,其中包含媒體特定信息,進一步定義狀態更改原因。 NDIS 將此狀態更改報告給綁定協議驅動程序。 NDIS 不會解釋或以其他方式截獲狀態代碼。
微型端口驅動程序可以發出一個或多個此類調用。 但是,與早期版本的 NDIS 不同,微型端口驅動程序并不指示它已完成發送狀態。 協議驅動程序或配置管理器可以記錄狀態或根據需要采取糾正措施。
NdisMCoIndicateStatusEx 采用任何有效的 NDIS_STATUS_Xxx 值。
微型端口驅動程序負責指示對協議或更高級別驅動程序有意義的狀態代碼。 協議驅動程序會忽略其不感興趣或在其操作上下文中沒有意義的任何狀態值。
微型端口驅動程序不能在其 MiniportInitializeEx、 MiniportInterrupt、 MiniportHaltEx 或 MiniportShutdownEx 函數的上下文中指示狀態。
上層驅動程序或 NDIS 還可以詢問微型端口驅動程序的硬件狀態。 當無 連接微型端口驅動程序的 MiniportOidRequest 函數或面向連接的微型端口驅動程序的 MiniportCoOidRequest 函數收到OID_GEN_HARDWARE_STATUS時,它將使用 NDIS_HARDWARE_STATUS 中定義的任何適用狀態值進行響應。 這些狀態值包括:
- NdisHardwareStatusReady
- NdisHardwareStatusInitializing
- NdisHardwareStatusReset
- NdisHardwareStatusClosing
- NdisHardwareStatusNotReady
可以查詢微型端口驅動程序,以便 NDIS 可以在 NDIS 驅動程序層之間同步操作,例如,通過確定 NIC 是否已準備好接受數據包。
指示連接狀態
微型端口驅動程序調用 NdisMIndicateStatusEx 或 NdisMCoIndicateStatusEx 以指示媒體連接狀態的更改。 微型端口驅動程序將以下狀態指示之一傳遞給 NdisM (Co) IndicateStatus:
- NDIS_STATUS_MEDIA_CONNECT:指示媒體連接狀態從“已斷開連接”更改為“已連接”。 當斷開連接的適配器建立網絡連接時,將發生媒體連接狀態更改。 例如,適配器在無線適配器) (范圍內或用戶連接網絡電纜時連接;
- NDIS_STATUS_MEDIA_DISCONNECT:指示媒體連接狀態從“已連接”更改為“已斷開連接”。 當連接的適配器失去網絡連接時,將發生媒體斷開連接狀態更改。 例如,適配器因無線適配器) (范圍或用戶拔下網線而失去連接;
除非另行指定,否則微型端口驅動程序應在檢測到狀態更改后兩秒內指示媒體連接狀態更改。
微型端口驅動程序可以在執行某些操作時檢查媒體連接狀態, 查看以下列表。 如果操作完成后的狀態與操作開始前的狀態相同,微型端口驅動程序不必報告操作期間可能發生的任何狀態更改。
以下列表介紹了指示微型端口驅動程序的媒體連接狀態更改的其他要求:
重 置: NDIS 調用 MiniportResetEx 來重置微型端口驅動程序。 微型端口驅動程序可以同步或異步完成重置。如果重置后的媒體連接狀態不同,驅動程序應在完成重置后的兩秒內指示狀態。微型端口驅動程序在確定媒體連接狀態之前不應完成重置操作;
停止: 當 NDIS 調用 MiniportHaltEx 時,微型端口驅動程序不得指示任何媒體連接狀態更改;
正在初始化:NDIS 調用微型端口驅動程序的 MiniportInitializeEx 函數來初始化適配器。 在適配器初始化期間,微型端口驅動程序必須遵循以下準則:
- 如果微型端口驅動程序在從 MiniportInitializeEx 返回后未指示媒體連接狀態,則 NDIS 使用 NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES 結構的 MediaConnectState 成員的值來確定媒體連接狀態。 當驅動程序從其 MiniportInitializeEx 函數調用 NdisMSetMiniportAttributes 時,微型端口驅動程序為 NDIS 提供此結構。注意 如果 MediaConnectState 成員設置為 MediaConnectStateUnknown,則 NDIS 將繼續,就像適配器斷開連接一樣;
- 如果在 NDIS 調用 MiniportInitializeEx 后連接了適配器,微型端口驅動程序可以在從 MiniportInitializeEx 返回后 5 秒內指示NDIS_STATUS_MEDIA_CONNECT;
- 如果在 NDIS 調用 MiniportInitializeEx 后適配器斷開連接,微型端口驅動程序應在從 MiniportInitializeEx 返回后 2 秒內指示NDIS_STATUS_MEDIA_DISCONNECT;
- 初始化時,微型端口驅動程序應異步處理 OID_GEN_MEDIA_CONNECT_STATUS 或 OID_GEN_CO_MEDIA_CONNECT_STATUS 請求。 微型端口驅動程序在確定連接狀態之前不應完成此類請求;
- 媒體連接狀態的確定不應延遲初始化。 如有必要,微型端口驅動程序應啟動該過程以確定 MiniportInitializeEx 中的連接狀態,并在以后完成該過程。 例如,微型端口驅動程序可以設置一個計時器來輪詢適配器的連接狀態;
- 反序列化的微型端口驅動程序可以指示在初始化期間媒體斷開連接,但序列化的微型端口驅動程序不應;
睡眠:微型端口驅動程序在收到將設備電源狀態設置為 D1、D2 或 D3 的OID_PNP_SET_POWER 請求時進入網絡睡眠狀態。微型端口驅動程序不得在進入睡眠狀態或處于睡眠狀態時指示任何媒體連接狀態發生更改;
醒來:微型端口驅動程序在收到將設備電源狀態設置為 D0 的OID_PNP_SET_POWER請求時從睡眠狀態喚醒。如果適配器在喚醒后的媒體連接狀態與睡眠前的狀態相同,微型端口驅動程序不應指示媒體連接狀態更改。 如果連接狀態發生更改,微型端口驅動程序應在喚醒后的兩秒內指示新的連接狀態。喚醒時,微型端口驅動程序應異步處理OID_GEN_MEDIA_CONNECT_STATUS或OID_GEN_CO_MEDIA_CONNECT_STATUS請求。 微型端口驅動程序在確定連接狀態之前不應完成此類請求;