USB-драйвер,чтение.
От: 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;
}

В чем может быть проблема?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.