NDIS网络数据监控程序NDISMonitor(3)-----NdisMonitro应用程序(C#)

2023-10-30

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家拍砖!

 

 

1、主窗口Load函数ctrlForm_Load

(1)先调用GetExtensions来获得运行目录下bin目录中的所有文件,通过载入为Assembly,然后获取属性及名字, 并把它们转化为自定义的ExtensionInfo类型的数组存放。

(2)创建ComboxBox和工具栏Logo,并根据第(1)步得到的bin文件夹下文件初始化Combox里的内容。

(3)更新状态栏为

2、选择下拉框后的处理过程

(1)根据从下拉框选择的项,创建控件并加到容器(ctrlContainter,即主界面中显示收到包的控件)中;

if ( curr._instance == null )
			{
				// create the control and add it to the container.

				curr._instance = (INmExtension) Activator.CreateInstance( curr._type );

				System.Windows.Forms.UserControl	c =
					(System.Windows.Forms.UserControl) curr._instance;

				ctrlContainer.Controls.Add( c );

				// set the dock properties of the control.

				c.Anchor =
					AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;

				c.Left = 0;
				c.Top = 0;
				c.Width = ctrlContainer.Width;
				c.Height = ctrlContainer.Height;

				ctrlContainer.Visible = true;
			}


 

(2)载入NDIO Monitor的内核Hook驱动。
for( int z=0; z<3; z ++ )
				{
					_protocolList = NdisHookStubs.NT_PROTOCOL_LIST.Start( (uint) PacketBacklog,
						UseLt == false ? 0 : LtLoopbackIp,
						UseLt == false ? 0 : LtNatIp );

					if ( _protocolList != null )
						break;
					else
						Thread.Sleep( 1000 );
				}


 

 根据从驱动中获得的协议列表提取出来的协议和适配器来初始化NT_PROTOCOL_LIST类。

(3)设置当前ExtensionInfo的_instance,用来添加菜单。
curr._instance.Showing ( new LogFn( ExtensionLogFn ), _protocolList, popupMenu );
			( (System.Windows.Forms.UserControl) curr._instance ).Visible = true;

			if ( popupMenu.MenuItems.Count != 0 )
				ctrlMenu.MenuItems.Add( popupMenuIndex, popupMenu );

			ctrlMenu.MenuItems[ ctrlMenu.MenuItems.Count - 1 ].Index =
				ctrlMenu.MenuItems.Count - 1; // help popup menu.

(4)主窗口启动监听线程。这一个线程相当重要。
Thread		listenThread = new Thread( new ThreadStart( listenThreadProc ) );
					listenThread.Start ();

(4、1)它做的事情是调用NdisHook的API接口等待数据包的到来,如果数据包来了,就返回一个数据包

NdisHookStubs.NEXT_PACKET		np = NdisHookStubs.NEXT_PACKET.WaitFor ();


(4、2)判断bArePacketsRemaining将所有的数据包接收完成存放在ArrayList  al 中;

al.Add( np );

(4、3)如果数据接收完成,那么根据包的序列号(_dwPacketSerial)排序后把每个包发到主窗口显示出来。

for ( int i=0; i<al.Count; i ++ )
							{
								NdisHookStubs.NEXT_PACKET		npI = (NdisHookStubs.NEXT_PACKET) al[ i ];
								int								k = i;
								for ( int j=i+1; j<al.Count; j ++ )
									if ( ((NdisHookStubs.NEXT_PACKET)al[ j ])._dwPacketSerial < npI._dwPacketSerial )
										k = j;
								if ( k != i )
								{
									al[ i ] = al[ k ];
									al[ k ] = npI;
								}
							}

							// post the packets in the correct thread context.
							foreach( NdisHookStubs.NEXT_PACKET thisNp in al )
							{
								IntPtr			ptr = (IntPtr) thisNp;
								PostMessage( THIS.Handle, _nextPacketArrived, new IntPtr( 0 ), ptr ); // old tricks die hard... !
							}


捕捉到的数据显示为:


(5)显示适配器对话框(OpenAdapters窗口)。

if ( showAdapters && _protocolList != null )
				miAdapters_Click( null, null );


 

3、显示适配器对话框的函数miAdapters_Click

(1)SetProtList。

把之前获得的协议列表在窗口中的控件树上显示出来

OpenAdapters		dlg = new OpenAdapters ();
			dlg.SetProtList( _protocolList, _openAdapters );
			dlg.ShowDialog ();


 

(2)显示窗口。

4、OpenAdapters窗口关闭后开始对协议列表监听。

监听其实就是把OALIST数据提交给驱动。

if ( dlg._retval != null && _protocolList != null )
			{
				_openAdapters = dlg._retval;
				_protocolList.Listen( _openAdapters );
			}


 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NDIS网络数据监控程序NDISMonitor(3)-----NdisMonitro应用程序(C#) 的相关文章

  • 函数“sum”的隐式声明在 C99 中无效

    我一直在寻找解决方案 但没有找到任何有帮助的东西 我收到以下错误 Implicit declaration of function sum is invalid in C99 Implicit declaration of function
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 如何使用 libclang 判断成员函数是 const 还是 volatile?

    我有一个实例CXCursor同类CXCursor CXXMethod 我想知道这个函数是否是const or volatile 例如 class Foo public void bar const void baz volatile voi
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • 智能感知不显示评论

    如果我在 Visual Studio 2010 中输入类似的内容数据集1 我得到所有可用方法和属性的列表 智能感知 这很好用 但是 如果我在此列表中选择一个方法或属性 我不会得到 if 的描述 例如 如果我有类似的东西 public cla
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的

随机推荐

  • makefile中关于all和.PHONY .cpp.o

    转自 http blog 163 com benben long blog static 199458243201110230292490 http blog csdn net wangxmin2005 article details 80
  • C 标准库 - 《locale.h》

    原文链接 https www runoob com cprogramming c standard library locale h html 简介 locale h 头文件定义了特定地域的设置 比如日期格式和货币符号 接下来我们将介绍一些
  • Java的Integer类

    1 用途 包装一个对象中的原始类型int的值 封装基本数据类型 int 将字符串转成基本数据类型 int 2 特点 类型为Integer的对象包含一个单一字段 其类型为int 此外 该类还提供了一些将int转换为String和String转
  • Git - 生成 SSH 公钥

    生成 SSH 公钥 如前所述 许多 Git 服务器都使用 SSH 公钥进行认证 为了向 Git 服务器提供 SSH 公钥 如果某系统用户尚未拥有密钥 必须事先为其生成一份 这个过程在所有操作系统上都是相似的 首先 你需要确认自己是否已经拥有
  • centos安装ruby

    可以使用 sudo yum install ruby 直接安装 但安装的是旧版本 不建议使用 1 去ruby官网直接下载安装包 http www ruby lang org en downloads 燃鹅 下载不了 那就借助 某雷吧 把安装
  • 查看linux是否已经安装了apache

    查看linux是否已经安装了apache 解决方法 查看linux是否已经安装了apache服务 可以通过执行 http www yayihouse com yayishuwu chapter 1800
  • 网易云params和encSecKey的获取

    网易云params和encSecKey的获取 params和encSecKey有什么用 软件准备 1 python及其对应的编辑器 推荐pycharm 2 发条js调试工具 我使用的是1 9版本 js代码分析 定位生成位置 分析传入参数 代
  • 关于软件设计使用中一些的原则简述

    概述 向大家介绍过一些软件开发的原则 比如优质代码的十诫和Unix传奇 下篇 中所以说的UNIX的设计原则 相信大家从中能够从中学了解到一些设计原理方面的知识 正如我在 再谈 我是怎么招聘程序 中所说的 一个好的程序员通常由其操作技能 知识
  • 雅思口语 九月新题 答案

    目录 你大概多长时间练习一次编程 你为什么选择这个专业 What are your career goals in the field of software engineering What sparked your interest i
  • uniapp-h5中的文件流下载和指定的url下载总结(解决下载后的pdf打开空白情况)

    uniapp h5中的文件流下载和指定的url下载总结 解决下载后的pdf打开空白情况 一 uniapp h5文件流下载 场景 之所以会有文件流需求 前端给到一些水印内容 然后后台会给文件加上我们给到的水印并以文件流形式返回 这里以pdf格
  • 汇编语言之字符串的比较和查找

    汇编语言之字符串的比较和查找 基础知识 串比较指令涉及两个串 目的串地址为ES DI 源串地址为DS SI 操作如下 1 字节 CMPSB 操作 ES DI DS SI DI 1 SI 1 2 字 CMPSW 操作 ES DI DS SI
  • python django(一)学习笔记之二 (python读取EXCL在html展示)

    利用EXCL的数据 进行一个饼状的分析图 直接了当的看出在市场的份额的占比多少 承接第一天的内容和开发环境 以及目录 在settings py 中 加入 INSTALLED APPS ch01 apps Ch01Config django
  • Docker安装操作常用服务器软件

    1 查看centos版本 rpm q centos release 2 更新yum yum update y 3 删除以前版本的docker yum remove docker docker client docker client lat
  • k8s 证书生成 cfssl

    命令下载工具 傻瓜式执行 wget https pkg cfssl org R1 2 cfssl linux amd64 wget https pkg cfssl org R1 2 cfssljson linux amd64 wget ht
  • Verdi实现信号的平移

    在Verilog System verilog中 xxx可以实现延迟指定时间的功能 而在使用verdi查看信号波形并进行分析时 同样也可以实现类似的功能 注 这种信号平移是有其应用场景的 例如 在某些仿真模型中 为了模拟实际的信号延迟 信号
  • 极光笔记

    随着全球化进程的深入 跨境数据传输与存储问题已经变得愈发重要 推送服务的数据中心节点选择不仅关乎数据访问速度和用户体验 同时也直接牵扯到数据合规性和安全保障 EngageLab Push深知这一点 为了满足更多国际客户和全球用户触达需求 我
  • java resultset获取列数_Java语言如何获取ResultSet的行数和列数

    ResultSet接口表示在数据库的数据表中查询的结果集 ResultSet 对象具有指向其当前数据行的指针 最初 指针被置于第一行之前 Java没有提供直接返回ResultSet行数的函数 或方法 如果想知道ResultSet的行数 有以
  • 图像去噪的快速入门学习

    1 理论基础 数学基础 高等数学 线性代数 概率统计 矩阵论 数值分析等 信号处理 统计信号处理 统计学习理论等 2 文献资料阅读 常用的数据库 IEEE IEE Electronic Library Elsevier SpringerLi
  • Python(4) Numpy,控制台完全输出ndarray

    import numpy as np np set printoptions threshold np nan print ndarray 当ndarray里面的存放的数据维度过大时 在控制台会出现不能将ndarray完全输出的情况 中间部
  • NDIS网络数据监控程序NDISMonitor(3)-----NdisMonitro应用程序(C#)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 1 主窗口Load函数ctrlForm Load 1 先调用GetExtensions来获得运行目录下bin目录中的所有文件 通过载入为A