stoneswong001
驱动牛犊
驱动牛犊
  • 注册日期2010-12-28
  • 最后登录2013-05-09
  • 粉丝1
  • 关注1
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3317回复:5

求教读摄像头ISO管道导致蓝屏问题

楼主#
更多 发布于:2011-02-13 21:11
小弟初学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 如果我上面猜测都不对的话,恳请高人们指点一下迷津,到底是哪里的问题?至少能告诉我往哪个方向去找问题。小弟不胜感激。

最新喜欢:

ygmpkkygmpkk
eaatcc
禁止发言
禁止发言
  • 注册日期2006-04-21
  • 最后登录2018-12-27
  • 粉丝0
  • 关注0
  • 积分6884分
  • 威望34869点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2011-02-15 13:51
用户被禁言,该主题自动屏蔽!
stoneswong001
驱动牛犊
驱动牛犊
  • 注册日期2010-12-28
  • 最后登录2013-05-09
  • 粉丝1
  • 关注1
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-02-16 12:15
感谢1楼指点。用过滤驱动的话,我有2个疑问。

1 用过滤驱动的话,如何保证这个驱动只会识别我自己的摄像头,而不会把别人的摄像头也给过滤了?

2 MS的默认功能驱动怎么用?我发现摄像头在读取数据前,需要发一些控制命令去设置,我没找到MS默认驱动的相关IOCTL的资料,不知道如何去操作。

烦请再指点一下,Tks。
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
地板#
发布于: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
你应该学习一下如果搜索=
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
stoneswong001
驱动牛犊
驱动牛犊
  • 注册日期2010-12-28
  • 最后登录2013-05-09
  • 粉丝1
  • 关注1
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2011-03-01 15:36
回 3楼(Pegram) 的帖子
哈,感谢佩大百忙之中抽空解答.

不时兄弟我懒惰阿,我查过,USB摄像头默认的驱动是usbvideo.sys.这个的IOCTL在MSDN和Google上确实都没找到相关的说明,小弟初学dirver开发,还真不知道还有什么其他地方可以搜索的了。

另外,最新的结果是我发现是和Bus hound有冲突,卸载bus hound后就不会出现蓝屏死机现象,但读取失败的概率仍然很高,正在找原因。

再次感谢各位的帮助。
wanttoflyup
驱动牛犊
驱动牛犊
  • 注册日期2011-03-06
  • 最后登录2013-02-22
  • 粉丝0
  • 关注6
  • 积分19分
  • 威望231点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2011-03-09 14:30
它提示的是中断级别低了吧,要不在读取数据的时候提高IRQL试试
游客

返回顶部