NDIS Filter开发-OID 请求

NDIS 定义对象标识符 (OID) 值来标识适配器参数,其中包括操作参数,例如设备特征、可配置的设置和统计信息。 Filter驱动程序可以查询或设置基础驱动程序的操作参数,或过滤/覆盖顶层驱动程序的 OID 请求。

NDIS 还为 NDIS 6.1 及更高版本的Filter驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支持经常查询或设置的 OID 请求。 例如,IPsecv2 (IPsecv2) 接口为直接 OID 请求提供 OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA OID。 对于 NDIS 驱动程序,直接 OID 请求接口是可选的。

对于 NDIS 6.81 及更高版本的Filter驱动程序,NDIS 提供 同步 OID 请求接口。 同步 OID 请求路径支持需要同步的 OID 或不应由Filter驱动程序(如 RSSv2 OID)排队的 OID。 同步 OID 请求接口对于 NDIS 驱动程序是可选的,但如果Filter驱动程序播发对 RSSv2 的支持,则是必需的。

在 NDIS Filter驱动程序中筛选 OID 请求

Filter驱动程序可以处理由过度分配驱动程序发起的 OID 请求。 NDIS 调用 FilterOidRequest 函数来处理每个 OID 请求。 Filter驱动程序可以通过调用 NdisFOidRequest 函数将 OID 请求转发到基础驱动程序。

NDIS 可以调用Filter驱动程序的 FilterCancelOidRequest 函数来取消 OID 请求。 当 NDIS 调用 FilterCancelOidRequest 时,Filter驱动程序应尝试尽快调用 NdisFOidRequest 函数。

下图演示了筛选的 OID 请求:

Filter驱动程序可以通过分别从 FilterOidRequest 返回NDIS_STATUS_SUCCESS或NDIS_STATUS_PENDING,以同步或异步方式完成 OID 请求。 FilterOidRequest 还可以同步完成并出现错误状态。

成功处理 OID 集请求的Filter驱动程序必须在从 OID 集请求返回时在 NDIS_OID_REQUEST 结构中设置 SupportedRevision 成员。 SupportedRevision 成员通知 OID 请求的发起方有关驱动程序支持的修订版。 

如果 FilterOidRequest 返回NDIS_STATUS_PENDING,则必须在完成 OID 请求后调用 NdisFOidRequestComplete 函数。 在这种情况下,驱动程序会在 NdisFOidRequestComplete 的 OidRequest 参数中传递请求的结果。 驱动程序在 NdisFOidRequestComplete 的 Status 参数中传递请求的最终状态。

如果 FilterOidRequest 返回NDIS_STATUS_SUCCESS,它将在 OidRequest 参数处的 NDIS_OID_REQUEST 结构中返回查询请求的结果。 在这种情况下,驱动程序不会调用 NdisFOidRequestComplete 函数。

若要将 OID 请求转发到基础驱动程序,Filter驱动程序会调用 NdisFOidRequest 函数。 如果不应将请求转发到基础驱动程序,Filter驱动程序可以立即完成请求。 若要在不转发的情况下完成请求,驱动程序可以从 FilterOidRequest 返回NDIS_STATUS_SUCCESS (或错误状态) ,也可以在返回NDIS_STATUS_PENDING后调用 NdisFOidRequestComplete 。

注意 在驱动程序调用 NdisFOidRequest 之前,驱动程序必须分配 NDIS_OID_REQUEST 结构,并通过调用 NdisAllocateCloneOidRequest 将请求信息传输到新结构。

转发的请求的处理方式与Filter驱动程序发起的请求相同。 

在基础驱动程序完成转发的请求后,Filter驱动程序可以修改响应(如有必要),并将其传递给过度分配的驱动程序。

Filter驱动程序在处于“正在重启”、“正在运行”、“正在暂停”或“已暂停”状态时,可以接收来自过度驱动程序的 OID 请求。

注意 与微型端口驱动程序一样,Filter驱动程序一次只能接收一个 OID 请求。 由于 NDIS 序列化发送到Filter模块的请求,因此在完成上一个请求之前,无法在 FilterOidRequest 中调用Filter驱动程序。

下面是Filter驱动程序修改 OID 请求的示例:

Filter驱动程序添加标头。 在这种情况下,在驱动程序从基础驱动程序收到对 OID_GEN_MAXIMUM_FRAME_SIZE 查询的响应后,Filter将从响应中减去其标头的大小。 驱动程序减去其标头大小,因为驱动程序在每个发送的数据包的前面插入一个标头,并删除每个接收的数据包中的标头。

从 NDIS Filter驱动程序生成 OID 请求

Filter驱动程序可以通过调用 NdisFOidRequest 函数来发起 OID 查询或设置对基础驱动程序的请求。

