rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
阅读:1396回复:1

请教DPC操作的实现

楼主#
更多 发布于:2007-09-10 21:49
最近在做一个WinXP的WiFi网卡驱动,下层接口是USB,因此属于NDIS-WDM模型。由于跟硬件之间的交互都是通过USB接口进行的,而且很多设置和查询时通过控制端点来实现的。而这些USB操作的通过向USBD发送IRP来实现。

现在的问题是,当上面的协议驱动(ndisuio)要进行某些操作时,比如扫描,需要通过USB接口来启动硬件操作。目前的解决做法是把硬件操作作为WORK ITEM来实现,这没有问题。

但参考Windows给出的UsbnWifi,其中的硬件操作则是放在DPC中来实现的。DPC通过Timer来启动。如果把自己写的WORI ITEM换成DPC,则总是出现错误。出错的原因基本上是由于USB操作代码只能运行于PASSIVE_LEVEL,而不能运行在DISPATCH_LEVEL。

举一个具体的例子,驱动接收OID_802_11_BSSID_LIST_SCAN,接着启动Scan操作的Work Item。Work Item中进行设置信道、发送Probe Request等操作,这些操作都通过USB接口来让硬件实现。

如果改成:驱动受到OID_802_11_BSSID_LIST_SCAN后NdisMSetTimer来启动DPC,则总是出现BSOD,停止代码要么为0xD1,要么为0xB8。我已经把USB接口操作的代码中KeWaitForSingleObject的超时值设为了0还是不行

请大家给点思路,怎么样才能用DPC实现呢
Chequer Jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-09-13
  • 最后登录2007-12-17
  • 粉丝1
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-14 14:05
Timer function总是运行在dispatch level。如果你一定要在passive level做事,那你可以手工建立一个kernel thread。kernel thread function总是执行在passive level.
游客

返回顶部