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.mzph.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:…