下图演示了Filter驱动程序发起的 OID 请求:

 

在Filter驱动程序调用 NdisFOidRequest 函数后,NDIS 将调用下一个基础驱动程序的请求函数。

为了同步完成, NdisFOidRequest 返回NDIS_STATUS_SUCCESS或错误状态。 为了异步完成, NdisFOidRequest 返回NDIS_STATUS_PENDING。

若要确定基础驱动程序成功处理了哪些信息,发出 OID 请求的Filter驱动程序必须在 OID 请求返回后检查NDIS_OID_REQUEST结构中 SupportedRevision 成员中的值。 

如果 NdisFOidRequest 返回NDIS_STATUS_PENDING,则 NDIS 会在基础驱动程序完成 OID 请求后调用 FilterOidRequestComplete 函数。 在这种情况下,NDIS 在 FilterOidRequestComplete 的 OidRequest 参数处传递请求的结果。 NDIS 在 FilterOidRequestComplete 的 Status 参数中传递请求的最终状态。

如果 NdisFOidRequest 返回NDIS_STATUS_SUCCESS,它将在 OidRequest 参数处的 NDIS_OID_REQUEST 结构中返回查询请求的结果。 在这种情况下,NDIS 不会调用 FilterOidRequestComplete 函数。

当驱动程序处于“正在重启”、“正在运行”、“正在暂停”或“已暂停”状态时,驱动程序可以调用 NdisFOidRequest。

注意 Filter驱动程序应跟踪其发起的 OID 请求,并确保在此类请求完成时不会调用 NdisFOidRequestComplete 函数。

Filter驱动直接 OID 请求

为了支持直接 OID 请求路径,Filter驱动程序在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中提供 FilterXxx 函数入口点,NDIS 为Filter驱动程序提供 NdisFXxx 函数。

直接 OID 请求接口类似于标准 OID 请求接口。 例如, NdisFDirectOidRequest 和 FilterDirectOidRequest 函数类似于 NdisFOidRequest 和 FilterOidRequest 函数。

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

Filter驱动程序必须能够处理未序列化的直接 OID 请求。 与标准 OID 请求接口不同,NDIS 不会将直接 OID 请求与使用直接 OID 接口或标准 OID 请求接口发送的其他请求序列化。 此外,Filter驱动程序必须能够在 IRQL <= DISPATCH_LEVEL 处理直接 OID 请求。

若要支持直接 OID 请求接口,请使用标准 OID 请求接口的文档。 下表显示了直接 OID 请求接口中的函数与标准 OID 请求接口之间的关系:

Filter驱动同步 OID 请求

为了支持同步 OID 请求路径,Filter驱动程序在调用 NdisFRegisterFilterDriver 函数时,在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中提供 FilterSynchronousOidRequest 函数入口点。

NDIS 6.81 支持用于同步 OID 请求接口的特定 OID。 不支持在 NDIS 6.80 和某些 NDIS 6.80 OID 之前存在的 OID。 

若要支持同步 OID 请求接口,请使用标准 OID 请求接口的文档。 下表显示了同步 OID 请求接口中的函数与标准 OID 请求接口之间的关系:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_SPI

1、SPI简介 1.1 什么是SPI SPI&#xff0c;即Serial Peripheral Interface&#xff0c;串行外设接口。SPI是一种高速的、全双工、同步的串行通信总线&#xff1b;SPI采用主从方式工作&#xff0c;一般有一个主设备和一个或多个从设备&#xff1b;SPI需要至少4根线&#xff0c;…

【操作与配置】VS2017与MFC环境配置

【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于软件开发人员和团队。使用此应用程序&#xff0c;您可以构建和调试现代Web应用程序&#xff0c;并利用扩展帮助探索几乎任何编程语言。…

springboot高校网上选课系统-计算机毕业设计源码85583

摘 要 本论文主要论述了如何使用JAVA语言开发一个高校网上选课系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述高校网上选课系统的当前背景以及系统开发的目…

重复文件怎么查找并清理?电脑重复文件清理工具分享:4个

在日常使用电脑的过程中&#xff0c;我们不可避免地会遇到各种重复文件的问题。这些重复文件不仅占据了宝贵的存储空间&#xff0c;还可能导致系统性能下降&#xff0c;甚至引发一些不必要的问题。因此&#xff0c;如何有效地查找并清理这些重复文件成为了许多用户关注的焦点。…

牛客BM85 验证IP地址【中等 字符串 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880 https://www.lintcode.com/problem/1222/description 思路 直接模拟&#xff0c;注意IPv4,ipv6的条件Java代码 import java.util.*;public class Solution {/*** 验证IP地址…

docker基础,docker安装mysql,docker安装Nginx,docker安装mq,docker基础命令

