TDI过滤程序框架

Windows内核原理与实现之TDI(传输驱动程序接口) 文章摘录自《Windows内核原理与实现》一书。 我们植到,Winsock以网络协议为基础来访问网络,比如TCP/IP和IPX/SPX等,其相应的内核驱动程序为afd.sys。那么,像 afd.sys这样的网络 API 驱动程序在接收到针对特定协议的网络请求时,如何将请求转交给相应的协议驱动程序呢?它如何适应不同网络协议的实现差异呢? Windows 在网络 API驱动程序与协议驱动程序之间规定... 阅读详情
#include <ntddk.h>
#include <tdikrnl.h>
#include <ws2def.h>
#include <WDM.H>


//保存设备指针的全局变量

PDEVICE_OBJECT
g_tcpfltobj=NULL,
g_udpfltobj=NULL,
g_ipfltobj=NULL,
g_tcpoldobj=NULL,
g_udpoldobj=NULL,
g_ipoldobj=NULL;

//函数声明

NTSTATUS c_n_a_device(PDRIVER_OBJECT DriverObject,PDEVICE_OBJECT *fltobj,PDEVICE_OBJECT *oldobj,wchar_t *devname);
NTSTATUS DeviceDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp);
PDEVICE_OBJECT get_original_devobj(PDEVICE_OBJECT flt_devobj,int *proto);


//卸载函数

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
 if(g_tcpoldobj!=NULL)IoDetachDevice(g_tcpoldobj); //解除  旧的
 if(g_tcpfltobj!=NULL)IoDeleteDevice(g_tcpfltobj); //删除  新的
 if(g_udpoldobj!=NULL)IoDetachDevice(g_udpfltobj);
 if(g_udpfltobj!=NULL)IoDeleteDevice(g_udpfltobj);
 if(g_ipoldobj!=NULL)IoDetachDevice(g_ipoldobj);
 if(g_ipfltobj!=NULL)IoDeleteDevice(g_ipfltobj);

}

//驱动入口函数

NTSTATUS  DriverEntry(IN PDRIVER_OBJECT theDriverObject,IN PUNICODE_STRING  theRegistryPath)
{
 NTSTATUS status=STATUS_SUCCESS;
 int i; 

 //设置分发函数
 for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
  theDriverObject->MajorFunction[i]=DeviceDispatch;

 //设置卸载函数
 theDriverObject->DriverUnload=OnUnload;

 //绑定TDI设备 \\Device\\Tcp
 status=c_n_a_device(theDriverObject,&g_tcpfltobj,&g_tcpoldobj,L"\\Device\\Tcp");
 if(status!=STATUS_SUCCESS)
 {
  KdPrint(("[tdi_fw] DriverEntry:c_n_a_device:0x%x\n",status)); //
  goto done;
 }
 //绑定TDI设备 \\Device\\Udp
 status=c_n_a_device(theDriverObject,&g_udpfltobj,&g_udpoldobj,L"\\Device\\Udp");
 if(status!=STATUS_SUCCESS)
 {
  KdPrint(("[tdi_fw] DriverEntry:c_n_a_device:0x%x\n",status));
  goto done;
 }
 //绑定TDI设备 \\Device\\RawIp
 status=c_n_a_device(theDriverObject,&g_ipfltobj,&g_ipoldobj,L"\\Device\\RawIp");
 if(status!=STATUS_SUCCESS)
 {
  KdPrint(("[tdi_fw] DriverEntry:c_n_a_device:0x%x\n",status));
  goto done;
 }
done:
 //如果绑定失败了
 if(status!=STATUS_UNSUCCESSFUL)
 {

  OnUnload(theDriverObject);
 }

 return status;
}

 

//绑定函数定义

