阅读:4083回复:1
DriverNetwork miniport驱动学习(1)
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 驱动项目。 |
|
最新喜欢:basic1... |
沙发#
发布于:2008-07-18 11:04
多谢
|
|