核心功能操作镜像 Docker安装mysql docker run -d --name mysql -p 3306:3306 -e TZAsia/Shanghai -e MYSQL_ROOT_PASSWORDlcl15604007179 mysql docker的基本操作 docker rm 容器名称即可 docker ps 查看当前运行的容器 docker rm 干掉当前容器 docker logs 查看容器命令日…

Day 41 NGINX详解

Nginx详解 一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 1、HTTP 工作原理 HTTP协议通信流程 WEB Server&…

数组基础-笔记

数组是非常基础的数据结构&#xff0c;实现运用和理解是两回事 数组是存放在连续内存空间上的相同类型的数据的集合 可以方便的通过下表索引的方式获取到下标下对应的数据。 举一个字符数组的例子&#xff1a; 注意两点&#xff1a; 数组下标从0开始 数组内存空间的地址是连…

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志&#xff1a;日志信息包含&#xff1a;操作人、操作时间、执行方法的全类名、执行方法名、方法…

pytest框架用例命名规则详解

pytest 测试用例的命名规则是为了确保 pytest 能够正确地识别和执行测试用例。 以下是关于 pytest 测试用例命名规则的详细解释&#xff1a; 1 编写单个测试文件 单个测试文件须以‘test_’开头或者以‘_test’结尾 比如我们创建test_case1.py case2_test.py文件。 2 在单个…

【Mac】Lightroom Classic 2024(LrC 2024中文版) v13.1安装教程

软件介绍 Lightroom Classic 2024 for Mac是一款功能强大的照片编辑和组织软件&#xff0c;专为专业摄影师和爱好者设计。它提供了一系列工具和功能来增强和管理您的数码照片。Lightroom Classic 2024在照片组织和管理方面进行了重大改进。它新增了一个智能化的“发现”面板&a…

电容的电路应用

电容的电路应用 1、陶瓷电容应用于滤波 电源电路&#xff0c;负载电流较小时&#xff0c;可以使用陶瓷电容进行滤波。 C18电容起到滤波作用&#xff0c;因为负载电流比较小&#xff0c;所以可以用小容量的电容&#xff0c;比如经典的10uF、1uF、4.7uF都是可以的 滤波过程&am…

名下企业查询,清晰明了;在线操作,方便快捷

在现代社会&#xff0c;越来越多的人开始涉足创业和投资&#xff0c;拥有自己的企业成为一种时尚。然而&#xff0c;随之而来的是繁琐的企业注册流程和复杂的信息查询。为了解决这个问题&#xff0c;挖数据平台推出了一项名下企业查询接口&#xff0c;提供了一种方便快捷的方式…

easy-captcha生成验证码

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程&#xff01; 什么是Docker&#xff1f;看这一篇干货文章就够了&#xff01; UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#…

低代码开发系统是什么?它有那些部分组成?

低代码开发系统是什么&#xff1f;它有那些部分组成&#xff1f; 一、引言 在当今快速变化的商业环境中&#xff0c;企业对于快速响应市场需求、降低开发成本和提高开发效率的需求日益增强。低代码开发系统&#xff08;Low-Code Development Platform&#xff09;应运而生&am…

视频监控平台AS1000:通过网络SDK接入松下视频监控设备(Panasonic监控摄像机) 的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 1、概述 2、视频接入能力介绍 3、功能介绍 二、PANASONIC网络摄像机 1、产品种类与定位 2、规格参数 3、功能特点 4、环境适应性 5、网络功能 6、其他特性 三、代码和解释 1、代码和注释 2、函数功能说明 &#xff08;1&#xff09;处…

SpringBoot项目启动时提示程序包不存在和找不到符号

一、前言 最近接手同事开发的一个Springboot工作项目&#xff0c;从svn上整体拉取下来后&#xff0c;构建完成后&#xff0c;启动的时候遇到了程序包找不到的情况&#xff0c;记录一下处理过程&#xff1b; 二、项目问题 1、报错信息&#xff1a;启动后报 java: 程序包org.sp…

MySql 查询缓存

前言 MySQL的查询缓存&#xff08;Query Cache&#xff09;是一个在内存中存储SELECT语句及其结果集的机制&#xff0c;目的是避免对相同的查询进行重复的解析、编译和执行&#xff0c;从而提高数据库性能。 Mysql 结构图如下&#xff1a; 查询缓存的工作流程大致如下&#…

UE5 读取本地图片并转换为base64字符串

调试网址&#xff1a;在线图像转Base64 - 码工具 (matools.com) 注意要加&#xff08;data:image/png;base64,&#xff09; FString UBasicFuncLib::LoadImageToBase64(const FString& ImagePath) {TArray<uint8> ImageData;// Step 1: 读取图片文件到字节数组if (!…