xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1932回复:13

急问大家,驱动程序bug怎么解决?

楼主#
更多 发布于:2002-10-24 17:17
在开发一个USB驱动时,使用了Oney的一个函数,调试时发现,如果设备端不回应,windows 就会出现page fault 当掉。是不是因为使用了kewaitforsingleobject函数。kewaitforsingleobject 函数中的时间怎么
设定呢?这个bug怎么解决呢?谢谢高手指点。

NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)
{ // SendAwaitUrb
PAGED_CODE();
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

KEVENT event;
KeInitializeEvent(&event, NotificationEvent, FALSE);

IO_STATUS_BLOCK iostatus;
PIRP Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &event, &iostatus);

if (!Irp)
{
KdPrint((DRIVERNAME \" - Unable to allocate IRP for sending URB\\n\"));
return STATUS_INSUFFICIENT_RESOURCES;
}

PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
stack->Parameters.Others.Argument1 = (PVOID) urb;
NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, Irp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
status = iostatus.Status;
}
return status;
} // SendAwaitUrb
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-25 10:43
为什么每人回,是没讲清楚问题吗?高手们,该出手时就出手嘛!
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-28 10:08
up一下!
将if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
status = iostatus.Status;
}
改为:
if (status == STATUS_PENDING)
{
status=KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
}
if(status==TIME_OUT)
   IoCancelIrp(Irp);
... ...
然后在调用函数中,IoCompletIrp(Irp);出现page fault ,why?
who can tell me? thank you!


rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-28 11:39
你的time out本来就没有,怎么会有TIME_OUT?

去看看DS的SubmitUrb,它做的“非常“好!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-28 12:56
ds \'s SubmitUrb的源码从哪能看到?
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-28 12:58
[quote]你的time out本来就没有,怎么会有TIME_OUT?

谢谢rayyang大侠出手!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-29 12:04
装上DS, 不就看到啦? 好奇怪的问题.... :o
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-30 07:51
看到了,一着急什么都乱了,谢了斑竹!
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-30 11:42
装上DS, 不就看到啦? 好奇怪的问题.... :o

再问一下:
    现在程序改成这个样子:


SendAwaitUrb{
... ...
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
stack->Parameters.Others.Argument1 = (PVOID) urb;
IoSetCancelRoutine(Irp,IrpCancel);
NTSTATUS status = IoCallDriver(pdx- >LowerDeviceObject, Irp);
if (status == STATUS_PENDING)
{
status=KeWaitForSingleObject(&event, Suspended/*Executive*/, KernelMode, FALSE, p_timeout);
}
if(status==STATUS_TIMEOUT)

IoCancelIrp(Irp);

return status;
}

VOID IrpCancel( IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
KIRQL oldirql = Irp->CancelIrql;
//IoAcquireCancelSpinLock(&oldirql);

    IoReleaseCancelSpinLock(oldirql);
  
Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}


现在还是在设备出故障时死机,您能给指正一下吗?谢谢!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-30 13:26

IoCancelIrp(Irp);
后面加上等待object,在IrpCancel里面signal。

其实你把ds的代码直接翻译过来,不是挺好的吗?它考虑的条件比你的更多,使用起来更安全。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-10-31 11:15
问题好像已经解决,谢了,rayyang大侠!!
maggiez
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-04 11:52
up一下!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-05 12:40
帖子都结束了,你还up什么?是不是有劲儿没处使?! :mad:
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
verifone
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2002-11-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-06 18:20
hao a
游客

返回顶部