首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

2013-02-19 
向cdsn各位大侠求助,xp的驱动超时退出定时器已经起作用了,超时进入了时间中断,系统驱动程序停在IRP_MJ_INT

向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信息没关系,贴出来,坛子里很多筒子都能看明白,给你建议。

热点排行