NDIS Filter开发-PNP响应和安装

NDIS filter驱动可能是最容易生成的驱动之一,如果你安装了VS 2015 + WDK之后,你可以直接生成一个能运行的Filter驱动,它一般是ndislwf。

和大部分硬件不同,NDIS Filter驱动介于软件和硬件抽象层之上,它和硬件相关,但是只需要很少的硬件知识就可以理解;同时也需要一定的网络协议知识,并且NDIS对windows内核进行了很好的封转,故它是一个非常适合拿来入门的驱动程序,许多人也使用这个驱动来进行开发入门。

还有另外一点是,NDIS filter驱动是性能提升最大的驱动之一,它相比于socket来说会提升非常巨大。

Filter模块 PnP 事件通知

Filter驱动程序可以接收基础微型端口驱动程序接收的所有设备即插即用 (PnP) 通知。 此外,Filter驱动程序可以接收过度协议驱动程序接收的所有网络 PnP 通知。PnP 通知的处理特定于驱动程序。

下图演示了经过筛选的设备 PnP 事件通知:

9478772999db4fb1949c06cfd1c938f1.png 

Filter驱动程序提供 FilterDevicePnPEventNotify 函数,NDIS 调用该函数以传入设备 PnP 和电源管理事件通知。 这类似于 MiniportDevicePnPEventNotify 函数。

Filter驱动程序可以将设备 PnP 和电源管理事件转发到基础驱动程序。 若要转发设备 PnP 或电源管理事件,请调用 NdisFDevicePnPEventNotify 函数。

下图演示了经过筛选的网络 PnP 事件通知:

8cdfa4cc0cbd4212829a77932c4b0b15.png

 

Filter驱动程序提供 FilterNetPnPEvent 函数,NDIS 调用该函数以传入网络 PnP 和电源管理事件通知。 这类似于 ProtocolNetPnPEvent 函数。

Filter驱动程序可以将网络 PnP 和电源管理事件转发到过度覆盖的驱动程序。 若要转发网络 PnP 或电源管理事件,请调用 NdisFNetPnPEvent 函数。

Filter驱动程序应处理驱动程序堆栈更改。 如果需要允许处理这些事件,NDIS 可以在 PnP 或电源管理通知后启动暂停操作。

Filter模块状态指示

Filter驱动程序可以提供 NDIS 在基础驱动程序报告状态时调用的 FilterStatus 函数。 Filter驱动程序还可以启动状态指示。

下图演示了筛选的状态指示:

b547376a95df44f2a89a3602c036e7bd.png

在基础驱动程序调用状态指示函数 (NdisMIndicateStatusEx 或 NdisFIndicateStatus) 之后,NDIS 调用Filter驱动程序的 FilterStatus 函数。 

Filter驱动程序在其 FilterStatus 函数中调用 NdisFIndicateStatus,以将筛选的状态指示传递给过分的驱动程序。 Filter驱动程序可以通过不调用 NdisFIndicateStatus) 来筛选出状态指示,或者在调用 NdisFIndicateStatus 之前修改指示的状态。

若要发出状态指示,Filter驱动程序调用 NdisFIndicateStatus ,而无需事先调用 FilterStatus。

在这种情况下,Filter驱动程序应将 SourceHandle 成员设置为 NDIS 传递给 FilterAttach 函数的 NdisFilterHandle 参数的句柄。 如果状态指示与 OID 请求相关联,则Filter驱动程序可以设置 DestinationHandle 和 RequestId 成员,以便 NDIS 可以提供特定协议绑定的状态指示。

在Filter驱动程序调用 NdisFIndicateStatus 后,NDIS (ProtocolStatusEx 或 FilterStatus 调用状态函数) 下一个过度覆盖的驱动程序。

NDIS Filter驱动程序安装

本部分提供有关安装 NDIS Filter驱动程序的信息。 轻型Filter驱动程序不同于Filter中间驱动程序。 配置管理器为每个微型端口适配器提供 NDIS Filter模块列表。 没有与Filter驱动程序关联的虚拟设备 (或虚拟微型端口) 与 NDIS Filter中间驱动程序一样。

若要安装Filter驱动程序,必须提供单个 INF 文件。 配置管理器从 INF 文件读取有关Filter驱动程序的配置信息,并将其复制到注册表。