NTSTATUS c_n_a_device(PDRIVER_OBJECT DriverObject,PDEVICE_OBJECT *fltobj,PDEVICE_OBJECT *oldobj,wchar_t *devname)
{
 NTSTATUS status;
 UNICODE_STRING str;
 //生成自己的新设备
 status=IoCreateDevice(DriverObject,0,NULL,FILE_DEVICE_UNKNOWN,0,TRUE,fltobj);
 if(status!=STATUS_SUCCESS)
 {
  KdPrint(("IoCreateDevice failed"));
  return status;
 }
 //设置设备IO方式为直接IO 读写不经过缓存
 (*fltobj)->Flags|=DO_DIRECT_IO;
 //将要绑定的设备名初始化为一个Unicode字符串
 RtlInitUnicodeString(&str,devname);
 //绑定这个设备
 status=IoAttachDevice(*fltobj,&str,oldobj);                             //此函数注意下  找到了真实设备指针
 if(status!=STATUS_SUCCESS)
 {

  KdPrint(("IoAttachDevice failed"));
  return status;
 }
 KdPrint(("[tdi_fw] DriverEntry:%S fileObj:0x%x\n",devname,*fltobj));
 return STATUS_SUCCESS;

}

//分发函数定义

NTSTATUS DeviceDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp)
{
 NTSTATUS status;
 PDEVICE_OBJECT old_devobj=get_original_devobj(DeviceObject,NULL);            //找到真实设备指针函数 供I噢CallDriver函数调用
 if(old_devobj!=NULL)
 {
  //如果能找到原设备,就发送到原设备
  IoSkipCurrentIrpStackLocation(irp);
  status=IoCallDriver(old_devobj,irp);                
 }
 else
 {
  //如果找不到原设备,就返回失败
  status=irp->IoStatus.Status=STATUS_INVALID_PARAMETER;
  IoCompleteRequest(irp,IO_NO_INCREMENT);
 }
 return status;
}

//取得对应的真实设备

PDEVICE_OBJECT get_original_devobj(PDEVICE_OBJECT flt_devobj,int *proto)
{
 PDEVICE_OBJECT result;
 int ipproto;
 if(flt_devobj==g_tcpfltobj)
 {
  result=g_tcpoldobj;                                       //注意下 此处对应到了真实的设备
  ipproto=IPPROTO_TCP;
 }else if (flt_devobj==g_udpfltobj)
 {
  result=g_ipoldobj;
  ipproto=IPPROTO_IP;
 }else
 {
  KdPrint(("[tdi_fw] get_original_devobj:Unknown DeviceObject 0x%x!\n",flt_devobj));
  ipproto=IPPROTO_IP;
  result=NULL;
 }
 if(result!=NULL&&proto!=NULL)
  *proto=ipproto;
 return result;
}


 

【探测器】线阵相机中的 TDI 技术 因此,它非常适合线性运动的场景。高分辨率长距离成像:在线性扫描应用中,线阵相机能够覆盖很长的距离或宽幅区域,适用于工业中的大幅面检测(如宽幅印刷材料的质量检查)。TDI相机是一种基于线阵相机的扩展技术,拓展支持了时间延迟积分(TDI)技术,允许通过多个像素行的累积曝光来提高图像质量和灵敏度。一次曝光捕捉整个图像:面阵相机通过一次曝光捕捉整个场景的图像,就像拍照一样,它一次性获取的是完整的二维图像。适合静止或低速运动场景:由于它不需要物体的连续运动就可以捕捉图像,面阵相机更适合静止或低速运动的物体成像。 阅读详情

相关推荐

windows基于tdi编写的防火墙

TDI-based Open Source Personal Firewall (TdiFw) 一个开源的个人防火墙,精巧易用,具备强大的过滤功能 源码在src目录

TDI防火墙框架(开源)

出于个人爱好想写一个防火墙,利用业余时间来完善这份代码,当实现了TDI防火墙的整体框架的时候发现TDI驱动居然无法捕获到ICMP封包(如果想捕获ICMP封包还必须用别的办法,比如HOOK某个NDIS的发包接口),发现这种情况觉得没有再继续写下去的必要了。现在将该驱动源码放出来供大家参考学习,希望对一部分人有帮助 话说回来:拦截TCP、UDP、RawIp还是很好用的。 参考了部分科莫多防火墙

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1863

tdi驱动示例,TDI官方入门helloworld

WDK下驱动和应用层序通信,Windows_TDI过滤驱动开发

