前段时间写一个IP过滤的驱动,以前没有接触过驱动,Google一把,网上有很多例子,不过都不能满足自己的需求,所以就参考大家的资料自己研究一下。呵呵。程序用了三层:第一层就是驱动来负责过滤数据包并把拦截的结果返回给应用程序。第二层VC动态链接库来负责加载卸载驱动,和驱动通信。并提供接口给第三层调用。第三层C#Winform,调用VC动态链接库提供的接口,间接和驱动通信,并显示驱动返回结果。

用到最多的就是DeviceIoControl这个函数,可以通过这个函数向驱动程序发送消息,还可以从驱动程序获取消息,下面让我们来看一下这个函数的结构吧:

BOOL DeviceIoControl(
HANDLE hDevice, //创建的驱动设备句柄
DWORD dwIoControlCode, //应用程序调用驱动程序的控制命令
LPVOID lpInBuffer, //应用程序传递给驱动程序的数据缓冲区地址
DWORD nInBufferSize, //应用程序传递给驱动程序的数据缓冲区大小,字节数
LPVOID lpOutBuffer, //驱动程序返回给应用程序的数据缓冲区地址
DWORD nOutBufferSize, //驱动程序返回给应用程序的数据缓冲区大小,字节数
LPDWORD lpBytesReturned, //驱动程序实际返回给应用程序的数据字节数地址
LPOVERLAPPED lpOverlapped//重叠操作结构 一般设为NULL
);
向驱动发消息:
DWORD WriteIo(DWORD code, PVOID buffer, DWORD count)
{
if(driverHandle == NULL)
return DRV_ERROR_INVALID_HANDLE;
DWORD bytesReturned;

BOOL returnCode = DeviceIoControl(driverHandle,
        code,
        buffer,
        count,
       NULL,
        0,
       &bytesReturned,
        NULL);
if(!returnCode) return DRV_ERROR_IO; return DRV_SUCCESS;
}
从驱动获取消息:
DWORD  ReadIo(DWORD code, PVOID buffer, DWORD count)
{
if(driverHandle == NULL)
return DRV_ERROR_INVALID_HANDLE;
DWORD bytesReturned;
BOOL retCode = DeviceIoControl(driverHandle,
  code,
  NULL,
  0,
  buffer,
  count,
  &bytesReturned,
  NULL);
if(!retCode)
return DRV_ERROR_IO;
return DRV_SUCCESS;
}
有了这两个函数我们就可以向驱动发消息和从驱动获取数据了。我们可以通过Writeto 把要添加或删除的Ip过滤规则发给驱动程序。下一步我们要做的就是当驱动拦截到添加的IP过滤规则后怎么通知应用程序。这里用到了CreateEvent,然后把这个m_hCommEvent 通过Writeto 通知给驱动,
BOOL   CreateFilterEvent(DWORD code)
m_hCommEvent= CreateEvent(NULL, false, false, NULL);
if(driverHandle == NULL)
{
MessageBox(NULL,TEXT("driverHandle is null"),NULL,MB_OK); 
//return FALSE;
DWORD dwReturn;
//download event object to device driver
BOOL retCode = DeviceIoControl(driverHandle, 
code, 
       &m_hCommEvent,
sizeof(m_hCommEvent), 
NULL, 
0, 
&dwReturn, 
NULL);
if(retCode)
{
  return TRUE;
}
else
{
return FALSE;
}
}

然后通过CreateThread创建一下线程来接受驱动的消息,
在线程函数里写:
while(threadFlag)
{  
if(m_hCommEvent)
{
WaitForSingleObject(m_hCommEvent,INFINITE);  
//收到驱动的通知
//从驱动取数据
//通知C#窗体
ResetEvent(m_hCommEvent);
}
}

驱动里做一下处理:
HANDLE hEvent =*(PHANDLE)ioBuffer;
NTSTATUS status = ObReferenceObjectByHandle(
hEvent,
GENERIC_ALL,
NULL,
KernelMode,
&gpEventObject,
&objHandleInfo);
if(!NT_SUCCESS(status))
      { 
   if(gpEventObject)
{
 ObDereferenceObject(gpEventObject);
}
if(hEvent)
{
}
              Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
}
if(status != STATUS_SUCCESS)
{
DbgPrint("ObReferenceObjectByHandle failed! status = %x\n", status);
Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
break;
}

