IP过滤-驱动和应用程序通信

前段时间写一个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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM架构和GC垃圾回收机制详解

JVM架构图分析 下图:参考网络书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看: Hadoop内存溢出(OOM)分类、参数调优化) JVM被分为三个主要的子系统 (1)类加载器子系统(2&#xff0…

IIS不能发布asp.net 应用程序

IIS不能发布asp.net 应用程序最近在写程序的时候,突然项目经理想发布一下网站看一下做的效果当我发布的时候遇到 下面的错误::使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。 名称以无效字符开头的…

线程高级篇-Lock锁和Condition条件

浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程 便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1).获取锁的线程执行完该代码…

CERL 2.0 预告:Erlang Style Concurrency + 状态机

开始构想CERL 2.0版本。特点: Erlang Style Concurrency(Erlang 风格并发) 状态机,突破 Erlang Style Concurrency 模型的缺陷。在目前的 CERL 库 SDL接口描述语言的基础上,CERL 2.0 还将是一门语言(用于实…

枚举类型创建实例

使用枚举创建单例模式 使用枚举创建的单例模式: public enum EasySingleton{INSTANCE; } 代码就这么简单,你可以使用EasySingleton.INSTANCE调用它,比起你在单例中调用getInstance()方法容易多了。 我们来看看正常情况下是怎样创建单例模…

前端学习(41):背景实现视觉差效果

首先准备三张图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&quo…

CAS原理分析

在JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff08;后面的章节还会谈到锁&#xff09;。 锁机制存在以下问题&#xff1a; &#xff08;1&#xff09;在多线程竞争下&#xff0c;加锁、释放锁会导致比较多的上下文切换和调度延时&…

深入理解HashMap(原理,查找,扩容)

面试的时候闻到了Hashmap的扩容机制&#xff0c;之前只看到了Hasmap的实现机制&#xff0c;补一下基础知识&#xff0c;讲的非常好 原文链接&#xff1a; http://www.iteye.com/topic/539465 Hashmap是一种非常常用的、应用广泛的数据类型&#xff0c;最近研究到相关的内容&…

密码加密和解密

/// <summary> /// 字符串加密 /// </summary> /// <param name"original">明文</param> /// <returns>密文</returns> public static string Encrypt(string original) { …

【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序

c中的对象的构造顺序与析构顺序 问题一 当程序中存在多个对象时&#xff0c;如何确定这些对象的析构顺序&#xff1f; 一.单个函数创建时构造函数的调用顺序 1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声明顺序相同) 3.调用类自身的构造函数 而析构函数与…

ASP.NET MVC 重点教程一周年版 第七回 UrlHelper 【转】

这节讲 一下ASP.NET MVC中的Helper。 何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组。 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢&#xff1f; 其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View&…

【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数

隐藏的this指针&#xff0c;所有对象共享类的成员函数 写一篇博客花费时间虽然长&#xff0c;但是却让你对内容的记忆尤为深刻&#xff0c;尤其是你对它的态度。记录菜鸟的成长日记&#xff0c;也希望同为菜鸟的你们与我一起共同进步&#xff01;&#xff01;现在分享的是C的学…

uml 类图整理

1.五分钟读懂UML类图 http://www.cnblogs.com/shindo/p/5579191.html 2.UML类关系&#xff08;依赖&#xff0c;关联&#xff0c;聚合&#xff0c;组合的区别&#xff09; https://www.jianshu.com/p/eefa0b5b4922 2.1 关联 1、关联关系 关联关系又可进一步分为单向关联、…

web控件开发系列(四) 自定义控件属性(下)

控件在WEB开发时经常要用到&#xff0c;虽然有部分已经存在工具箱里&#xff0c;但有时总需要根据自己的要求&#xff0c;开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如&#xff0c;我们需要一组属性的集合时&#xff0c;这时我们需要用到的就是复杂属性了&…

【C++深度剖析教程3】C++中类的静态成员变量

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 以一个简单的例子来引入C中类的静态成员变…

前端学习(46):页面导入样式时,使用link和@import有什么区别?

用法 import的写法 <style type”text/css”> import url&#xff08;“a.css”&#xff09;&#xff1b; </style> link的写法 <link rel"stylesheet" href"index.csss"> 区别 1. 来源&#xff1a;link属于XHTML标签&…

静态变量加载时间,静态代码块加载时间

当类加载器将类加载到JVM中的时候就会创建静态变量&#xff0c;这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块&#xff0c;它并不是类的成员&#xff0c;也没有返回值&#xff…

关于linux系统中无法识别某一命令问题的解决方案

问题描述&#xff1a; [XXXX~]$ su - root 口令&#xff1a; [XXXX:]~# gedit /etc/profile Command gedit is available in /usr/bin/gedit The command could not be located because /usr/bin is not included in the PATH environment variable. -su: gedit&#xff1a;找…

FarMap诞生了!

今天&#xff0c;注册完成的FarMap网站最简版正式上线&#xff0c;开辟了一片我的作品发布空间。www.farmap.cn准备修改各个博客网址和下载地址。FarMap2009 使用说明 关键字&#xff1a;基站定位&#xff0c;CPS&#xff0c;GPS&#xff0c;CPS&GPS&#xff0c;短信通讯&a…

23设计模式学习

1.什么设计模式 1.1模式是解决相似问题的核心1.2设计模式软件设计过程中解决一类问题的方案总结来说&#xff1a;设计模式 &#xff1a;软件设计过程中解决一类问题的一种方案&#xff1b; 2.什么是面向对象的设计模式 面向对象设计模式描述了面向对象设计过程中、特定场景下…