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

DriverNetwork miniport驱动学习(2)

楼主#
更多 发布于:2004-03-18 10:08
声明硬件资源
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;
}

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

返回顶部