日期:2014-05-18 浏览次数:20818 次
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
欢迎大家拍砖!
(1)先调用GetExtensions来获得运行目录下bin目录中的所有文件,通过载入为Assembly,然后获取属性及名字, 并把它们转化为自定义的ExtensionInfo类型的数组存放。
(2)创建ComboxBox,并根据第(1)步得到的bin文件夹下文件初始化Combox里的内容。
(3)更新状态栏为
(1)根据从下拉框选择的项,创建控件并加到容器(ctrlContainter,即主界面中显示收到包的控件)中;
if ( curr._instance == null ) { // create the control and add it to the container. curr._instance = (INmExtension) Activator.CreateInstance( curr._type ); System.Windows.Forms.UserControl c = (System.Windows.Forms.UserControl) curr._instance; ctrlContainer.Controls.Add( c ); // set the dock properties of the control. c.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; c.Left = 0; c.Top = 0; c.Width = ctrlContainer.Width; c.Height = ctrlContainer.Height; ctrlContainer.Visible = true; }
for( int z=0; z<3; z ++ ) { _protocolList = NdisHookStubs.NT_PROTOCOL_LIST.Start( (uint) PacketBacklog, UseLt == false ? 0 : LtLoopbackIp, UseLt == false ? 0 : LtNatIp ); if ( _protocolList != null ) break; else Thread.Sleep( 1000 ); }
根据从驱动中获得的协议列表提取出来的协议和适配器来初始化NT_PROTOCOL_LIST类。
curr._instance.Showing ( new LogFn( ExtensionLogFn ), _protocolList, popupMenu ); ( (System.Windows.Forms.UserControl) curr._instance ).Visible = true; if ( popupMenu.MenuItems.Count != 0 ) ctrlMenu.MenuItems.Add( popupMenuIndex, popupMenu ); ctrlMenu.MenuItems[ ctrlMenu.MenuItems.Count - 1 ].Index = ctrlMenu.MenuItems.Count - 1; // help popup menu.
Thread listenThread = new Thread( new ThreadStart( listenThreadProc ) ); listenThread.Start ();
(4、1)它做的事情是调用NdisHook的API接口等待数据包的到来,如果数据包来了,就返回一个数据包。
NdisHookStubs.NEXT_PACKET np = NdisHookStubs.NEXT_PACKET.WaitFor ();
(4、2)判断bArePacketsRemaining将所有的数据包接收完成存放在ArrayList al 中;
al.Add( np );
(4、3)如果数据接收完成,那么根据包的序列号(_dwPacketSerial)排序后把每个包发到主窗口显示出来。
for ( int i=0; i<al.Count; i ++ ) { NdisHookStubs.NEXT_PACKET npI = (NdisHookStubs.NEXT_PACKET) al[ i ]; int k = i; for ( int j=i+1; j<al.Count; j ++ ) if ( ((NdisHookStubs.NEXT_PACKET)al[ j ])._dwPacketSerial < npI._dwPacketSerial ) k = j; if ( k != i ) { al[ i ] = al[ k ]; al[ k ] = npI; } } // post the packets in the correct thread context. foreach( NdisHookStubs.NEXT_PACKET thisNp in al ) { IntPtr ptr = (IntPtr) thisNp; PostMessage( THIS.Handle, _nextPacketArrived, new IntPtr( 0 ), ptr ); // old tricks die hard... ! }
捕捉到的数据显示为:
(5)显示适配器对话框(OpenAdapters窗口)。
if ( showAdapters && _protocolList != null ) miAdapters_Click( null, null );
把之前获得的<