开发的USB设备驱动程序,Win7上运行不稳,XP完全正常

iamlbccc 2012-12-04 10:19:16
看了一个月《Windows驱动开发详解》,依照光盘17章BulkUsb的实例代码写了个USB设备驱动(实现让用户层自定义setup包,传给Driver,再发送出去)。
在Xp上能够100%正常工作。然后,使用wdk编译除win7版本,在Win7上大概有1/50的几率出错。

比如:在用户层构造一个GetDeviceDescriptor的setup包,大多数时候获取的数据都是对的。
(有一个现象是:如果高速的反复发送GetDeviceDescriptor,比间隔1s发送,错误率低很多。即,越慢越容易出错)

错误的位置大概是 IoCallDriver(deviceExtension->TopOfStackDeviceObject, irp)这个函数返回。由于win7上没法使用irpTrace,所以我也不确定。从log大概定位到这里。

我有这么几个问题:
> WDM驱动能在Win7上正常工作吗?我这个XP上正常的驱动,是否就应该能直接在win7上用.
(光盘17章的源程序有朋友在Win7上跑过吗)

> Win7上有什么类似irpTrace的工具吗.irpTracker我的win7上也不好用,老蓝屏.

> 上面提到的错误,我应该从什么方面着手检查?

> 有没有必要改用WDF重新实现,为了在Win7上使用.
...全文
610 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011788707 2013-09-19
  • 打赏
  • 举报
回复
ok ok ok
u010896759 2013-07-14
  • 打赏
  • 举报
回复
楼主大神,求源码。
iamlbccc 2012-12-11
  • 打赏
  • 举报
回复
> 问题出在Usb Power Management上。 BulkUsb这个例子中: 1.设备空闲时,发送Idle IRP到hub驱动,此时Device Status从D0调整到D3. 2.CreateFile的时候会唤醒Device,即发送IoCancelIrp结束Idle IRP. 这样会调用到Idle IRP的complete函数,它会创建一个Power Management的irp(PoRequestIrp)发送到设备栈顶层来唤醒设备。 PoRequestIrp的complete函数被调用之后,设备才正式上电成功。此时才能进行ioctl的相关操作。 错误的原因在于: PoRequestIrp的complete函数,和 ioctl的同步出问题了。 即:ioctl跑在了“PoRequestIrp的complete”的前面。 我修改了一下: 让Idle IRP的complete在设备正真唤醒后,才返回。 即,CreateFile反悔时,设备已经唤醒了。 之后这个驱动就没有出现概率出错的情况了。
九州剑王 2012-12-05
  • 打赏
  • 举报
回复
WIN7下编译的WDM肯定能在win7下跑,不需要wdf吧~ 另外win7下调试还是要windbg啊,softice不是xp后就不支持了么
曹大夯 2012-12-05
  • 打赏
  • 举报
回复
引用 楼主 iamlbccc 的回复:
> WDM驱动能在Win7上正常工作吗?我这个XP上正常的驱动,是否就应该能直接在win7上用. (光盘17章的源程序有朋友在Win7上跑过吗) > Win7上有什么类似irpTrace的工具吗.irpTracker我的win7上也不好用,老蓝屏. > 上面提到的错误,我应该从什么方面着手检查? > 有没有必要改用WDF重新实现,为了在Win7上使用.
1. builkusb应该是WDK里面的例子,你可以看看最新的WDK里面有没有该例子,看看该例子和书本提供的例子有什么区别。 2.1/50的几率出错--是什么样的错误啊? 3.正如楼上说的WDM驱动在win7下支持没问题,不需要用wdf。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