阅读:3015回复:1
DriverNetwork miniport驱动学习(2)
声明硬件资源
Windows NT和Windows 2000定义了四种基本外围设备的硬件资源,例如NIC: • I/O Ports • Interrupt • Memory • DMA 枚举类型CM_RESOURCE_TYPE定义在ndis.h文件中,用于确定资源类型。 每一类资源都具有CM_PARTIAL_RESOURCE_DESCRIPTOR 结构描述的一组属性,该结构也定义在ndis.h文件中。例如, I/O端口属性包括I/O端口基地址,I/O端口长度范围等等。 DriverNetworks将硬件资源抽象成KNdisResource< CM_RESOURCE_TYPE>模块,提供了查询资源属性的访问方法。 NDIS Miniport 驱动处理硬件资源一般有以下三步: 1) Query the system 查询系统有关分配给miniport的硬件资源信息。 2) Query the attributes 查询每个资源的属性。 3) Initialize system objects 基于属性对系统对象初始化(例如, Interrupt 和I/O端口范围) 。 1.查询系统有关分配给miniport的硬件资源信息 根据NDIS版本和NIC总线类型,查询系统有许多不同的方法。NDIS4驱动采用总线特有的请求来完成Pre-PnP。DriverNetworks提供了两个类来完成该过程:KNdisPciResourceRequest和KNdisParamResourceRequest。 在NDIS 5中,PnP管理器处理所有硬件资源,包括non-PnP设备。对于NDIS 5驱动,系统采用非总线特有的KNdisPnpResourceRequest来查询,这是基于NdisMQueryAdapterResources的。尽管所有其他的NDIS 5资源请求类都很好用,但是一般还是习惯用KNdisPnpResourceRequest来查询硬件资源。 一般在Initialize()处理程序中对正确的请求初始化来实现系统查询。 例如: KNdisPciResourceRequest req(this); 2.查询属性和初始化系统对象 在无论采用什么查询方法查询系统之后,接下来就要完成属性查询和初始化系统对象。 访问每一个资源都要求对正确资源类型初始化。例如: KNdisResource<CmResourceTypeInterrupt> nt(req); 上面初始化一个中断资源描述符。 当系统对象初始化后,可以利用资源属性创建一个正确的系统对象。例如: m_pInterrupt = new KNdisInterrupt(this,Int.Level(), Int.Affinity()); 通过IsValid()方法检查错误,来确保资源对驱动来说是可用的。下面的代码示范了获得中断和I/O端口资源的技术: NDIS_STATUS MyAdapter::Initialize(KNdisMedium& Medium, IN KNdisConfig& Config) {. . . // get h/w resources KNdisPnpResourceRequest request(Config); // how do we query KNdisResource<CmResourceTypePort> Port(request); // what do we query KNdisResource<CmResourceTypeInterrupt> Int(request); // what do we query // Make sure the resources are available if (!Port.IsValid()) KNDIS_RETURN_ERROR (NDIS_STATUS_NOT_ACCEPTED); if (!Int.IsValid()) KNDIS_RETURN_ERROR (NDIS_STATUS_NOT_ACCEPTED); // Register i/o port range system object: m_Ports.Initialize(this, Port); if (!m_Ports.IsValid()) KNDIS_RETURN_ERROR (NDIS_STATUS_RESOURCES); // Register interrupt system object: m_Interrupt.Initialize(this, Int, NdisInterruptLatched); if (!m_Interrupt.IsValid()) KNDIS_RETURN_ERROR (NDIS_STATUS_RESOURCES); . . . // OK! return NDIS_STATUS_SUCCESS; } |
|
沙发#
发布于:2008-07-18 11:05
顶啊
|
|