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"




 

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

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

相关文章

AI2THOR 2.1.0使用教程

一、安装和入门 1.1 AI2-THOR使用要求 操作系统&#xff1a; Mac OS X 10.9&#xff0c; Ubuntu 14.04显卡&#xff1a;DX9&#xff08;着色器型号 3.0&#xff09;或 DX11&#xff0c;功能级别为 9.3。CPU&#xff1a;支持 SSE2 指令集。Python 2.7 或 Python 3.5Linux 用户…

FuTalk设计周刊-Vol.040

&#x1f525;AI漫谈 热点捕手 1、零代码定制游戏NPC&#xff0c;百川智能发布角色大模型 百川智能此次推出了“角色创建平台搜索增强知识库”的定制化解决方案。通过这一方案&#xff0c;游戏厂商无需编写任何代码&#xff0c;只需通过简单的文字描述&#xff0c;便可以快速…

28-unittest批量执行(discover)

unittest框架提供了创建测试用例、测试套件以及批量执行的解决方案。 利用单元测试框架创建测试类&#xff0c;可以把每个测试方法看成是一个最小的单元&#xff0c; 由测试容器组装打包起来&#xff0c;然后可以统一执行&#xff0c;最后输出测试报告。 一、UnitTest核心要素…

OpenCV如何判断一张图片是否有过高的明暗变化

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 前言 判断一张图片是否有过高的明暗变化&#xff0c;可以通过分析图像的亮度分布一致性来实现。一种常见的做法是计算图像的亮度标准差&#xff08;Standard …

JAVA技术设计模式

设计模式结构图 设计原则 职责单一原则接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上 依赖倒置面向接口编程,参数或变量,依赖注入,使用父类 开闭原则 对扩展开放(对提供方),对修改关闭(对使用方) 用抽象构建框架,用实现扩展细节 里氏替换原则…

计算机网络--物理层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 基本概念 物理层的概念&#xff1a;物理层解决如何在在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的&#xff0c;即使CPU没有执行程序&#xff0c;也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量&#xff0c;防止编译器优化&#xff0c; #define __IO volati…

2024-6-9 石群电路-27

2024-6-9&#xff0c;星期日&#xff0c;12:49&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。Hello&#xff0c;大家&#xff0c;我回来啦&#xff0c;昨天断更了一天&#xff0c;是为什么捏&#xff0c;是因为&#xff0c;我通过毕业答辩啦&#xff01;&…

数据挖掘分析的一点进步分享

import pandas as pd import matplotlib.pyplot as plt import numpy as npdata pd.read_csv(heros.csv,encoding"gbk") data.head() 导入数据集 进行分析 df_datadata.copy() df_data.describe()df_data.info() df_data.drop(英雄,axis1,inplaceTrue) df_data[最…

[C++初阶]string类的详解

一、string类的模拟实现 上面已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让我们来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。大家看下以下string类的实现是…

Flink 问题之 No Watermark (Watermarks are only available if EventTime is used)

问题背景 Flink-1.17.0在集群下&#xff0c;获取Kafka集群数据&#xff0c;进行流模式实时计算&#xff0c;Watermarks提示&#xff1a;No Watermark (Watermarks are only available if EventTime is used)&#xff1b; source数据源是从kafka中读取topic数据&#xff0c;经…

【最新鸿蒙应用开发】——ArkUI两种开发范式

在进行鸿蒙应用开发&#xff0c;openHarmony提供了一种页面开发框架叫做ArkUI方舟框架来进行页面布局的开发。 ArkUI方舟UI框架 针对不同的应用场景及技术背景&#xff0c;方舟UI框架提供了两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式…

分享美好,高清无阻 - 直播极简联网解决方案

1、需求背景 随着移动互联网、UGC模式和直播平台的发展&#xff0c;网络直播的门槛日益降低&#xff0c;越来越多的人希望成为直播的主角。基于物联网的户外直播无线联网解决方案应运而生&#xff0c;满足直播者的需求。 户外直播无线联网解决方案提供了无处不在的直播体验&a…

UniAnimate:华科提出人类跳舞视频生成新框架,支持合成一分钟高清视频

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

未来AI大模型的发展趋势

大家好&#xff0c;我是小悟 未来AI大模型的发展趋势无疑将是多元化、高效化、普及化以及人性化。随着技术的飞速进步&#xff0c;AI大模型将在各个领域中展现出更加广泛和深入的应用&#xff0c;成为推动社会进步的重要力量。 多元化是AI大模型发展的重要方向。随着数据量的…

vue26:vue的环境搭建

vue环境安装配置 在点击上方链接前&#xff0c;注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 下方的红字&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

0、引言 ⚠️ 在开始之前&#xff0c;您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好&#xff0c;可以参考这篇文章 本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目&#xff08;工作空间&#xff09;。 1、本教程使用到的相关软件或产品 Ubuntu 20.0…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时&#xff0c;已经可以通过web进行交互。langchain重新封装了一下AI框架&#xff0c;提供更加友好的开发功能&#xff0c;类似于AI届的spring框架。langchain的安装过程也类似于上一步说的&#xff1a;【AI基础】第三步&#xff1a;纯天然手动安装…

github异常问题总结

问题1&#xff1a; gitgitlab.gz.cvte.cn: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解决方法&#xff1a; 这个错误表示 GitLab 服务器拒绝了你的 SSH…