科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用C#开发网络防火墙技术分析

用C#开发网络防火墙技术分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本问以N-Byte网络守望者防火墙软件为例介绍了用C#设计驱动程序的方法。

作者:seafrog 来源:论坛 2007年11月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
怎样从驱动程序向.NET应用程序传递非托管的数据类型?

  为了能够输出安全日志,必须让主程序获得驱动程序中的封包信息。使用信号量机制可以很方便的实现驱动程序和非托管代码间的信息传递,那么对托管代码呢?这需要向.NET应用程序传递非托管的数据类型ACCESS_INFO。在NByte.h中,是这样定义这个ACCESS_INFO结构的:

typedef struct _ACCESS_INFO

{
 USHORT protocol;
 ULONG sourceIp;
 ULONG destinationIp;
 USHORT sourcePort;
 USHORT destinationPort;
}ACCESS_INFO;

  显然,直接传递非托管数据类型是不可以的,需要转换一下。首先,在IoCtrl类中定义了几个要传递的封包信息参数:

public __gc class IoCtrl
{
 public:
  USHORT protocol; //网际协议类型
  ULONG sourceIp; //源IP地址
  ULONG destinationIp; //目的IP地址
  USHORT sourcePort; //源端口
  USHORT destinationPort; //目的端口
  ………………
}

  然后,在GetAccessInfo()函数中来给这些参数赋值:

void GetAccessInfo()
{
 ACCESS_INFO ai;
 bool result=(ReadIo(GET_INFO,&ai,sizeof(ai))==SUCCESS);
 this->protocol=ai.protocol;
 this->sourceIp=ai.sourceIp;
 this->destinationIp=ai.destinationIp;
 this->sourcePort=ai.sourcePort;
 this->destinationPort=ai.destinationPort;
}

  既然在IoCtrl类中获得了这些信息,但是需要把它们封装成主程序容易处理的数据类型,这样,用C#实现了InfoEvent类用来封装这些信息:

//本类封装了数据包的详细信息,可以通过事件实现对它的模块间传递。

public class InfoEvent:EventArgs
{
 string sInfo; //用来存放输出信息的私有成员
 public int pLength; //CommonFunction.sPort数组的长度
 public ushort protocol; //网络通信协议类型
 public uint sourceIp; //数据包的源IP
 public uint destinationIp; //数据包的目的IP
 public ushort sourcePort; //数据包的源端口
 public ushort destinationPort; //数据包的目的端口
 ………………………………
}

  下面在用托管C++实现的InfoProvider驱动程序信息提供者类中把个InfoEvent类的对象传递给主程序,需要使用一个委托生成一个事件:

//声明委托事件,用来向主程序传递数据。

__delegate void DriverInfo(Object* sender, InfoEvent* e);

//声明响应事件函数。

__event DriverInfo* OnDriverInfo;

  然后在InfoProvider驱动程序信息提供者类中定义一个方法,在主程序中以线程的方式运行这个方法,在这个方法中使用了事件函数OnDriverInfo:

//用来获得驱动程序信息的进程,在主程序中将开启该进程。

void GetInfoThreadProc()
{
 this->hEvent=OpenEvent(SYNCHRONIZE,FALSE,"NBEvent");
 if(!ic->GetDriverHandle())
 {
  return;
 }

 while(true)
 {
  f(!hEvent)
  ExitThread(0);
  WaitForSingleObject(this->hEvent,INFINITE);
  nPackets++;
  ic->GetAccessInfo();
  ic->ResetEvent();
  //定义一个主程序可以识别的对象,通过OnDriverInfo传给主程序。
  InfoEvent*ie=new InfoEvent(ic->protocol,ic->sourceIp,ic->destinationIp,ic->sourcePort,ic->destinationPort);

  OnDriverInfo(this,ie);
 }

 ic->CloseDriverHandle();
 return;
}

  在主程序中,会开启这个进程并定义了OnDriverInfo的处理函数DealWithInfo:

pInfo=new InfoProvider();

//开启与驱动交换信息的进程

FilterThread=new Thread(new ThreadStart(pInfo.GetInfoThreadProc));
FilterThread.IsBackground=true;
FilterThread.Start();
pInfo.OnDriverInfo+=new InfoProvider.DriverInfo(DealWithInfo);

  这样主程序就可以在DealWithInfo函数中加入对InfoEvent对象的处理了。可见,通过中间模块IoCtrl的转换,便实现了.NET主程序对驱动程序中非托管数据类型的获取和处理。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章