阅读:1154回复:1
来看一下这个问题
我读一个中断管道,设立了一个completeRoutine,一开始设备端没有数据写到中断端点,Irp总是不返回,我设定了一个定时器,过了一段时间后就IoCancelIrp,过了一段时间后,进入了完成程序,说明下层驱动程序返回了,但是我没有在相应的缓冲区中得到数据?
请问这是怎么回事?? PURB urb = dx->PollingUrb; PIRP Irp = dx->PollingIrp; PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp); UsbBuildInterruptOrBulkTransferRequest(urb, sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER), dx->UsbInterruptPipeHandle, dx->interruptbits, NULL, 16, USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK, NULL); IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnInterrupt, dx, TRUE, TRUE, TRUE); stack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; stack->Parameters.Others.Argument1 = urb; PKEVENT event=&(dx->evInterruptEvent); NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp); |
|
沙发#
发布于:2002-05-27 20:50
在完成程序中
NTSTATUS OnInterrupt(PDEVICE_OBJECT junk, PIRP Irp, PUSBKBD_DEVICE_EXTENSION pdx) { // OnInterrupt KeSetEvent(&pdx->evInterruptEvent, 0, FALSE); KIRQL oldirql; KeAcquireSpinLock(&pdx->polllock, &oldirql); pdx->pollpending = FALSE; // allow another poll to be started KeReleaseSpinLock(&pdx->polllock, oldirql); ... 在这里使用softice查看我在device->extension里设立的一个缓冲区,没有变化,应该是没有读出数据? |
|