NDIS小端口驅動開發(二)

初始化微型端口適配器

當網絡設備可用時,系統會加載所需的 NDIS 微型端口驅動程序。 隨后,即插即用 (PnP) 管理器向 NDIS 發送即插即用 IRP 來啟動設備。 NDIS 調用微型端口驅動程序的 MiniportInitializeEx 函數來初始化用于網絡 I/O 操作的適配器。 初始化驅動程序后,NDIS 可以隨時調用 MiniportInitializeEx 。?

在 MiniportInitializeEx 返回之前,NDIS 不會提交要初始化的適配器的請求。 適配器處于“正在初始化”狀態。

微型端口驅動程序通常在 MiniportInitializeEx 中執行以下任務:

  • 獲取適配器的配置信息;
  • 獲取有關適配器的硬件資源的信息;
  • 調用 NdisMSetMiniportAttributes 并提供以下與適配器關聯的屬性:
  1. 指向驅動程序分配的上下文區域的指針;
  2. 適當的屬性標志;
  3. 調用其 MiniportCheckForHangEx 函數的超時間隔;
  4. 接口類型;
  • 初始化適配器特定的資源;

微型端口驅動程序指定 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:?

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

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

相關文章

嵩山為什么稱為三水之源

三水指黃河、淮河、濟河,這三條河流環繞在嵩山周邊。 黃河橫亙在嵩山北部,其支流伊洛河從西南方環繞嵩山,然后匯入黃河。濟河,古稱濟水,源自濟源王屋山,自身河道在東晉時代被黃河奪占,從此消失。…

畢設 大數據校園卡數據分析

文章目錄 0 前言1 課題介紹2 數據預處理2.1 數據清洗2.2 數據規約 3 模型建立和分析3.1 不同專業、性別的學生與消費能力的關系3.2 消費時間的特征分析 4 Web系統效果展示5 最后 0 前言 🔥 這兩年開始畢業設計和畢業答辯的要求和難度不斷提升,傳統的畢設…

職場不是掙錢

職場怎么不是掙錢? 曾經我也一直這么想,只要做好老板安排的事情,自然就可以掙到錢了。 目的應該是沒錯的,是掙錢。 只是做好活就能掙錢,好像想得有些簡單了。 畢竟每個人都在干活,為什么就該自己掙錢呢&a…

【vue2配置】Vue Router

Vue Router官網 1、npm install vue-router4 2、創建模塊,在src目錄小創/views/map/MapIndex.vue模塊和創router/index.js文件 3、在router/index.js配置路由 import Vue from "vue"; import Router from "vue-router"; // 引入模塊 const Ma…

C語言——在頭?件中#if、_STDC_等字?起什么作??

一、問題 通常,?些程序員都不會去研究頭?件中的內容是什么含義,總覺得亂亂的,有很多 #if、_STDC_、#line 等字符,那么這些字符都各代表什么呢,在頭?件中又起到什么作?呢? 二、解答 在頭?件中存在類似…

智慧校園建設的進階之路

智慧校園的建設現已到達了老練的階段,許多學校設備充滿著數字化信息,進出宿舍樓,校園一卡通體系會記載下學生信息,外來人員闖入會報警,翻開電腦就能查到學生是否在宿舍等……學生的學習和日子都充滿了數字化的痕跡。但…

C# WPF入門學習(三)