Filter驱动程序 INF 文件定义网络服务,Filter驱动程序没有微型端口 INF 文件。 

指定Filter驱动程序绑定关系

在网络驱动程序 INF 文件中, UpperRange 条目列出了可能的上限绑定, LowerRange 条目列出了可能的较低绑定。 这些条目可以包含各种系统定义的值。 

对于Filter驱动程序,必须将 UpperRange 和 LowerRange 条目的值分别设置为 noupper 和 nolower。 以下示例演示了Filter驱动程序的这些 INF 文件条目。

HKR, Ndi\Interfaces,UpperRange,,"noupper"
HKR, Ndi\Interfaces,LowerRange,,"nolower"

在Filter驱动程序中,Filter INF 文件中的 FilterMediaTypes 条目定义驱动程序与其他驱动程序的绑定。 FilterMediaTypes 指定筛选驱动程序服务的媒体类型。  以下示例演示了 Filter驱动程序的 FilterMediaTypes 条目。 

HKR, Ndi\Interfaces, FilterMediaTypes,,"ethernet"

当计算机加载Filter驱动程序时,驱动程序将插入到所有现有的协议到适配器绑定中,具体取决于 FilterMediaTypes 列出的媒体类型。

注意: 在某些版本上,Filter驱动存在个数限制。 

访问Filter驱动程序的配置信息

NDIS 支持一组函数,这些函数提供对Filter驱动程序注册表参数的访问权限。 Filter驱动程序可以在附加或重启操作期间或在处理即插即用 (PnP) 通知时访问这些参数。 

Filter驱动程序调用 NdisOpenConfigurationEx 函数来访问注册表设置。 如果Filter驱动程序通过调用 NdisFRegisterFilterDriver 函数获取了 NDIS_CONFIGURATION_OBJECT 结构的 NdisHandle 成员中的句柄,则 NdisOpenConfigurationEx 函数将提供存储Filter驱动程序配置参数的注册表位置的句柄。 Filter驱动程序可以使用配置句柄,直到调用 NdisFDeregisterFilterDriver 函数。

如果Filter驱动程序从 FilterAttach 函数的 NdisFilterHandle 参数中获取了 NdisHandle 中的句柄,则 NdisOpenConfigurationEx 提供存储Filter模块配置参数的注册表位置的句柄。 Filter驱动程序可以使用配置句柄,直到 NDIS 分离Filter模块并且 FilterDetach 函数返回。 如果监视Filter驱动程序在 NDIS_CONFIGURATION_OBJECT 结构的 Flags 成员中指定 NDIS_CONFIG_FLAG_FILTER_INSTANCE_CONFIGURATION 标志,则当在同一微型端口适配器上配置多个Filter模块时,驱动程序可以访问特定Filter模块的Filter模块配置。 修改Filter驱动程序不得使用此标志。

驱动程序访问配置信息后,驱动程序必须调用 NdisCloseConfiguration 函数来释放配置句柄和相关资源。

下面是系统默认生成的Filter inf文件