TDI过滤获取IP及端口

TDI过滤驱动获取IP地址及连接端口要涉及关于TDI的一些结构体,当接收到含有TDI的TDI_CONNECT连接IRP请求时,IRP请求栈顶的的参数parameters就是指向TDI_REQUEST_KERNEL_CONNECT结构体的指针,实际上,这个结构体就是TDI_REQUEST_KERNEL。这个结构体定义在tdikrnl.h中定义如下: typedef struct _TDI_REQU

TrustNature 1788

网络监听软件

属于BS系统,C#开发,课程设计十分简单 数据库是2005虚拟机

windows下的系统工具集合

包含几十个比较实用的小工具,比较齐全的驱动开发人员和研究逆向工程的程序员的工具套装。包括filemon(文件系统监控) ,tcpview(网络监控) ,tdimon(socket监控) ,regmon(注册表监控),等等

围观网络之二 —— TDI~

TDI 过滤~ 一、与TDI过滤有关的东西。。收发数据那块先从略了。。 TCP怎么填充头部,怎么保证发送的成功和顺序正确,那都是协议的东西了。。详见《TCP-IP详解》(17章开始是TCP)。协议的东西有空再看看~ TDI 过滤没什么难度,WDK详尽到罗嗦的程度,教程也很多了,简单mark一下 上文看到Winsock库函数和afd.sys几乎是一一对应的,有时是一对多。但afd

Returns' Station 1818

某开源防火墙源代码 TDI网络过滤驱动开发

某开源防火墙源代码 TDI网络过滤驱动开发

TDI网络过滤驱动应用(一)

这里我们从三个实例(限流,UDP重定向,TCP重定向)大致了解TDI网络过滤驱动的基本应用场景;对于驱动防火墙的TDI网络过滤驱动复杂应用,我们需要将网络数据包进行截获以及重注入处理。对于TDI网络过滤驱动更加全面的使用,我们可以参考NetFilter SDK 2,该SDK链接为,可惜的是该SDK是一个收费的SDK,不过它提供了相关的Sample代码,包括TrafficShaper,TcpRedirector,DnsRedirector和SocksProxyServer还是非常具有参考性的。

xsinlink的博客 1935

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 488

SAP ERPsim生产拓展实验报告

ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗

m0_67262022的博客 2020

TDI过滤驱动分析

转自:http://www.longene.org/forum/viewtopic.php?t=446 目录 0 介绍 0.1 TDI驱动作用 0.2 Windows NT网络总体结构 1. 过滤设备 1.1 绑定目标 1.2 分发函数 1.3 过滤地址 1.4 过滤内容 1.4.1 过滤HTTP 1.4.2 过滤DNS 2. VISTA网络结构 3.

5410

ABAP_自定义屏幕07—下拉列表框

ABAP_自定义屏幕07—下拉列表框 完成以下:页面中有下拉列表框,下拉框value=系统表SCRR的值 1、实现方法A-常用 1.1 在主程序定义字段 TYPES:BEGIN OF type_carrid, carrid LIKE scarr-carrid,"航线代码 carrname LIKE scarr-carrname,"航向名称 END OF type_carrid. DATA g_it_carrid TYPE STANDARD TABLE OF type_carrid

f346348157的博客 3870

TDI网络过滤驱动开发指南

首先我们来看一下Windows的网络模块架构,如下:ws2_32.dll提供了基本的socket相关函数(例如socketbindlisten等)。Windows在用户层提供了一种过滤网络数据包的HOOK方案,这个就是Layered service provider(也就是我们通常说的LSP),通过这种技术我们对网络包进行HOOK了,国内很多大厂用的都是这种技术。Socket是一种统一的规范,无论是Windows还是Linux他们对外提供的接口都是一样的。

xsinlink的博客 1352

【Spreadsheet】香港规范结构设计电子表格库开发方案

深入理解香港本地规范特点和要求结合国际先进标准(Eurocode) 的技术内容考虑香港地理环境特殊性 (台风、地质等)建立完善的质量控制体系保持持续更新维护的能力。

