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

drivernetwork miniport驱动学习(11)

楼主#
更多 发布于:2004-03-28 19:32
硬件资源的声明
NIC一般需要四种硬件资源:IO端口,中断,内存和DMA。
定义在头文件kndis.h中的枚举类型CM_RESOURCE_TYPE用来说明资源类型
typedef enum _CM_RESOURCE_TYPE {
CmResourceTypeNull = 0,    // Reserved
CmResourceTypePort,  
CmResourceTypeInterrupt,
CmResourceTypeMemory,
CmResourceTypeDma,
CmResourceTypeDeviceSpecific,
CmResourceTypeMaximum
} CM_RESOURCE_TYPE;
因此每一种资源类型都由一组CM_PARTIAL_RESOURCE_DESCRIPTOR结构的属性描述,也定义在kndis.h文件中。例如IO端口的属性包括IO端口基地址,IO端口范围长度等等。
typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
    UCHAR Type;
    UCHAR ShareDisposition;
    USHORT Flags;
    union {
        //包含的端口号的范围。与物理总线相关。
//该值应该和提交给HalTranslateBusAddress()的一样
        //
        struct {
            PHYSICAL_ADDRESS Start;
            ULONG Length;
        } Port;
        //IRQL和向量。应该和提交给HalGetInterruptVector()的值一样
        //
        struct {
            ULONG Level;
            ULONG Vector;
            ULONG Affinity;
        } Interrupt;
        //
        // 包含的内存范围。与物理总线相关
        // 应该和提交给HalTranslateBusAddress()的一样。
        //
        struct {
            PHYSICAL_ADDRESS Start;    // 64 bit physical addresses.
            ULONG Length;
        } Memory;

        //
        // 物理DMA通道
        //
        struct {
            ULONG Channel;
            ULONG Port;
            ULONG Reserved1;
        } Dma;
        //
        // 驱动定义的设备细节信息。Device Specific information defined by the driver.
        // The DataSize表示数据字节数。数据紧紧跟在DeviceSpecificData结构之后
        //
        struct {
            ULONG DataSize;
            ULONG Reserved1;
            ULONG Reserved2;
        } DeviceSpecificData;
    } u;
} CM_PARTIAL_RESOURCE_DESCRIPTOR,

DriverNetworks用KNdisResource<CM_RESOURCE_TYPE>模板来抽象资源类型,并提供了查询资源属性的访问方法。

模板< CM_RESOURCE_TYPE >类 KNdisResource
KNdisReource提供了访问各种硬件资源类型属性的方法。资源类型T时模板参数,可以是CmResourceTypeXxxx NDIS常量之一。KNdisReource的构造函数其实执行了查询资源的过程,而访问方法只是重新获得资源属性的真实值而已。
在访问资源属性之前,驱动必须说明要用到哪一种资源查询方法。根据NIC总线类型查询方法有以下几种:
1)KNdisPnpResourceRequest仅仅用于NDIS 5 的驱动
KNdisPnpResourceRequest重新获得PnP管理器分配给适配器的硬件资源。建议对所有NDIS 5的miniport使用该方法。
成员函数
KNdisPnpResourceRequest
游客

返回顶部