lsshao
驱动牛犊
驱动牛犊
  • 注册日期2004-02-03
  • 最后登录2007-10-29
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3398回复:2

DrvierNetwork miniport驱动学习(10)

楼主#
更多 发布于:2004-03-27 21:51
前言
这一次重新研读DriverNetwork的有关miniport驱动的帮助文档,并以DriverNetwork中自带的nmne2k例子说明相应的知识点。

第一次重新学习内容:NDIS的miniport驱动框架

    NDIS miniport的adapter类继承了KNdisMiniAdapter类,主要声明了所需的例程,例如Initialize(), Halt()和Reset()。这些例程可以是虚拟的或者非虚拟的,或者是派生类内联的成员函数。这些例程和模块的命名和DDK一一对应:Initialize() 对应MiniportInitialize();Halt() 对应MiniportHalt()。对这些例程的处理和IRQL级也和DDK相应的MiniportXxxx()一样。

    参看文档Understanding the NDIS Miniport Driver Framework的图:该图描述了DriverNetworks框架类和驱动开发者要实现的类(黄颜色给出了)之间的关系。

驱动开发者提供了两个主要的类:
1)KNdisMiniDriver派生driver类:class NMNE2KDriver : protected KNdisMiniDrive
driver派生类负责向NDIS注册miniport的adapter,并且必须实现唯一的虚拟方法KNdisMiniDriver::DriverEntry()。DriverEntry()一般只要注册KNdisMiniAdapter派生的miniport的 adapter类。在向NDIS注册了adapter之后,NDIS立即调用adapter类的Initialize()例程。DriverNetwork框架要求源文件包括宏:DECLARE_MINIDRIVER_CLASS(DriverClass)
 
2)KNdisMiniAdapter派生adapter类:class NMNE2KAdapter : public KNdisMiniAdapter
Adapter类实现了全部的方法,分成两种类型:handlers和service。Handlers:驱动提供给NDIS回调用的,例如Initialize(),Halt()和Reset()等等。NDIS通过KNdisWrapper类调用这些handlers。对于每一个适配器类A,框架创建了一个KNdisWrapper<A>的一个实现,将NDIS回调转发给A定义的正确的handlers。所需要的handlers都在Characteristics.h文件的宏KNDIS_MINIPORT_HANDLER声明了,而且都必须声明,如果在该头文件中声明而又没有在adapter类中实现,NDIS就会调用默认的基类handler,报告“Handler not implemented!Check Characteristics.h”。services是NDIS提供给miniport调用的方法,这些服务通常由handler调用。
Instantiation过程:DriverNetwork框架自动生成一个KNdisMniportAdapter派生类的实体。框架向NDIS注册,截取初始NDIS的MiniportInitialize()回调函数,并创建一个adapter类的实体。创建adapter实体之后,框架将控制权交给Initialize() handler,Initialize()完成如下功能:1)声明硬件资源2)对NIC初始化。从Initialize()成功返回之后系统才能使用adapter。
Destruction过程:KNdisMiniportAdapter派生对象的销毁也由框架实现。在销毁之前,调用Halt() handler,完成如下功能:1)执行硬件关闭2)释放在Initialize()声明的资源。
成员函数:
KNdisMiniAdapter - 构造函数
~KNdisMiniAdapter - 析构函数
AllocateComplete - 共享内存分配完成 (handler)
CancelSendPackets - 取消悬挂状态的发送分组(handler)(NDIS5.1 only)
当捆绑的协议或者中间驱动执行NdisCancelSendPackets请求时,调用该handle。如果miniport将分组在内部排队,他应该遍历整个悬挂发送分组链表,并且取消每一个取消id和CancelId匹配的分组。
CheckForHang - 检测适配器的悬挂条件 (handler)
这是一个可选handler。如果定义了该handler,NDIS每两秒钟调用一次。如果CheckForHang返回真,NDIS就调用驱动的Reset() handler。如果满足悬挂条件,就返回真。
DisableInterrupt - 适配器中断去能 (handler)
EnableInterrupt - 适配器中断使能(handler)
GetDeviceProperty

最新喜欢:

mapoflmapofl
zhaihua
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-27 22:07
楼主!
你所说的nmne2k例子在哪?是不是miniport driver 的例子?
我正在找NDIS_WDM miniport driver的例子,搜不到啊!
你有吗?没有的话有一般miniport driver 例子参考一下也行!
谢谢 :D
没钱的日子真难过! 大哥,拉兄弟一把.
lsshao
驱动牛犊
驱动牛犊
  • 注册日期2004-02-03
  • 最后登录2007-10-29
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-27 22:15
C:\Program Files\Compuware\SoftICE Driver Suite\DriverNetworks\Examples\Kndis\nmne2k
这是我的路径!
可能你用的不是compuware公司的softice!
游客

返回顶部