От:
Rusas
Дата: 02.04.06 20:39
Оценка:
Здравствуйте, проблема заключается в следующем:
При попытке чтения данных с устройства драйвер уходит в бесконечное ожидание события в функции DoCallUSBD.
При просмотре URB-пакетов через USB Monitor видно, что URB-пакет на чтение не посылается.
NTSTATUS DoCallUSBD(IN PDEVICE_OBJECT fdo, IN PURB Urb)
{
NTSTATUS ntStatus,status=STATUS_SUCCESS;
PDEVICE_EXTENSION pdx;
PIRP irp;
KEVENT event;
IO_STATUS_BLOCK ioStatus;
PIO_STACK_LOCATION nextStack;
pdx=fdo->DeviceExtension;
KeInitializeEvent(&event,NotificationEvent,0);
irp=IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->StackDeviceObject,NULL,0,NULL,0,1,&event,&ioStatus);
nextStack=IoGetNextIrpStackLocation(irp);
nextStack->Parameters.Others.Argument1=Urb;
ntStatus=IoCallDriver(pdx->StackDeviceObject,irp);
if (ntStatus==STATUS_PENDING)
{
DbgPrint(" STATUS_PENDING");
status=KeWaitForSingleObject(&event,Suspended,KernelMode,0,NULL);
}else
{
ioStatus.Status=ntStatus;
}
if (NT_SUCCESS(ntStatus))
{
if (!(USBD_SUCCESS(Urb->UrbHeader.Status)))
ntStatus=STATUS_UNSUCCESSFUL;
}
return ntStatus;
}
NTSTATUS OnDeviceRead(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
NTSTATUS ntStatus,status=STATUS_SUCCESS;
PDEVICE_EXTENSION pdx;
PIO_STACK_LOCATION pNextStack;
PURB urb;
ULONG urbSize=0;
ULONG transferFlags=0;
pdx=fdo->DeviceExtension;
pNextStack=IoGetNextIrpStackLocation(Irp);
urbSize=sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
urb=ExAllocatePool(NonPagedPool,urbSize);
transferFlags=USBD_SHORT_TRANSFER_OK|USBD_TRANSFER_DIRECTION_IN;
UsbBuildInterruptOrBulkTransferRequest(urb,(USHORT)urbSize,pdx->ReadFromDevicePipeHandle,
NULL,Irp->MdlAddress,MmGetMdlByteCount(Irp->MdlAddress),transferFlags,NULL);
ntStatus=DoCallUSBD(fdo,urb);
if (NT_SUCCESS(ntStatus))
{
Irp->IoStatus.Information=urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
}
ExFreePool(urb);
return ntStatus;
}
В чем может быть проблема?
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить