当前位置: 代码迷 >> 驱动开发 >> 向cdsn各位大侠,xp的驱动超时退出
  详细解决方案

向cdsn各位大侠,xp的驱动超时退出

热度:8827   发布时间:2013-02-26 00:00:00.0
向cdsn各位大侠求助,xp的驱动超时退出
定时器已经起作用了,超时进入了时间中断,系统驱动程序停在IRP_MJ_INTERNAL_DEVICE_CONTROL里面,
VOID TimerRoutine(
  IN DEVICE_OBJECT *DeviceObject,
  IN PVOID Context
)
{
PIRP Irp;
UCHAR func;
PDEVICE_EXTENSION pDevExt =(PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
Irp=pDevExt->currentPendingIRP;
func=IoGetCurrentIrpStackLocation(Irp)->MajorFunction;
BulkUsb_DbgPrint(1, ("TIMEOUT 0x%x\n",func));//IRP_MJ_INTERNAL_DEVICE_CONTROL
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest (Irp,IO_NO_INCREMENT);
}
没有最后的complete这句程序就不停输出timeout 0xf,就是IRP_MJ_INTERNAL_DEVICE_CONTROL。
有最后这句就蓝屏了,各位帮帮忙,有什么建议吗?
程序源码就是winddk2600的src的bulkusb。编译器就是2600的build。
这是没咒没辙了。
xp winddk 超时处理

------解决方案--------------------------------------------------------
引用:
引用:1、Irp这个变量使用之前是否需要初始化一下?
2、IO_NO_INCREMENT这个参数的使用是否正确?
当然有初始化了,Irp=pDevExt->currentPendingIRP;这句话就是了,在进入底层前,这句话是反着的,就是设备指针的irp存储在当前irp变量里面的,currentPendingIRP就为此添加的……

那个参数是个宏定义,可以试试其他类似的参数宏。
------解决方案--------------------------------------------------------
蓝屏了哪还有什么信息呀。重新启动了。
-> 可以设置系统蓝屏时候产生Dump文件,用来分析具体的蓝屏原因。Enabling a Kernel-Mode Dump File

当然是有定时器了,否则怎么知道超时了呢。
策略是只在特定时间段内定时器有效,并且正常情况下是被正常的complete程序结束掉,超时不起作用,等到起作用时就是已经超时,调用特定的函数(现在这个是抄来的),从特定的状态下退出来,当然是希望退到complete程序去,定时器还是会被stop。
结果是把关键的起作用的IoCopleteRequest去掉,才是不断重复的,有了这个指令就直接蓝屏了,根本就没有重复的事。
->贴一部分代码上来,大家可以看看你的定时器是怎么设置的。

最直接的方式还是看蓝屏信息,分析蓝屏产生的Dump文件。
------解决方案--------------------------------------------------------
既然已经蓝屏了,把蓝屏信息读取出来,分析dump文件才是正确的解决问题的办法。
------解决方案--------------------------------------------------------
引用:
也就是从start到stop正常情况下不会超过1秒,所以时间中断程序不会起作用。

也就是说,中断程序起作用时是非正常情况。你在一楼说“没有最后的complete这句程序就不停输出timeout 0xf”,说明你的时间中断程序反复进入了。

你看不懂dump信息没关系,贴出来,坛子里很多筒子都能看明白,给你建议。