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

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

欢迎大家拍砖!

 

 

1、主窗口Load函数ctrlForm_Load

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

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

(3)更新状态栏为

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

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

  1. if ( curr._instance == null )  
  2.             {  
  3.                 // create the control and add it to the container.  
  4.   
  5.                 curr._instance = (INmExtension) Activator.CreateInstance( curr._type );  
  6.   
  7.                 System.Windows.Forms.UserControl    c =  
  8.                     (System.Windows.Forms.UserControl) curr._instance;  
  9.   
  10.                 ctrlContainer.Controls.Add( c );  
  11.   
  12.                 // set the dock properties of the control.  
  13.   
  14.                 c.Anchor =  
  15.                     AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;  
  16.   
  17.                 c.Left = 0;  
  18.                 c.Top = 0;  
  19.                 c.Width = ctrlContainer.Width;  
  20.                 c.Height = ctrlContainer.Height;  
  21.   
  22.                 ctrlContainer.Visible = true;  
  23.             }  


 

(2)载入NDIO Monitor的内核Hook驱动。
  1. forint z=0; z<3; z ++ )  
  2.                 {  
  3.                     _protocolList = NdisHookStubs.NT_PROTOCOL_LIST.Start( (uint) PacketBacklog,  
  4.                         UseLt == false ? 0 : LtLoopbackIp,  
  5.                         UseLt == false ? 0 : LtNatIp );  
  6.   
  7.                     if ( _protocolList != null )  
  8.                         break;  
  9.                     else  
  10.                         Thread.Sleep( 1000 );  
  11.                 }  


 

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

(3)设置当前ExtensionInfo的_instance,用来添加菜单。
  1. curr._instance.Showing ( new LogFn( ExtensionLogFn ), _protocolList, popupMenu );  
  2.             ( (System.Windows.Forms.UserControl) curr._instance ).Visible = true;  
  3.   
  4.             if ( popupMenu.MenuItems.Count != 0 )  
  5.                 ctrlMenu.MenuItems.Add( popupMenuIndex, popupMenu );  
  6.   
  7.             ctrlMenu.MenuItems[ ctrlMenu.MenuItems.Count - 1 ].Index =  
  8.                 ctrlMenu.MenuItems.Count - 1; // help popup menu.  

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

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

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


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

  1. al.Add( np );  

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

  1. for ( int i=0; i<al.Count; i ++ )  
  2.                             {  
  3.                                 NdisHookStubs.NEXT_PACKET       npI = (NdisHookStubs.NEXT_PACKET) al[ i ];  
  4.                                 int                             k = i;  
  5.                                 for ( int j=i+1; j<al.Count; j ++ )  
  6.                                     if ( ((NdisHookStubs.NEXT_PACKET)al[ j ])._dwPacketSerial < npI._dwPacketSerial )  
  7.                                         k = j;  
  8.                                 if ( k != i )  
  9.                                 {  
  10.                                     al[ i ] = al[ k ];  
  11.                                     al[ k ] = npI;  
  12.                                 }  
  13.                             }  
  14.   
  15.                             // post the packets in the correct thread context.  
  16.                             foreach( NdisHookStubs.NEXT_PACKET thisNp in al )  
  17.                             {  
  18.                                 IntPtr          ptr = (IntPtr) thisNp;  
  19.                                 PostMessage( THIS.Handle, _nextPacketArrived, new IntPtr( 0 ), ptr ); // old tricks die hard... !  
  20.                             }  


捕捉到的数据显示为:


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

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


 

3、显示适配器对话框的函数miAdapters_Click
(1)SetProtList。

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

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


 

(2)显示窗口。

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

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

  1. if ( dlg._retval != null && _protocolList != null )  
  2.             {  
  3.                 _openAdapters = dlg._retval;  
  4.                 _protocolList.Listen( _openAdapters );  
  5.             }  


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值