hmywillstronger的博客 1361

5分钟看懂LTE注网全流程:从PLMN选择到小区驻留的log分析技巧

本文深入解析了LTE终端从开机到成功驻留小区的完整流程,重点分享了基于QXDM和QCAT工具的log分析实战技巧。文章详细拆解了PLMN选择、System/Band扫频、小区搜索与同步、系统消息解析及驻留等关键步骤,并提供了高频问题场景的排查思路,帮助网络优化工程师快速定位终端侧、射频环境或网络配置问题。

app77的博客 432

TDI Filter 过滤驱动

By Fanxiushu  2013, 引用和转载请注明原作者 为了让大家有兴趣阅读下去, 举个正在使用的可能大家都比较熟悉的例子: 360 的安全卫士里,有个流量防火墙的功能, 它可以监视每个进程的流量情况,可以限制上传下载速度,等等。 他的驱动部分的就是一个 TDI Filter 驱动。 TDI Filter ,这是个快被微软淘汰的驱动模式,但是为了兼容,又不得不使用的驱动。

trents的专栏 6539

STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案

本文深入解析STM32F103多通道PWM输出中的TIM1_CH1异常问题,提供从时钟配置到GPIO复用的系统化解决方案。通过黄金法则配置流程和高级调试技巧,帮助开发者快速定位并解决PWM输出不稳定、占空比异常等问题,同时拓展多定时器协同和互补PWM等高级应用场景。

weixin_29194817的博客 117

TDI FILTER 网络过滤驱动完全解析

WDM TDI Filter驱动的组织架构

CharlesPrince的专栏 1万+

android11.0 Launcher3 高端定制之循环滑动

待机界面可以向左、向右循环切换页面 效果图 修改清单 packages/apps/Launcher3/res/values-zh-rCN/strings.xml packages/apps/Launcher3/res/values/config.xml packages/apps/Launcher3/res/values/strings.xml packages/apps/Launcher3/res/xml/launcher_preferences.xml packages/apps/Launc

cczhengv 1544

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TDI笔记

XP中应用层数据到达内核,经过TDI驱动,TDI Client驱动程序-》TDI传输驱动程序,在TDI驱动中数据此时还在IRP包里,TDI中网络数据还封装在IRP包中,还是可以查看属于哪个进程的。所以进程查看等就在这设置。 再往下发给NDIS驱动,这时候就是纯NDIS网络数据包了,脱离了进程。如果进行限流的话就是TDI加NDIS结合使用。因为NDIS脱离了进程。 NDIS分为三层,网络协议驱动...

kernweak的博客 1236

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

(转)TDI FILTER 网络过滤驱动完全解析

http://blog.youkuaiyun.com/charlesprince/article/details/5924376   TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析,记录和管理,可以实现非常强大的管理功能,这里就将讨论它的设计架构,和具体实现的方法。   进行系统级网络数据包的过滤,很明显,第一步需要在系统内核中截取到网络数据包,那么在WINDOWS

jiangqin115的专栏 2836

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platfrom))

catalog 0.引言 1.Windows 2000网络结构和OSI模型 2.NDIS驱动 3.NDIS微端口驱动编程实例 4.NDIS中间层驱动编程实例 5.TDI驱动 6.TDI驱动 7.TDI的过滤框架 8.WFP(Windows Filtering Platform windows过滤平台) 0.引言 最早出现的网络驱动应该是网卡驱动,这是Windows的下进行...

zhangge3663的博客 6380

TDI过滤驱动摘除

 趁这次找回IP的机会,决定换一款墙,结果看到了以下的东西:来点好玩的,其实我们只要写个驱动,从设备栈里把防火墙的TDI过滤驱动给摘除掉,这样就能对付一般的防火墙了。当然,国外强一点的防火墙,比如ZoneAlarm Pro 6.5就得再结合其他方法了,嘿嘿。摘除过滤驱动的代码片段:QUOTE:RtlInitUnicodeString ( &TcpipName, L"//Driv

2614
下一篇: 设备名和符号链接名
cosmiccode
博客等级 码龄14年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值