dogLee
驱动牛犊
驱动牛犊
  • 注册日期2001-11-19
  • 最后登录2002-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1155回复:1

来看一下这个问题

楼主#
更多 发布于:2002-05-27 20:44
我读一个中断管道,设立了一个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);

dogLee
驱动牛犊
驱动牛犊
  • 注册日期2001-11-19
  • 最后登录2002-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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里设立的一个缓冲区,没有变化,应该是没有读出数据?
游客

返回顶部