;-------------------------------------------------------------------------
; ndislwf1.INF -- NDIS LightWeight Filter Driver
;
; TODO: Search for comments marked "TODO:", and follow their instructions to
; customize this INF for your driver.  Then delete the "TODO:" comments.
;-------------------------------------------------------------------------[version]
; Do not change these values
Signature       = "$Windows NT$"
Class           = NetService
ClassGUID       = {4D36E974-E325-11CE-BFC1-08002BE10318}
; TODO: Customize this string for your company name
Provider        = %Msft%
DriverVer       = 
CatalogFile     = ndislwf1.cat; TODO: Include each architecture for which your driver package contains a
; compiled binary.  If you do not supply a driver compiled for ia64, delete the
; NTia64 section.
[Manufacturer]
%Msft%=MSFT,NTx86,NTia64,NTamd64,NTarm,NTarm64; MS_ndislwf1 can be used with netcfg.exe to install/uninstall the driver.
[MSFT.NTx86]
%ndislwf1_Desc%=Install, MS_ndislwf1[MSFT.NTia64]
%ndislwf1_Desc%=Install, MS_ndislwf1[MSFT.NTamd64]
%ndislwf1_Desc%=Install, MS_ndislwf1[MSFT.NTarm]
%ndislwf1_Desc%=Install, MS_ndislwf1[MSFT.NTarm64]
%ndislwf1_Desc%=Install, MS_ndislwf1;-------------------------------------------------------------------------
; Installation Section
;-------------------------------------------------------------------------
[Install]
AddReg=Inst_Ndi
; All LWFs must include the 0x40000 bit (NCF_LW_FILTER). Unlike miniports, you
; don't usually need to customize this value.
Characteristics=0x40000; This must be a random, unique value.
; FILTER_UNIQUE_NAME in filter.h must match this GUID identically.
; Both should have {curly braces}.
NetCfgInstanceId="{76610a0d-1aed-494e-84c8-9661e499deee}"Copyfiles = ndislwf1.copyfiles.sys[SourceDisksNames]
1=%ndislwf1_Desc%,"",,[SourceDisksFiles]
; TODO: Include any related files that should be installed with your driver.
ndislwf1.sys=1[DestinationDirs]
DefaultDestDir=12
ndislwf1.copyfiles.sys=12[ndislwf1.copyfiles.sys]
ndislwf1.sys,,,2;-------------------------------------------------------------------------
; Ndi installation support
;-------------------------------------------------------------------------
[Inst_Ndi]
HKR, Ndi,Service,,"ndislwf1"
HKR, Ndi,CoServices,0x00010000,"ndislwf1"
HKR, Ndi,HelpText,,%ndislwf1_HelpText%
; TODO: Set the FilterClass here.  The FilterClass controls the order in which
; filters are bound to the underlying miniport.  Possible options include:
;     Custom, Diagnostic, Failover, Loadbalance, Vpn, Compression, Encryption, Scheduler
; See MSDN for a description of each.
HKR, Ndi,FilterClass,, compression
; TODO: Specify whether you have a Modifying or Monitoring filter.
; For a Monitoring filter, use this:
;     HKR, Ndi,FilterType,0x00010001, 1 ; Monitoring filter
; For a Modifying filter, use this:
;     HKR, Ndi,FilterType,0x00010001, 2 ; Modifying filter
HKR, Ndi,FilterType,0x00010001,2
; Do not change these values
HKR, Ndi\Interfaces,UpperRange,,"noupper"
HKR, Ndi\Interfaces,LowerRange,,"nolower"
; TODO: Ensure that the list of media types below is correct.  Typically,
; filters include "ethernet".  Filters may also include "ppip" to include
; native WWAN stacks, but you must be prepared to handle the packet framing.
; Possible values are listed on MSDN, but common values include:
;     ethernet, wan, ppip, wlan
HKR, Ndi\Interfaces, FilterMediaTypes,,"ethernet, wan, ppip"
; TODO: Specify whether you have a Mandatory or Optional filter.
; For a Mandatory filter, use this:
;     HKR, Ndi,FilterRunType,0x00010001, 1 ; Mandatory filter
; For an Optional filter, use this:
;     HKR, Ndi,FilterRunType,0x00010001, 2 ; Optional filter
HKR, Ndi,FilterRunType,0x00010001, 1 ; Mandatory filter;-------------------------------------------------------------------------
; Service installation support
;-------------------------------------------------------------------------
[Install.Services]
; TODO: You may want to add the SPSVCINST_STARTSERVICE flag, like this:
;     AddService=ndislwf1,0x800,ndislwf1_Service_Inst ; SPSVCINST_STARTSERVICE
AddService=ndislwf1,,ndislwf1_Service_Inst[ndislwf1_Service_Inst]
DisplayName     = %ndislwf1_Desc%
ServiceType     = 1 ;SERVICE_KERNEL_DRIVER
; Typically you will want your filter driver to start with SERVICE_SYSTEM_START.
; If it is an Optional filter, you may also use 3;SERVICE_DEMAND_START.
StartType       = 1 ;SERVICE_SYSTEM_START
ErrorControl    = 1 ;SERVICE_ERROR_NORMAL
ServiceBinary   = %12%\ndislwf1.sys
LoadOrderGroup  = NDIS
Description     = %ndislwf1_Desc%
AddReg          = Common.Params.reg, NdisImPlatformBindingOptions.reg[Install.Remove.Services]
; The SPSVCINST_STOPSERVICE flag instructs SCM to stop the NT service
; before uninstalling the driver.
DelService=ndislwf1,0x200 ; SPSVCINST_STOPSERVICE[Common.Params.reg]
; TODO: You can add any sort of NDIS parameters here.  Filter drivers
; don't always need NDIS parameters, so it's okay to have nothing here.; TODO: Remove the sample parameters below.; Sample 1: "DriverParam" is a per-driver parameter.
HKR, FilterDriverParams\DriverParam,     ParamDesc,   , "Driverparam for lwf"
HKR, FilterDriverParams\DriverParam,     default,     , "5"
HKR, FilterDriverParams\DriverParam,     type,        , "int"; Sample 2: "AdapterParam" is a per-module parameter.
HKR, FilterAdapterParams\AdapterParam,   ParamDesc,   , "Adapterparam for lwf"
HKR, FilterAdapterParams\AdapterParam,   default,     , "10"
HKR, FilterAdapterParams\AdapterParam,   type,        , "int"[NdisImPlatformBindingOptions.reg]
; By default, when an LBFO team or Bridge is created, all filters will be
; unbound from the underlying members and bound to the TNic(s). This keyword
; allows a component to opt out of the default behavior
; To prevent binding this filter to the TNic(s):
;   HKR, Parameters, NdisImPlatformBindingOptions,0x00010001,1 ; Do not bind to TNic
; To prevent unbinding this filter from underlying members:
;   HKR, Parameters, NdisImPlatformBindingOptions,0x00010001,2 ; Do not unbind from Members
; To prevent both binding to TNic and unbinding from members:
;   HKR, Parameters, NdisImPlatformBindingOptions,0x00010001,3 ; Do not bind to TNic or unbind from Members
HKR, Parameters, NdisImPlatformBindingOptions,0x00010001,0 ; Subscribe to default behavior[Strings]
; TODO: Customize these strings.
Msft = "<Your manufacturer name>" ;TODO: Replace with your manufacturer name
ndislwf1_Desc = "ndislwf1 NDIS LightWeight Filter"
ndislwf1_HelpText = "ndislwf1 NDIS LightWeight Filter"

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年最新的软件测试面试总结(答案+文档)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平…

