阅读:970回复:2
请教大家:这段代码有什么问题?
使用windows startio ,iostartpacket & iostartnextpacket
在complete例程中,有如下代码: NTSTATUS OnComplete(PDEVICE_OBJECT pdo, PIRP Irp, PDEVICE_EXTENSION pdx) { LONG m_seglen; URB urb; URB urb_1; KEVENT event; IO_STATUS_BLOCK iostatus; if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } Irp->IoStatus.Status=STATUS_SUCCESS; Irp->IoStatus.Information =pdx->Length; IoStartNextPacket(pdo,TRUE);---------------? IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } 调试时,在?处,出现页故障(fatal error 0E),什么原因呢?有请高手指点,谢了先! |
|
沙发#
发布于:2002-06-25 16:30
看看你的OnComplete是在什么时候被调用的,irql是否正确。
|
|
|
板凳#
发布于:2002-06-25 16:48
先谢谢版主的回答.
下面是我的源码,调用iomanager的device queue的程序,请高手指正: NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp) { // DispatchControl PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; NTSTATUS status; ... ... UsbBuildInterruptOrBulkTransferRequest(&urb_1,sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER), pdx->houtpipe, buff,NULL,m_seglen,0,NULL); PIRP Irp_1 = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE,NULL, NULL); if (!Irp_1) { KdPrint((DRIVERNAME \" - Unable to allocate IRP for sending URB\\n\")); return STATUS_INSUFFICIENT_RESOURCES; } PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp_1); stack->Parameters.Others.Argument1 = (PVOID) &urb_1; IoMarkIrpPending(Irp_1); IoStartPacket(fdo,Irp_1,NULL,OnCancel); status=STATUS_PENDING; return status; } VOID StartIo(IN PDEVICE_OBJECT pdo, IN PIRP Irp) { KIRQL oldirql; NTSTATUS status; IoAcquireCancelSpinLock(&oldirql); if (Irp != pdo->CurrentIrp || Irp->Cancel) { IoReleaseCancelSpinLock(oldirql); return; } else { IoSetCancelRoutine(Irp, NULL); IoReleaseCancelSpinLock(oldirql); } PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) pdo->DeviceExtension; PVOID ctx; IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)OnComplete/*(pdo,Irp,pdx)*/, (PVOID) ctx, TRUE, FALSE,FALSE); status=IoCallDriver(pdx->LowerDeviceObject, Irp); return; } NTSTATUS OnComplete(PDEVICE_OBJECT pdo, PIRP Irp, PDEVICE_EXTENSION pdx) { LONG m_seglen; URB urb; URB urb_1; KEVENT event; IO_STATUS_BLOCK iostatus; if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } Irp->IoStatus.Status=STATUS_SUCCESS; Irp->IoStatus.Information =pdx->Length; IoStartNextPacket(pdo,TRUE); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } |
|