zoukankan      html  css  js  c++  java
  • 基于Passthru的NDIS开发的个人理解

    这几天对NDIS的学习,基本思路是:首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的。

    Passthru是微软NDIS自己写的一个框架驱动,NDIS开发者可以在此框架上进行扩展,做二次开发。
    NDIS提供一些基本操作函数,Passthru里的函数就是使用的这些基本函数做成的一个网络驱动。

    基于Passthru的扩展就是自己在此驱动的基础上在封装一次,比如说为MyPassthru,将NDIS里面的函数封装在自己自定义函数里,方便外界调用。
    最主要的函数就是NDIS里面的PtReceive或PtReceivePacket(负责网络封包的接收) ,MPSend或MPSendPacket(负责发送上层准备发送到网络的数据包),这四个回调函数是封包截获和过滤的关键。

    总体上,基于NDIS的程序分为应用程序、驱动程序以及两者的通信三大部分:

    (1)基于NDIS 中间层的驱动程序(passthru.sys)
    该程序运行于内核态,主要有以下功能模块:
    A. 网络封包截获,在数据链路层和网络层之间捕获所有接收到的封包
    B. 网络封包过滤,根据过滤规则,决定每一个封包的行为(放行或丢弃)
    C. 网络封包发送,将用户构造的封包发送至网络中

    (2)应用层的测试程序(NdisDemo.exe)
    应用程序主要起着控制驱动程序行为的作用,主要有以下功能模块:
    A. 封包解析,对底层的封包进行分析
    B. 驱动设置,控制驱动的的行为,如缓冲数量、过滤规则等
    C. 封包构造,构造任意数据包,并控制驱动程序发送该封包

    (3)驱动程序与应用程序之间的通信
    A. 本文采用文献中介绍的共享内存方式。应用层在获取共享内地址后,可以直接对内存进行操作,从而减少了数据复制的次数;
    B. 为减少应用程序在对数据包解析时,驱动程序发生丢包现象,在内核中申请一个比较大的缓冲区(作为共享内存),通过循环队列的方式对缓冲区进行存取操作;
    C. 为进一步提高效率,驱动程序在缓存一定数量之后,才以事件的方式通知应用程序。同时采用定时器的机制,保证所有数据能被应用程序读取。

    其中第一部分只需开发者了解明白即可,关键是处理第二、三部分和这三者之间的联系。
    当然,第二部分只是一个例子,你也可以写成自己的一个库,到时是具体的应用程序直接调用库。 

  • 相关阅读:
    iOS TTF文件改变字体
    iOS CoreAnimation 核心动画
    iOS no visible @interface for 'UIButton' declares the selector errors
    iOS 如何通过CocoaPods添加第三方框架
    iOS AVAudioPlayer播放音乐
    iOS 一些常用代码的总结
    iOS 基础
    qworker 实例
    delphi RTTI 反射技术
    delphi IOUtils单元 处理文件路径相关
  • 原文地址:https://www.cnblogs.com/RodYang/p/3221190.html
Copyright © 2011-2022 走看看