老师如何制作高考后志愿填报信息采集系统?

高考结束后&#xff0c;志愿填报成为学生们的头等大事。面对众多选择&#xff0c;如何高效、准确地填报志愿&#xff0c;是每个学生和家长都关心的问题。作为老师&#xff0c;能否利用现有的技术工具&#xff0c;帮助学生更好地完成志愿填报呢&#xff1f; 老师们需要一个能够…

[C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波

在使用OpenCvSharp进行图像滤波处理时&#xff0c;各种滤波方法都有其特定的用途和效果。以下是对中值滤波、均值滤波、高通滤波、双边滤波、锐化滤波和自定义滤波的详细解释和归纳&#xff1a; 中值滤波&#xff08;MedianBlur&#xff09; 原理与作用&#xff1a;中值滤波是…

SpringBoot实现参数校验拦截(采用AOP方式)

一、AOP是什么&#xff1f; 目的&#xff1a;分离横切关注点&#xff08;如日志记录、事务管理&#xff09;与核心业务逻辑。 优势&#xff1a;提高代码的可读性和可维护性。 关键概念 切面&#xff08;Aspect&#xff09;&#xff1a;包含横切关注点代码的模块。通知&#xff…

leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II

一、[24]两两交换链表中的节点 重点&#xff1a;暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点&#xff1a;存节点while(pre.next!null&&pre.next.next…

视频去水印电脑版,视频去水印软件

视频去水印怎么去&#xff0c;一直是视频编辑者们的热门话题。那么&#xff0c;如何去除频水印呢&#xff1f;接下来&#xff0c;我们将为您详细介绍视频去水印方法。 第一种方法&#xff1a; 首先通过浏览器打开 “ 51视频处理官网” 的网站。打开网站后&#xff0c;我们上传…

第一个小爬虫_爬取 股票数据

前言 爬取 雪球网的股票数据 [环境使用]&#xff1a;python 3.12 解释器pycharm 编辑器 【模块使用】&#xff1a;import requests -->数据请求模块 要安装 命令 pip install requestsimport csv -->将数据保存到CSV表格中import pandas -->也可以将数据保…

VS2019 QT无法打开 源 文件 “QTcpSocket“

VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…

【启明智显分享】基于工业级芯片Model3A的7寸彩色触摸屏应用于智慧电子桌牌方案

一场大型会议的布置&#xff0c;往往少不了制作安放参会人物的桌牌。制作、打印、裁剪&#xff0c;若有临时参与人员变更&#xff0c;会务方免不了手忙脚乱更新桌牌。由此&#xff0c;智能电子桌牌应运而生&#xff0c;工作人员通过系统操作更新桌牌信息&#xff0c;解决了传统…

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…

python数据分析-心脏衰竭分析与预测

研究背景 人的心脏有四个瓣膜&#xff0c;主动脉银、二尖、肺动脉和三尖源 不管是那一个膜发生了病变&#xff0c;都会导致心脏内的血流受到影响&#xff0c;这就是通常所说的心脏期膜病&#xff0c;很多是需要通过手术的方式进行改善的。随着人口老龄化的加剧,&#xff0c;心…

限时限量!6.18云服务器大促盘点,错过一次,再等一年!

随着云计算技术的飞速发展&#xff0c;云服务器已成为企业和个人构建和扩展在线业务的首选平台。特别是在大型促销活动如618年中大促期间&#xff0c;云服务提供商纷纷推出极具吸引力的优惠&#xff0c;以降低用户上云的门槛。以下是对当前市场上几个主流云服务提供商的优惠活动…

【设计模式】JAVA Design Patterns——Servant(服务模式)

&#x1f50d;目的 仆人类被用于向一组类提供一些行为&#xff0c;区别于在每个类定义行为-或者当我们无法排除 公共父类中的这种行为&#xff0c;这些行为在仆人类被定义一次 &#x1f50d;解释 真实世界例子 国王、王后和其他宫廷皇室成员需要仆人为他们提供饮食、准备饮料等…

【TB作品】MSP430F5529 单片机,简单电子琴

使用MSP430制作一个简单电子琴 作品功能 这个项目基于MSP430单片机&#xff0c;实现了一个简单的电子琴。通过按键输入&#xff0c;电子琴可以发出对应的音符声音。具体功能包括&#xff1a; 按下按键时发出对应音符的声音。松开按键时停止发声。支持C调低音、中音和高音。 …

算法:226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

带池化注意力 Strip Pooling | Rethinking Spatial Pooling for Scene Parsing

论文地址:https://arxiv.org/abs/2003.13328 代码地址:https://github.com/houqb/SPNet 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种…

Ruoyi-Vue-Plus 下载启动后菜单无法点击展开,

1.Ruoyi-Vue-Plus框架下载后运行 2.使用mock数据 3.进入页面后无法点击菜单 本以为是动态路由或者菜单逻辑出了问题&#xff0c;最后发现是websocket的问题 解决办法 把这两行代码注释 页面菜单即可点击。 以上。

安徽代理记账公司的专业服务和创新理念

在当今竞争激烈的市场环境中&#xff0c;为了提升企业的运营效率&#xff0c;许多企业开始寻找专业的代理记账公司进行财务管理和记账&#xff0c;本文将介绍一家名为安徽代理记账公司的专业服务和创新理念。 安徽代理记账公司是一家专注于为企业提供全方位会计服务的公司&…

开关电源RCD吸收电路解析与设计

开关电源RCD吸收电路解析与设计 引言 在电源设计中,RCD电路以其出色的能量吸收能力,有效降低电阻损耗,从而被广泛应用。然而,对于新手来说,理解和掌握开关电源中的RCD吸收电路可能是一个挑战。本文旨在深入剖析RCD吸收电路的设计原理和步骤,帮助读者更好地理解和应用这…

如何在快团团上找到优质的供货团长和挑选合适的产品进行推广?

在快团团上找到优质的供货团长和挑选合适的产品进行推广的方法如下&#xff1a; 筛选优质供货团长&#xff1a; 选择专业品类&#xff1a;根据你熟悉的领域和目标客户的需求&#xff0c;选择相应的专业供货团长。查看帮卖口碑标签&#xff1a;通过查看团长的帮卖口碑标签&#…