当驱动拦截到过滤的IP数据包的时候:
if(gpEventObject)
       { 
//一个变量赋值等应用程序收到通知的时候来去这个数据
             KeSetEvent(gpEventObject, 0,FALSE);//by Fs.song
      }
只是程序记录。

转载于:https://www.cnblogs.com/henusfs/archive/2009/08/13/1545161.html

IP过滤-驱动和应用程序通信相关推荐

  1. Windows驱动—Windows应用程序和Windows驱动通信编程

    文章目录 介绍 知识前奏 内核方面编程 设备对象和符号链接 分发函数 应用方面编程 打开设备 设备控制请求 代码 应用层代码 内核层代码 完整工程代码 测试效果 介绍 Windows应用程序(Ring ...

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

    http://blog.csdn.net/charlesprince/article/details/5924376 TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析,记 ...

  3. TDI Filter 过滤驱动

    By Fanxiushu  2013, 引用和转载请注明原作者 为了让大家有兴趣阅读下去, 举个正在使用的可能大家都比较熟悉的例子: 360 的安全卫士里,有个流量防火墙的功能, 它可以监视每个进程的 ...

  4. 使用 AIX TCP/IP 过滤功能设置防火墙

    简介 一个 POWER 服务器具有承载上百个 LPAR 或分区(一个分区就是操作系统安装的一个独立实例)的处理能力,这意味着,虚拟化功能让您能在一个物理机器中拥有上百个服务器.如果这上百个服务器在处理 ...

  5. windows7以上平台 NDISFilter 网卡过滤驱动开发

    by fanxiushu 2019-01-16 转载或引用请注明原始作者 这里讨论的都是基于WIN7以上平台,NDIS 6.0以上版本的网络驱动. 做个驱动的目的,是因为很早之前,我使用 TDI 和 ...

  6. STM32驱动W5100实现udp通信

    STM32驱动W5100实现udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 MCU:STM ...

  7. Windows 文件系统过滤驱动开发教程 (第二版)

    Windows 文件系统过滤驱动开发教程 (第二版)       楚狂人-2007-上海 (MSN:walled_river@hotmail.com)          -1.  改版序....... ...

  8. NDIS LWF网络过滤驱动开发(一):LWF简介及数据结构说明

    写在之前:换工作了,做Win驱动开发,还是网络过滤驱动.之前从未接触过这些,只是做着单机的桌面应用程序,所以一切是从头开始.从驱动到网络,很多的不懂,一步步走来,现在多少有些进展了,现在就总结下这段过 ...

  9. TTEFS - 基于文件过滤驱动的透明加密内核

    更多产品信息:  http://www.byte2code.com 1产品综述 1.1产品简介 TTEFS(True Transparent Encryption File System)是一款文 ...

最新文章

  1. 怎样在ROS下实现基于YOLO的px4无人机目标检测?
  2. 协作机器人鼻祖“重生”,卷土重来的Rethink能否给行业注入一针强心剂?
  3. iOS开发③UIView
  4. C#第三方控件的使用
  5. 用辩证、动态的眼光看世界
  6. PHP连接达梦数据库
  7. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  8. 少儿编程几种语言_您使用了几种编程语言?
  9. Float 运算的怪异性
  10. springboot多环境配置_编辑 SpringBoot|第五章:多环境配置
  11. Java笔记3:Eclipse添加jar包
  12. ncl批量处理多个nc文件_Python办公自动化批量处理文件,一学就会
  13. OpenGL基础46:切线空间
  14. matlab程序求反应谱,MATLAB程序精确法求解反应谱
  15. Android小提示四
  16. 无线通信设备安装工程概预算编制_建筑安装工程,预算编制中易遗漏总结分享...
  17. 安鸾CMS系列之74CMS
  18. 朴素贝叶斯应用案例 —— 商品评论情感分析
  19. android录制avi视频
  20. android 多线程断点续传下载

热门文章

  1. [react] 为什么建议Fragment包裹元素?它的简写是什么?
  2. Taro+react开发(74):taro架构使用
  3. 前端学习(2968):完善登录页面
  4. 前端学习(2945):首页搭建
  5. 工作244:根据页面的内容调用
  6. 工作164:对父和混入的理解
  7. 前端学习(2061):vue的mvvm
  8. 前端学习(1953)vue之电商管理系统电商系统之根据父类数据处理表单中的数据
  9. 第八十九期:还在手动盖楼领喵币?双十一这群开发者竟然如此「作弊」
  10. 第六十六期:运维专家写给运维工程师的6条人生忠告