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"));
437 FreeBT_DispatchWrite_Exit:
438 Irp->IoStatus.Status = ntStatus;
439 Irp->IoStatus.Information = 0;
struct _FREEBT_RW_CONTEXT * PFREEBT_RW_CONTEXT
#define STATUS_INSUFFICIENT_RESOURCES
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define FBT_HCI_DATA_MIN_SIZE
#define MmGetMdlVirtualAddress(_Mdl)
LONG NTAPI FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI FreeBT_ResetDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define STATUS_BUFFER_TOO_SMALL
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define STATUS_INVALID_DEVICE_STATE
VOID NTAPI IoBuildPartialMdl(IN PMDL SourceMdl, IN PMDL TargetMdl, IN PVOID VirtualAddress, IN ULONG Length)
_In_ PDEVICE_OBJECT DeviceObject
#define USBD_TRANSFER_DIRECTION_OUT
NTSTATUS NTAPI FreeBT_WriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define FreeBT_DbgPrint(level, _x_)
#define IoCompleteRequest
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_BUFFER_SIZE
#define FBT_HCI_DATA_MAX_SIZE
NTSTATUS NTAPI FreeBT_ResetPipe(IN PDEVICE_OBJECT DeviceObject, IN USBD_PIPE_HANDLE PipeHandle)
#define NT_SUCCESS(StatCode)
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define ExAllocatePool(type, size)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define USBD_SHORT_TRANSFER_OK
#define MmGetMdlByteCount(_Mdl)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define UsbBuildInterruptOrBulkTransferRequest(urb, length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link)
struct _BEEP_DEVICE_EXTENSION * PDEVICE_EXTENSION