48 if (deviceExtension->DeviceState !=
Working)
50 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: Invalid device state\n"));
52 goto FreeBT_DispatchRead_Exit;
57 if (deviceExtension->SSEnable)
59 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchRead: Waiting on the IdleReqPendEvent\n"));
69 if (rwContext ==
NULL)
71 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for rwContext\n"));
73 goto FreeBT_DispatchRead_Exit;
83 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: Transfer data length = %d\n", totalLength));
88 goto FreeBT_DispatchRead_Exit;
93 if (totalLength > deviceExtension->DataInPipe.MaximumPacketSize)
95 stageLength = deviceExtension->DataInPipe.MaximumPacketSize;
101 stageLength = totalLength;
108 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for mdl\n"));
111 goto FreeBT_DispatchRead_Exit;
120 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for urb\n"));
124 goto FreeBT_DispatchRead_Exit;
131 deviceExtension->DataInPipe.PipeHandle,
139 rwContext->
Urb = urb;
141 rwContext->
Length = totalLength - stageLength;
163 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: IoCallDriver fails with status %X\n", ntStatus));
174 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchRead: FreeBT_ResetPipe failed\n"));
183 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchRead: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
192 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchRead: URB sent to lower driver, IRP is pending\n"));
197FreeBT_DispatchRead_Exit:
198 Irp->IoStatus.Status = ntStatus;
199 Irp->IoStatus.Information = 0;
217 ntStatus =
Irp->IoStatus.Status;
230 Irp->IoStatus.Information = 0;
231 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_ReadCompletion: - failed with status = %X\n", ntStatus));
278 if (deviceExtension->DeviceState !=
Working)
280 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: Invalid device state\n"));
282 goto FreeBT_DispatchWrite_Exit;
287 if (deviceExtension->SSEnable)
289 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_WriteDispatch: Waiting on the IdleReqPendEvent\n"));
299 if (rwContext ==
NULL)
303 goto FreeBT_DispatchWrite_Exit;
313 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: Transfer data length = %d\n", totalLength));
319 goto FreeBT_DispatchWrite_Exit;
325 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: Zero length buffer, completing IRP\n"));
328 goto FreeBT_DispatchWrite_Exit;
333 if (totalLength > deviceExtension->DataOutPipe.MaximumPacketSize)
335 stageLength = deviceExtension->DataOutPipe.MaximumPacketSize;
341 stageLength = totalLength;
348 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: Failed to alloc mem for mdl\n"));
351 goto FreeBT_DispatchWrite_Exit;
360 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: Failed to alloc mem for urb\n"));
364 goto FreeBT_DispatchWrite_Exit;
371 deviceExtension->DataOutPipe.PipeHandle,
379 rwContext->
Urb = urb;
381 rwContext->
Length = totalLength - stageLength;
403 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_WriteDispatch: IoCallDriver fails with status %X\n", ntStatus));
423 FreeBT_DbgPrint(3, (
"FBTUSB: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
432 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchWrite: URB sent to lower driver, IRP is pending\n"));
437FreeBT_DispatchWrite_Exit:
438 Irp->IoStatus.Status = ntStatus;
439 Irp->IoStatus.Information = 0;
457 ntStatus =
Irp->IoStatus.Status;
470 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_WriteCompletion: Initiating next transfer\n"));
471 if (rwContext->
Length > deviceExtension->DataOutPipe.MaximumPacketSize)
473 stageLength = deviceExtension->DataOutPipe.MaximumPacketSize;
479 stageLength = rwContext->
Length;
488 rwContext->
Length -= stageLength;
511 FreeBT_DbgPrint(1, (
"FBTUSB: FreeNT_WriteCompletion: Write completed, %d bytes written\n",
Irp->IoStatus.Information));
512 Irp->IoStatus.Information = rwContext->
Numxfer;
522 FreeBT_DbgPrint(1, (
"FBTUSB: FreeNT_WriteCompletion - failed with status = %X\n", ntStatus));
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define NT_SUCCESS(StatCode)
struct _BEEP_DEVICE_EXTENSION * PDEVICE_EXTENSION
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define FBT_HCI_DATA_MIN_SIZE
#define FBT_HCI_DATA_MAX_SIZE
NTSTATUS NTAPI FreeBT_ResetPipe(IN PDEVICE_OBJECT DeviceObject, IN USBD_PIPE_HANDLE PipeHandle)
NTSTATUS NTAPI FreeBT_ResetDevice(IN PDEVICE_OBJECT DeviceObject)
LONG NTAPI FreeBT_IoDecrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
LONG NTAPI FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI FreeBT_WriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
NTSTATUS NTAPI FreeBT_DispatchWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI FreeBT_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
NTSTATUS NTAPI FreeBT_DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
struct _FREEBT_RW_CONTEXT * PFREEBT_RW_CONTEXT
#define FreeBT_DbgPrint(level, _x_)
#define ExAllocatePool(type, size)
VOID NTAPI IoBuildPartialMdl(IN PMDL SourceMdl, IN PMDL TargetMdl, IN PVOID VirtualAddress, IN ULONG Length)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define UNREFERENCED_PARAMETER(P)
#define IoCompleteRequest
#define STATUS_INVALID_BUFFER_SIZE
#define STATUS_MORE_PROCESSING_REQUIRED
#define STATUS_BUFFER_TOO_SMALL
struct _IO_STACK_LOCATION::@4024::@4063 Others
struct _IO_STACK_LOCATION::@1584::@1585 DeviceIoControl
union _IO_STACK_LOCATION::@1584 Parameters
struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
#define USBD_TRANSFER_DIRECTION_IN
#define USBD_SHORT_TRANSFER_OK
#define USBD_TRANSFER_DIRECTION_OUT
#define UsbBuildInterruptOrBulkTransferRequest(urb, length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link)
#define IOCTL_INTERNAL_USB_SUBMIT_URB
_In_ PDEVICE_OBJECT DeviceObject
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define MmGetMdlByteCount(_Mdl)
#define MmGetMdlVirtualAddress(_Mdl)