阅读:2430回复:0
drivernetwork miniport驱动学习(11)
硬件资源的声明
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 |
|