阅读:1396回复:1
请教DPC操作的实现
最近在做一个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实现呢 |
|
沙发#
发布于:2007-09-14 14:05
Timer function总是运行在dispatch level。如果你一定要在passive level做事,那你可以手工建立一个kernel thread。kernel thread function总是执行在passive level.
|
|