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

DriverNetwork miniport驱动学习(1)

楼主#
更多 发布于:2004-03-17 20:23
NDIS Miniport驱动框架介绍
NDIS miniport adapter 类继承了 KNdisMiniAdapter 类 并且声明了处理程序所需的signatures,例如Initialize(), Halt()和 Reset()。它们可以是虚拟的或者非虚拟的,或是派生类内联成员。对于这些处理程序的命名和DDK很接近。例如Initialize()对应MiniportInitialize(),Halt()对应MiniportHalt()。这些处理程序的处理过程和IRQL级与相应的DDK处理程序类似。
下面的UML类图表描述了DriverNetworks框架类和驱动开发者实现的类之间的关系。驱动开发者提供的类用黄颜色显示。
驱动开发者主要提供两个类
• KNdisMiniDriver-继承 driver 类
• KNdisMiniAdapter-继承 adapter 类
注意:Network Driver Wizard应用程序将为NDIS驱动项目自动生成这两个类。
在驱动安装之前,框架调用adapter的DriverEntry()方法,该方法将在NDIS中注册adapter。注册由帮助模块类KNDIS_MINIPORT_CHARACTERISTICS处理,它将一组adapter支持的处理程序提交给NDIS。默认的处理程序集合以及其他miniport特征都在帮助模块类中说明,KNdisAdapterTraits。每个miniport驱动项目都包括一个头文件Characteristics.h,这可以用来重新定义特殊adapter的某些特征(例如,处理程序集合)。
Adapter注册完成之后,NDIS开始调用adapter的处理程序。这些处理程序通过框架模块类KNdisWrapper从NDIS中调用。对每个adapter类A,框架都用具体的例子说明KNdisWrapper<A>的实现,KNdisWrapper<A>转发NDIS回调给正确的A定义的处理程序。驱动开发者不必实现QueryInformation()和SetInformation()处理程序,这两个程序用来处理NDIS OIDs。在DriverNetworks中,框架通过OID maps来实现对OID的处理。
任何一个KNdisMiniAdapter派生类的实体都由DriverNetworks框架自动创建。因此不必为adapter调用new()。框架负责向NDIS注册,解释原始NDIS的MiniportInitialize()的回调,并创建adapter类的一个实体。创建实体之后,框架将控制提交给派生类的Initialize()处理程序。Initialize()处理程序执行必要的定制步骤,例如声明硬件资源和NIC初始化。从Initialize()处理程序成功的返回,adapter才能被系统使用。
KNdisMiniAdapter派生对象的消除也由框架处理。在消除之前立即调用Halt()处理程序。Adapter类执行硬件特性的shutdown,资源回收等等。当miniport通过控制面板或者系统shutdown时,才调用Halt()处理程序。
NDIS Miniport Driver Handler Signatures
class CMyAdapter : public KNdisMiniAdapter {
public:
// Initialization and shutdown
  NDIS_STATUS Initialize(IN OUT KNdisMedium& Medium, IN KNdisConfig& Config) ;
  VOID Halt(VOID);
  NDIS_STATUS Reset(OUT PBOOLEAN AddressingReset);
  void Shutdown(VOID);
// OID requests
  NDIS_STATUS QueryInformation(
       IN NDIS_OID Oid,
       IN PVOID InformationBuffer,
       IN ULONG InformationBufferLength,
       OUT PULONG BytesWritten,
       OUT PULONG BytesNeeded
       ) ;
  NDIS_STATUS SetInformation(
       IN NDIS_OID Oid,
       IN PVOID InformationBuffer,
       IN ULONG InformationBufferLength,
       OUT PULONG BytesRead,
       OUT PULONG BytesNeeded
       ) ;
// Sending packets
  VOID SendPackets(
      IN PPNDIS_PACKET PacketArray,
      IN UINT NumberOfPackets
      ) ;
  VOID ReturnPacket(IN PNDIS_PACKET Packet);

// overridables for interrupt-driven miniports
  BOOLEAN CheckForHang() ;
  VOID DisableInterrupt() ;
  VOID EnableInterrupt() ;
  VOID HandleInterrupt() ;
  VOID Isr(OUT PBOOLEAN InterruptRecognized,
        OUT PBOOLEAN QueueMiniportHandleInterrupt ) ;
};
提示:  最容易熟悉框架的途径就是启动Network Driver Wizard生成一个基本 NDIS miniport 或者NDIS IM 驱动项目。

最新喜欢:

basic100basic1...
qqvsdd
驱动牛犊
驱动牛犊
  • 注册日期2008-04-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-18 11:04
多谢
游客

返回顶部