阅读:3442回复:5
求教读摄像头ISO管道导致蓝屏问题
小弟初学WDF开发,最近碰到个问题比较棘手,不知如何下手解决,特向各位高人求教.
我将WDK自带的usbsamp例子做了修改,尝试读取USB摄像头的数据(就是市面上最常见的免驱摄像头),现在可以成功读取iso管道,但有时会出现蓝屏,提示IRQL_NOT_LESS_OR_EQUAL,特别是一次读取数据量很大时,很容易出现蓝屏,比如一次读取614400Byte就比307200Byte出现蓝屏的概率大很多,我对usbsamp例子做的修改主要是Device配置和增加了VC接口的配置代码,ISO传输这部分代码没有动,我通过调试信息可以看出,发生蓝屏时,"if (WdfRequestSend(subRequest, WdfUsbTargetPipeGetIoTarget(pipe), WDF_NO_SEND_OPTIONS) == FALSE) "这段代码已经将URB送出(PASSIVE_LEVEL,异步方式) ,在SubRequestCompletionRoutine()完成例程(DISPATCH_LEVEL)执行前蓝屏的,我怀疑是因为读取了分页内存的原因,但从代码中又找不到具体位置,MS这段代码中我能找到的都是nopagepool,所以我的问题是: 1 WdfRequestRetrieveOutputWdmMdl(Request, &requestMdl)获取的输出缓冲区到底是在那里定义的(direct io方式)?如果是系统自动分配的,有没有可能分配给page内存?如果分配了page内存,是否会因为完成例程的IRQL比较高而导致蓝屏?如果是,如何避免?我看资料上说系统会锁定这块内存,特求证一下。 2 我看资料上说nopagepool比较有限,要省着用,我不知道614400byte这样大的数据到底算多还是不多?我从usbsamp的代码分析来看,MS的这段代码应当远不止能读这么点数据,那么到底是MS的这段代码本身就有问题,还是说改到USB摄像头上用后,这段代码相应的某些数据要修改?如果是的话,大概是那些数据需要根据摄像头来修改? 3 如果我上面猜测都不对的话,恳请高人们指点一下迷津,到底是哪里的问题?至少能告诉我往哪个方向去找问题。小弟不胜感激。 |
|
最新喜欢:ygmpkk |
沙发#
发布于:2011-02-15 13:51
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2011-02-16 12:15
感谢1楼指点。用过滤驱动的话,我有2个疑问。
1 用过滤驱动的话,如何保证这个驱动只会识别我自己的摄像头,而不会把别人的摄像头也给过滤了? 2 MS的默认功能驱动怎么用?我发现摄像头在读取数据前,需要发一些控制命令去设置,我没找到MS默认驱动的相关IOCTL的资料,不知道如何去操作。 烦请再指点一下,Tks。 |
|
地板#
发布于:2011-02-28 16:24
>>1 用过滤驱动的话,如何保证这个驱动只会识别我自己的摄像头,而不会把别人的摄像头也给过滤了?
在AddDevice里面获取设备的Hardware ID,判断是不是你的设备。 >>2 MS的默认功能驱动怎么用?我发现摄像头在读取数据前,需要发一些控制命令去设置,我没找到MS默认驱动的相关IOCTL的资料,不知道如何去操作。 标准的HID IOCTL,我在WDK里面搜出了一大串,Refer下面的MSDN网页:http://msdn.microsoft.com/zh-cn/library/ff541089(v=vs.85).aspx 你应该学习一下如果搜索= |
|
|
地下室#
发布于:2011-03-01 15:36
回 3楼(Pegram) 的帖子
哈,感谢佩大百忙之中抽空解答.不时兄弟我懒惰阿,我查过,USB摄像头默认的驱动是usbvideo.sys.这个的IOCTL在MSDN和Google上确实都没找到相关的说明,小弟初学dirver开发,还真不知道还有什么其他地方可以搜索的了。 另外,最新的结果是我发现是和Bus hound有冲突,卸载bus hound后就不会出现蓝屏死机现象,但读取失败的概率仍然很高,正在找原因。 再次感谢各位的帮助。 |
|
5楼#
发布于:2011-03-09 14:30
它提示的是中断级别低了吧,要不在读取数据的时候提高IRQL试试
|
|