阅读:1932回复:13
急问大家,驱动程序bug怎么解决?
在开发一个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 |
|
沙发#
发布于:2002-10-25 10:43
为什么每人回,是没讲清楚问题吗?高手们,该出手时就出手嘛!
|
|
板凳#
发布于: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! |
|
地板#
发布于:2002-10-28 11:39
你的time out本来就没有,怎么会有TIME_OUT?
去看看DS的SubmitUrb,它做的“非常“好! |
|
|
地下室#
发布于:2002-10-28 12:56
ds \'s SubmitUrb的源码从哪能看到?
|
|
5楼#
发布于:2002-10-28 12:58
[quote]你的time out本来就没有,怎么会有TIME_OUT?
谢谢rayyang大侠出手! |
|
6楼#
发布于:2002-10-29 12:04
装上DS, 不就看到啦? 好奇怪的问题.... :o
|
|
|
7楼#
发布于:2002-10-30 07:51
看到了,一着急什么都乱了,谢了斑竹!
|
|
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); } 现在还是在设备出故障时死机,您能给指正一下吗?谢谢! |
|
9楼#
发布于:2002-10-30 13:26
在
IoCancelIrp(Irp); 后面加上等待object,在IrpCancel里面signal。 其实你把ds的代码直接翻译过来,不是挺好的吗?它考虑的条件比你的更多,使用起来更安全。 |
|
|
10楼#
发布于:2002-10-31 11:15
问题好像已经解决,谢了,rayyang大侠!!
|
|
11楼#
发布于:2002-11-04 11:52
up一下!
|
|
12楼#
发布于:2002-11-05 12:40
帖子都结束了,你还up什么?是不是有劲儿没处使?! :mad:
|
|
|
13楼#
发布于:2002-11-06 18:20
hao a
|
|