Помогите, пожалуйста, найти ошибку в USB драйвере
От: TailWind  
Дата: 21.05.21 20:14
Оценка:
Если отключить устройство до вызова ReadFile, то ReadFile зависает (это bug)

Если отключить во время ReadFile, то вываливается с ошибкой (это правильно)

Помогите, пожалуйста, понять почему так

И если исправим, подпишите мне новый драйвер (за плату)


NTSTATUS CallUSB (IN PDEVICE_OBJECT fdo, IN PURB urb)
{
  PDEVICE_EXTENSION  PDE         = fdo -> DeviceExtension;  
  KEVENT event;
  PIRP   irp;
  IO_STATUS_BLOCK ioStatus;
  PIO_STACK_LOCATION nextStack;  
  //
  KeInitializeEvent(&event, NotificationEvent, FALSE);
  irp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, PDE->StackDeviceObject, NULL, 0,NULL, 0, TRUE, &event, &ioStatus);
  nextStack = IoGetNextIrpStackLocation(irp);
  nextStack->Parameters.Others.Argument1 = urb;
  IoCallDriver(PDE->StackDeviceObject, irp);  
  KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL);
  if (NT_SUCCESS(ioStatus.Status))
  if (!(USBD_SUCCESS(urb->UrbHeader.Status))) ioStatus.Status = STATUS_UNSUCCESSFUL;    
  //
  return ioStatus.Status;
}

NTSTATUS Driver_Read(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{                
  PDEVICE_EXTENSION  PDE         = fdo -> DeviceExtension;
  PIO_STACK_LOCATION IrpStack    = IoGetCurrentIrpStackLocation(Irp);  
  PURB               urb         = NULL;
  PCHAR              buf         = Irp->AssociatedIrp.SystemBuffer;
  NTSTATUS           status      = STATUS_SUCCESS;
  ULONG              Readed;
  //  
  urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
    DbgPrint("Driver_Read %d", IrpStack->Parameters.DeviceIoControl.OutputBufferLength);
  UsbBuildInterruptOrBulkTransferRequest(urb, (USHORT) sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), PDE->PipeHandle_1, buf, NULL, IrpStack->Parameters.DeviceIoControl.OutputBufferLength, USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK, NULL);
  status = CallUSB(fdo, urb);
  //
  Readed = urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
  DbgPrint("  Readed %d", Readed);
  //
  ExFreePool(urb);
  //    
  return CompleteIrp(Irp, status, Readed/*IrpStack->Parameters.DeviceIoControl.OutputBufferLength*/);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.