NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook

2023-11-03

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

欢迎大家拍砖!

 

本工程是驱动vpcknt的一个封闭层而已,比较简单。

一、导出的API接口分析

1、Start

(1)加载驱动vpcknt.sys。

vpcknt.sys是从工程的资源文件中通过CreateDriverFileFromAppResources加载的。(所以启动NDIS时金山杀毒软件会警告)

得到驱动文件后调用StartVersionedDeviceDriver把驱动.sys加载。 (加载过程中还通过驱动读取了版本)

(驱动加载方法通过服务的方式,与前面文章<<虚拟桌面:一个简单的桌面管理工具>>是一样的)     

(2)初始化PINITIALIZE_HOOK_INPUT的两个变量pihiHookInput 、pihoHookOutput;

          且通过调用驱动的IOCTL_VPCKNT_INITIALIZE_HOOK初始化pihoHookOutput数据和PNT_PROTOCOL_LIST指针(即协议列表);

2、Stop

卸载驱动

3、Listen

OALIST_ITEM类型的数据指针作为入参数,驱动IO码为IOCTL_VPCKNT_SUBMIT_OALIST的调用,目的是提交OALIST数据。

4、WaitForPacket

这里先去判断上一个包状态中的bArePacketsRemaining标志,如果它为TRUE,表还有数据,那么直接去读;

否则调用WaitForMultipleObjects等待内核事件;

HANDLE		vhHandles[] = { g_hKernelEvent, g_hExitFromThread };

		DWORD		dwWaitRes = g_hsPrevStats.bArePacketsRemaining ? WAIT_OBJECT_0 :
			::WaitForMultipleObjects( 2, vhHandles, FALSE, INFINITE );


 

获得包和数据包的状态