目錄 核心架構 核心組件和概念 1. XAML(eXtensible Application Markup Language) 2. 依賴屬性(Dependency Properties) 3. 路由事件(Routed Events) 4. 數據綁定 5. 命令(Commands&…

itertools內置模塊的過濾妙用

itertools內置模塊的妙用 過濾源迭代器中的元素 Python內置itertools模塊里有一些函數可以過濾源迭代器中的元素。 islice islice可以在不拷貝數據的前提下,按照下標切割源迭代器。可以只給出切割的終點,也可以同時給出起點和終點,還可以…

MongoDB 覆蓋索引查詢:提升性能的完整指南

MongoDB 覆蓋索引查詢是一種優化數據庫查詢性能的技術,它通過創建適當的索引,使查詢可以直接從索引中獲取所需的數據,而無需訪問實際的文檔數據。這種方式可以減少磁盤 I/O 和內存消耗,提高查詢性能。 基本語法 在 MongoDB 中&a…

SQL練習題:2.4

建表 # 學生表 create table t_student (stu_id varchar(10),stu_name varchar(10),stu_age datetime,stu_sex varchar(10) );# 課程表 create table t_t_course (c_id varchar(10),c_name varchar(10),c_teaid varchar(10) );# 教師表 create table t_t_teacher (tea…

光速入門python的OpenCV

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文整理python的OpenCV模塊的關鍵知識點 爭取用最短的時間入門OpenCV 并且做到筆記功能直接復制使用 OpenCV簡介 不浪費時間的介紹: 就是類似于ps操作圖片。 至于為什么不直接用ps,因為只有程序能…

【找出滿足差值條件的下標 I】python

目錄 暴力題解 優化:滑動窗口維護大小值 暴力題解 class Solution:def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:nlen(nums)for i in range(n):for j in range(n-1,-1,-1):if abs(i-j)>indexDiffere…

海康威視NVR通過ehome協議接入視頻監控平臺,視頻瀏覽顯示3011超時錯誤的問題解決,即:The request timeout! 【3011】

目錄 一、問題描述 二、問題分析 2.1 初步分析 2.2 查看日志 2.3 問題驗證 1、查看防火墻 2、查看安全組 3、問題原因 三、問題解決 3.1 防火墻開放相關端口 3.2 安全組增加規則 3.3 測試 1、TCP端口能夠聯通的情況 2、TCP端口不能夠聯通的情況 四、驗證 五、云…

「51媒體」如何與媒體建立良好關系?

傳媒如春雨,潤物細無聲,大家好,我是51媒體網胡老師。 與媒體建立良好關系對于企業或個人來說都是一項重要的公關活動。 了解媒體:研究媒體和記者的興趣,提供相關且有價值的信息。 建立聯系:通過專業的方式…

牛客NC324 下一個更大的數(三)【中等 雙指針 Java/Go/PHP/C++】參考lintcode 52 · 下一個排列

題目 題目鏈接: https://www.nowcoder.com/practice/475da0d4e37a481bacf9a09b5a059199 思路 第一步:獲取數字上每一個數,組成數組arr 第二步:利用“下一個排列” 問題解題方法來繼續作答,步驟:利用lintc…

C++進階之路:何為拷貝構造函數,深入理解淺拷貝與深拷貝(類與對象_中篇)

?? 歡迎大家來訪Srlua的博文(づ ̄3 ̄)づ╭?~?? 🌟🌟 歡迎各位親愛的讀者,感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua小謝,在這里我會分享我的知識和經驗。&am…

PostgreSQL基礎(三):PostgreSQL的基礎操作

文章目錄 PostgreSQL的基礎操作 一、用戶操作 二、權限操作 三、操作任務

DRM驅動(五)之drm_atomic_state

上節講到《DRM驅動(四)之ADD_FB》調用drmModeAddFB創建drm_framebuffer。然后通過 drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map); vaddr mmap(0, create.size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, map.offset); 將物理地址map到用戶空間后…

Python中list遍歷的幾種方式之沒有好與不好,只有合適不合適

Python中list遍歷的幾種方式 引言 Python是一種動態、解釋型的高級編程語言,以其簡潔、易讀的語法而廣受歡迎。在Python中,list是一種非常重要的數據結構,它允許存儲一系列的元素,這些元素可以是任何類型。遍歷list是處理數據的…

nginx的Connection refused

問題描述 nginx的錯誤日志中突然出現大量的的Connection refused問題,日志如下: 2020/03/19 09:52:53 [error] 20117#20117: *7403411764 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server:…