DWORD		dwBytesReturned = 0;
			BOOL		bIoctlRes = ::DeviceIoControl( g_hDevice, IOCTL_VPCKNT_GET_NEXT_PACKET,
				NULL, 0,
				g_pbStorage, MACRO_STORAGE_BUFFER_SIZE,
				& dwBytesReturned, NULL );

			if ( bIoctlRes != FALSE && dwBytesReturned != 0 )
			{
				// allocate the packet memory.

				BYTE*			pb = (BYTE*) ::malloc( dwBytesReturned );
				if ( pb == NULL )
					return FALSE;
				else
					::memcpy( pb, g_pbStorage, dwBytesReturned );

				// return.

				g_hsPrevStats = * (HOOK_STATS*) pb;

				if ( psStats )
					* psStats = * (HOOK_STATS*) pb;

				* pppPacketPtr = (PNEXT_PACKET) ( pb + sizeof( HOOK_STATS ) );


 

 

 

 

二、总结:

1、原子操作

通过原子操作能保证在多线程时保证得调用完Start,才能使用Listen和Stop,起到的作用与关键代码类似。

(1)在Start开始时:

EHS_INITIALIZING为1;

EHS_NOT_INITIALIZED为0;

LONG			prev = ::InterlockedCompareExchange( & g_lHooked, EHS_INITIALIZING, EHS_NOT_INITIALIZED );
	if ( prev != EHS_NOT_INITIALIZED )
		return FALSE;

g_lHooked最开始为0,上面的代码后g_lHooked为  1  ;

(2)在Start结束时:

g_lHooked = EHS_FUNCTIONING;


EHS_FUNCTIONING为 2 ;

(3)在Stop里: 

EHS_FUNCTIONING 为 2;

EHS_STOPPING 为 3 ;

LONG			prev = ::InterlockedCompareExchange( & g_lHooked, EHS_STOPPING, EHS_FUNCTIONING );
	if ( prev != EHS_FUNCTIONING )
		return;

因为经过了Start 的结束后g_lHooked为 2 ; 所以经过上面的代码后g_lHooked 为  3 ;

1、InterlockedCompareExchange

InterlockedCompareExchange属于Interlocked系列互锁函数之一,常用于多线程编程

类似的还有下面的几个:

//增减

(1) LONG InterlockedIncrement(IN OUT LONG volatile *lpAddend);

  lpAddend为长整型变量的地址,返回值为原始值。这个函数的主要作用是原子性自增(相当于++操作)。

(2) LONG InterlockedDecrement(IN OUT LONG volatile *lpAddend);

  lpAddend为长整型变量的地址,返回值为原始值。这个函数的主要作用是原子性自减(相当于--操作)。

(3) LONG InterlockedExchangeAdd ( LPLONG Addend, LONG Increment );

  Addend为长整型变量的地址,Increment为想要在Addend指向的长整型变量上增加的数值(可以是负数)。这个函数的主要作用是保证这个加操作为一个原子访问。

  //交换

(4) LONG InterlockedExchange( LPLONG Target, LONG Value );

  用第二个参数的值取代第一个参数指向的值。函数返回值为原始值

(5) PVOID InterlockedExchangePointer( PVOID *Target, PVOID Value );

  用第二个参数的值取代第一个参数指向的值。函数返回值为原始值。

      //比较交换

(6) LONG InterlockedCompareExchange( LPLONG Destination, LONG Exchange, LONG Comperand );

  如果第三个参数与第一个参数指向的值相同,那么用第二个参数取代第一个参数指向的值。函数返回值为原始值。

(7) PVOID InterlockedCompareExchangePointer ( PVOID *Destination, PVOID Exchange, PVOID Comperand );

  如果第三个参数与第一个参数指向的值相同,那么用第二个参数取代第一个参数指向的值。函数返回值为原始值。

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

NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook 的相关文章

随机推荐

  • 通过css样式定义span标签实现文本输入框功能

    span style width 200px height 24px line height 24px font size 14px padding 5px 8px border 1px solid ddd 我是文本输入框 span
  • TensorFlow学习过程记录 -- 问题解决

    在运行过程中 输出总是会产生两行警告信息 WARNING tensorflow From D python35 lib site packages tensorflow python util tf should use py 118 in
  • 机器学习中概率论知识复习

    机器学习先验知识概率论部分 发现看Machine Learning Andrew Ng 课程的时候中间有推导过程不是很明白 遂针对性复习 知识内容组织结构 参考 Probability Theory Review for Machine L
  • 使用PHP生成Excel文件并通过邮件发送

    需求 每周一自动检测一个月内即将过期的用户 生成excel2007文件 xlsx文件 并发送给指定的人员 做成一个脚本 使用定时任务即可解决 脚本分解为两步 生成Excel 发送邮件 一 生成Excel 使用简单的更改文件头 header
  • Java入门(6)——集合、基本数据类型和引用数据类型的相互转换

    集合 1 HashMap gt 类 概述 通过key可以找到value key就是键 values就是值 俗称键值对 特点 无序的 值可以重复 键不可以重复的 如果重复了 值就会覆盖 回顾 10 int num 10 jack String
  • Python基础内容:适合刚入门的朋友看的教程

    1 基本概念 1 1 四种类型 python中数有四种类型 整数 长整数 浮点数和复数 整数 如 1 长整数 是比较大的整数 浮点数 如 1 23 3E 2 复数 如 1 2 j 1 1 2 2j 1 2 字符串 字符串 字符的序列 pyt
  • ResNet50模型学习笔记

    ResNet的各种网络结构图如下图所示 ResNet的层级结构 Layer gt Block gt Stage gt Network Layer是最小的单位 ResNet50代表有50层 Block由两层或者三层conv层叠加而成 50层以
  • JavaWeb-form传值(从一个jsp页面传数据到另一个jsp页面)

    第一个页面 login jsp
  • OkHttpClient获取文件并下载

    需要调用第三方接口获取文件 本地通过网页直接下载 public Result doExcelExport String repoId HttpServletResponse response try if StringUtils isBla
  • nginx配置指南

    nginx conf配置 找到Nginx的安装目录下的nginx conf文件 该文件负责Nginx的基础功能配置 配置文件概述 Nginx的主配置文件 conf nginx conf 按以下结构组织 配置块 功能描述 全局块 与Nginx
  • 行为型设计模式之策略模式【设计模式系列】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 设计模式系列 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everythin
  • C++基础---递归函数

    1 递归函数 1 1 递归函数的定义 递归函数 即在函数体中出现调用自身的函数 即函数Func Type a 直接或间接调用函数本身 递归函数 在数学上 关于递归函数的定义如下 对于某一函数f x 其定义域是集合A 那么若对于A集合中的某一
  • centos安装常见软件

    安装tar yum install y tar 安装zip yum install unzip y 安装上传 yum y install lrzsz y 安装git 方式一 yum install git y 方式二 开发会用的软件 yum
  • STM32F1应用DMA——串口收发不定长数据

    STM32F1应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 可以减轻CPU负担 只需设置一些参数即可发送想要发送的数据 以下是STM32F1系列芯片测试过的部分代码 可实现DMA串口收发数据 下图来自STM32官网的手册
  • webrtc中peerconnection_client生成vs工程文件

    下面是将peerconnection client从整个webrtc工程文件中分离出来的过程记录 一 webrtc项目的本地编译 生成Ninja配置文件 gn gen target x64 args is clang false use l
  • Matplotlib绘制动图以及绘制平滑曲线

    文章目录 绘制动图 FuncAnimation 方法 ArtistAnimation 方法 绘制平滑曲线 使用 scipy ndimage gaussian filter1d 高斯核类绘制平滑曲线 使用 scipy interpolate
  • python怎么做多个矩阵_用Python程序添加两个矩阵

    用Python程序添加两个矩阵 在此程序中 您将学习使用嵌套循环和Next列表理解来添加两个矩阵 并显示它们 要理解此示例 您应该了解以下Python编程主题 在Python中 我们可以将矩阵实现为嵌套列表 列表内的列表 我们可以将每个元素
  • openmpi编译安装

    概念原理 OpenMPI是一个免费的 开源的MPI实现 兼容MPI 1和MPI 2标准 OpenMPI由开源社区开发维护 支持大多数类型的HPC平台 并具有很高的性能 功能描述 OpenMPI借助TCP IP网络连接的多台计算机 以此分发数
  • 经典多模态模型

    整点传统多模态学习 下游任务 在讲模型之前 我们先说说 传统多模态任务是下游任务 图文检索 Image Text Retrieval 里面包含图像到文本检索 文本到图像检索 给定一个数据库 搜索到ground truth的图像文本对 因为是
  • NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 本工程是驱动vpcknt的一个封闭层而已 比较简单 一 导出的API接口分析 1 Start 1 加载驱动vpcknt sys vpckn