ReactOS  0.4.15-dev-3017-g1d9542d
FxUsbPipe Class Reference

#include <fxusbpipe.hpp>

Inheritance diagram for FxUsbPipe:
Collaboration diagram for FxUsbPipe:

Public Member Functions

 FxUsbPipe (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxUsbDevice *UsbDevice)
 
VOID InitPipe (__in PUSBD_PIPE_INFORMATION PipeInfo, __in UCHAR InterfaceNumber, __in FxUsbInterface *UsbInterface)
 
VOID InitPipe (__in PWINUSB_PIPE_INFORMATION PipeInfo, __in UCHAR InterfaceNumber, __in FxUsbInterface *UsbInterface)
 
virtual _Must_inspect_result_ NTSTATUS GotoStartState (__in PLIST_ENTRY RequestListHead, __in BOOLEAN Lock=TRUE)
 
virtual VOID GotoStopState (__in WDF_IO_TARGET_SENT_IO_ACTION Action, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
 
VOID GotoPurgeState (__in WDF_IO_TARGET_PURGE_IO_ACTION Action, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
 
virtual VOID GotoRemoveState (__in WDF_IO_TARGET_STATE NewState, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __in BOOLEAN Lock, __out PBOOLEAN Wait)
 
virtual VOID WaitForSentIoToComplete (VOID)
 
__inline VOID SetNoCheckPacketSize (VOID)
 
VOID GetInformation (__out PWDF_USB_PIPE_INFORMATION PipeInformation)
 
BOOLEAN IsType (__in WDF_USB_PIPE_TYPE Type)
 
WDF_USB_PIPE_TYPE GetType (VOID)
 
WDFUSBPIPE GetHandle (VOID)
 
__inline BOOLEAN IsInEndpoint (VOID)
 
__inline BOOLEAN IsOutEndpoint (VOID)
 
_Must_inspect_result_ NTSTATUS InitContinuousReader (__in PWDF_USB_CONTINUOUS_READER_CONFIG Config, __in size_t TotalBufferLength)
 
ULONG GetMaxPacketSize (VOID)
 
_Must_inspect_result_ NTSTATUS ValidateTransferLength (__in size_t Length)
 
_Must_inspect_result_ NTSTATUS FormatTransferRequest (__in FxRequestBase *Request, __in FxRequestBuffer *Buffer, __in ULONG TransferFlags=0)
 
_Must_inspect_result_ NTSTATUS FormatAbortRequest (__in FxRequestBase *Request)
 
_Must_inspect_result_ NTSTATUS FormatResetRequest (__in FxRequestBase *Request)
 
USBD_PIPE_HANDLE WdmGetPipeHandle (VOID)
 
NTSTATUS Reset (VOID)
 
USBD_HANDLE GetUSBDHandle (VOID)
 
FX_URB_TYPE GetUrbType (VOID)
 
- Public Member Functions inherited from FxIoTarget
 FxIoTarget (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize)
 
 FxIoTarget (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize, __in WDFTYPE WdfType)
 
virtual _Must_inspect_result_ NTSTATUS Start (VOID)
 
virtual VOID Stop (__in WDF_IO_TARGET_SENT_IO_ACTION Action)
 
virtual VOID Purge (__in WDF_IO_TARGET_PURGE_IO_ACTION Action)
 
virtual VOID Remove (VOID)
 
NTSTATUS _Must_inspect_result_ QueryInterface (__inout FxQueryInterfaceParams *Params)
 
__inline WDF_IO_TARGET_STATE GetState (VOID)
 
__inline MdDeviceObject GetTargetDevice (VOID)
 
__inline MdDeviceObject GetTargetPDO (VOID)
 
__inline MdFileObject GetTargetFileObject (VOID)
 
__inline WDFDEVICE GetDeviceHandle (VOID)
 
WDFIOTARGET GetHandle (VOID)
 
__inline FxDriverGetDriver (VOID)
 
virtual _Must_inspect_result_ MdDeviceObject GetTargetDeviceObject (_In_ CfxDeviceBase *Device)
 
_Must_inspect_result_ NTSTATUS Init (__in CfxDeviceBase *Device)
 
ULONG Submit (__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in_opt ULONG Flags)
 
 FX_DECLARE_VF_FUNCTION_P1 (NTSTATUS, VerifySubmitLocked, _In_ FxRequestBase *)
 
ULONG SubmitLocked (__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in ULONG Flags)
 
_Must_inspect_result_ NTSTATUS SubmitSync (__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options=NULL, __out_opt PULONG Action=NULL)
 
VOID TimerCallback (__in FxRequestBase *Request)
 
VOID CompleteCanceledRequest (__in FxRequestBase *Request)
 
VOID SubmitPendedRequest (__in FxRequestBase *Request)
 
VOID CompletePendedRequest (__in FxRequestBase *Request)
 
BOOLEAN __inline HasEnoughStackLocations (__in FxIrp *Irp)
 
_Must_inspect_result_ NTSTATUS FormatIoRequest (__inout FxRequestBase *Request, __in UCHAR MajorCode, __in FxRequestBuffer *IoBuffer, __in_opt PLONGLONG StartingOffset, __in_opt FxFileObject *FileObject=NULL)
 
_Must_inspect_result_ NTSTATUS FormatIoctlRequest (__in FxRequestBase *Request, __in ULONG Ioctl, __in BOOLEAN Internal, __in FxRequestBuffer *InputBuffer, __in FxRequestBuffer *OutputBuffer, __in_opt FxFileObject *FileObject=NULL)
 
_Must_inspect_result_ NTSTATUS FormatInternalIoctlOthersRequest (__in FxRequestBase *Request, __in ULONG Ioctl, __in FxRequestBuffer *Buffers)
 
VOID CancelSentIo (VOID)
 
_Must_inspect_result_ NTSTATUS SubmitSyncRequestIgnoreTargetState (__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS RequestOptions)
 
VOID UpdateTargetIoType (VOID)
 
BOOLEAN HasValidStackSize (VOID)
 
virtual VOID Send (_In_ MdIrp Irp)
 
- Public Member Functions inherited from FxNonPagedObject
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
virtual ~FxNonPagedObject (VOID)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_maxIRQL(DISPATCH_LEVEL) __drv_setsIRQL(DISPATCH_LEVEL) VOID Lock(__out __drv_deref(__drv_savesIRQL) PKIRQL PreviousIrql)
 
 _Releases_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID Unlock(__in __drv_restoresIRQL KIRQL PreviousIrql)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) VOID LockAtDispatch(VOID)
 
 _Requires_lock_held_ (this->m_NPLock.m_Lock) _Releases_lock_(this -> m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID UnlockFromDispatch(VOID)
 
- Public Member Functions inherited from FxObject
PVOID GetCOMWrapper ()
 
void SetCOMWrapper (__drv_aliasesMem PVOID Wrapper)
 
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
virtual ~FxObject (VOID)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType Type)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __in USHORT ExtraSize=0)
 
VOID operator delete (__in PVOID Memory)
 
VOID SetNoContextHeader (VOID)
 
PVOID __inline GetObjectHandle (VOID)
 
__inline FxContextHeaderGetContextHeader (VOID)
 
__inline PFX_DRIVER_GLOBALS GetDriverGlobals (VOID)
 
WDFTYPE GetType (VOID)
 
USHORT GetObjectSize (VOID)
 
LONG GetRefCnt (VOID)
 
FxTagTrackerGetTagTracker (VOID)
 
CfxDeviceGetDevice (VOID)
 
CfxDeviceBaseGetDeviceBase (VOID)
 
VOID SetDeviceBase (__in CfxDeviceBase *DeviceBase)
 
__inline VOID CallCleanup (VOID)
 
ULONG __inline AddRef (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG Release (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG AddRefOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG ReleaseOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual _Must_inspect_result_ NTSTATUS QueryInterface (__in FxQueryInterfaceParams *Params)
 
VOID MarkTraceState (VOID)
 
BOOLEAN __inline IsTraceState (VOID)
 
VOID __inline TraceDroppedEvent (__in FxObjectDroppedEvent Event)
 
VOID MarkPassiveDispose (__in FxObjectLockState State=ObjectLock)
 
VOID MarkPassiveCallbacks (__in FxObjectLockState State=ObjectLock)
 
VOID MarkForceDisposeThread (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsPassiveCallbacks (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsPassiveDispose (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsForceDisposeThread (__in BOOLEAN AcquireLock=TRUE)
 
VOID MarkCommitted (VOID)
 
BOOLEAN IsCommitted (VOID)
 
VOID MarkDisposeOverride (__in FxObjectLockState State=ObjectLock)
 
VOID MarkNoDeleteDDI (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsNoDeleteDDI (VOID)
 
_Must_inspect_result_ NTSTATUS Commit (__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
 
VOID DeleteFromFailedCreate (VOID)
 
VOID ClearEvtCallbacks (VOID)
 
BOOLEAN EarlyDispose (VOID)
 
virtual VOID DeleteObject (VOID)
 
_Must_inspect_result_ NTSTATUS AssignParentObject (__in FxObject *ParentObject)
 
_Must_inspect_result_ NTSTATUS AddContext (__in FxContextHeader *Header, __in PVOID *Context, __in PWDF_OBJECT_ATTRIBUTES Attributes)
 
_Must_inspect_result_ NTSTATUS RemoveParentAssignment (VOID)
 
_Must_inspect_result_ FxObjectGetParentObjectReferenced (__in PVOID Tag)
 
BOOLEAN IsDisposed (VOID)
 

Static Public Member Functions

static _Must_inspect_result_ NTSTATUS _FormatTransfer (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in WDFUSBPIPE Pipe, __in WDFREQUEST Request, __in_opt WDFMEMORY TransferMemory, __in_opt PWDFMEMORY_OFFSET TransferOffsets, __in ULONG Flags)
 
static _Must_inspect_result_ NTSTATUS _SendTransfer (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in WDFUSBPIPE Pipe, __in_opt WDFREQUEST Request, __in_opt PWDF_REQUEST_SEND_OPTIONS RequestOptions, __in_opt PWDF_MEMORY_DESCRIPTOR MemoryDescriptor, __out_opt PULONG BytesTransferred, __in ULONG Flags)
 
static WDF_USB_PIPE_TYPE _UsbdPipeTypeToWdf (__in USBD_PIPE_TYPE UsbdPipeType)
 
- Static Public Member Functions inherited from FxIoTarget
static VOID _CancelSentRequest (__in FxRequestBase *Request)
 
static FxIoTarget_FromEntry (__in FxTransactionedEntry *Entry)
 
- Static Public Member Functions inherited from FxObject
static FxObject_FromDisposeEntry (__in PSINGLE_LIST_ENTRY Entry)
 
static FxObject_GetObjectFromHandle (__in WDFOBJECT Handle, __inout PWDFOBJECT_OFFSET ObjectOffset)
 
static PVOID __inline _ToHandle (__in FxObject *Object)
 
static VOID __inline _ReferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static VOID __inline _DereferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static PVOID _GetDebugBase (__in FxObject *Object)
 
static PFX_POOL_HEADER _CleanupPointer (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObject *Object)
 
static _Must_inspect_result_ NTSTATUS _GetEffectiveLock (__in FxObject *Object, __in_opt IFxHasCallbacks *Callbacks, __in BOOLEAN AutomaticLocking, __in BOOLEAN PassiveCallbacks, __out FxCallbackLock **CallbackLock, __out_opt FxObject **CallbackLockObject)
 
static _Must_inspect_result_ NTSTATUS _ObjectQuery (_In_ FxObject *Object, _In_ CONST GUID *Guid, _In_ ULONG QueryBufferLength, _Out_writes_bytes_(QueryBufferLength) PVOID QueryBuffer)
 

Public Attributes

friend FxUsbDevice
 
friend FxUsbInterface
 
friend FxUsbPipeContinuousReader
 
LIST_ENTRY m_ListEntry
 
- Public Attributes inherited from FxIoTarget
FxTransactionedEntry m_TransactionedEntry
 
BOOLEAN m_InStack
 
BOOLEAN m_AddedToDeviceList
 

Protected Member Functions

 ~FxUsbPipe ()
 
virtual BOOLEAN Dispose (VOID)
 
- Protected Member Functions inherited from FxIoTarget
 ~FxIoTarget ()
 
_Must_inspect_result_ NTSTATUS InitModeSpecific (__in CfxDeviceBase *Device)
 
VOID FailPendedRequest (__in FxRequestBase *Request, __in NTSTATUS Status)
 
VOID DrainPendedRequestsLocked (__in PLIST_ENTRY RequestListHead, __in BOOLEAN RequestWillBeResent)
 
VOID CompletePendedRequestList (__in PLIST_ENTRY RequestListHead)
 
VOID SubmitPendedRequests (__in PLIST_ENTRY RequestListHeadHead)
 
VOID GetSentRequestsListLocked (__in PSINGLE_LIST_ENTRY RequestListHead, __in PLIST_ENTRY SendList, __out PBOOLEAN AddedToList)
 
_Must_inspect_result_ NTSTATUS PendRequestLocked (__in FxRequestBase *Request)
 
__inline VOID CompleteRequest (__in FxRequestBase *Request)
 
VOID HandleFailedResubmit (__in FxRequestBase *Request)
 
VOID RequestCompletionRoutine (__in FxRequestBase *Request)
 
BOOLEAN RemoveCompletedRequestLocked (__in FxRequestBase *Request)
 
virtual VOID ClearTargetPointers (VOID)
 
UCHAR GetTargetIoType (VOID)
 
virtual VOID WaitForDisposeEvent (VOID)
 
virtual VOID Forward (__in MdIrp Irp)
 
__inline VOID CopyFileObjectAndFlags (__in FxRequestBase *Request)
 
__inline VOID IncrementIoCount (VOID)
 
__inline VOID DecrementIoCount (VOID)
 
VOID PrintDisposeMessage (VOID)
 
- Protected Member Functions inherited from FxObject
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
FxObjectDebugExtensionGetDebugExtension (VOID)
 
BOOLEAN IsDebug (VOID)
 
VOID AllocateTagTracker (__in WDFTYPE Type)
 
virtual VOID SelfDestruct (VOID)
 
PVOID __inline GetObjectHandleUnchecked (VOID)
 
VOID __inline DestroyChildren (VOID)
 
VOID DeleteEarlyDisposedObject (VOID)
 

Protected Attributes

FxUsbDevicem_UsbDevice
 
FxUsbInterfacem_UsbInterface
 
FxUsbPipeContinuousReaderm_Reader
 
USBD_PIPE_INFORMATION m_PipeInformation
 
WINUSB_PIPE_INFORMATION m_PipeInformationUm
 
UCHAR m_InterfaceNumber
 
BOOLEAN m_CheckPacketSize
 
USBD_HANDLE m_USBDHandle
 
FX_URB_TYPE m_UrbType
 
- Protected Attributes inherited from FxIoTarget
LIST_ENTRY m_SentIoListHead
 
LIST_ENTRY m_IgnoredIoListHead
 
FxCREvent m_SentIoEvent
 
FxCREventm_DisposeEvent
 
FxCREvent m_DisposeEventUm
 
FxIrpQueue m_PendedQueue
 
FxDriverm_Driver
 
MdDeviceObject m_InStackDevice
 
MdDeviceObject m_TargetDevice
 
MdDeviceObject m_TargetPdo
 
MdFileObject m_TargetFileObject
 
WDF_IO_TARGET_STATE m_State
 
LONG m_IoCount
 
CCHAR m_TargetStackSize
 
UCHAR m_TargetIoType
 
BOOLEAN m_WaitingForSentIo
 
BOOLEAN m_Removing
 
- Protected Attributes inherited from FxObject
union {
   CfxDeviceBase *   m_DeviceBase
 
   CfxDevice *   m_Device
 
}; 
 

Additional Inherited Members

- Static Public Attributes inherited from FxIoTarget
static const PVOID m_SentRequestTag = (PVOID) 'lcnC'
 
- Static Protected Member Functions inherited from FxIoTarget
static VOID _CancelSentRequests (__in PSINGLE_LIST_ENTRY RequestListHead)
 
static VOID _RequestCancelled (__in FxIrpQueue *Queue, __in MdIrp Irp, __in PMdIoCsqIrpContext pCsqContext, __in KIRQL CallerIrql)
 
- Static Protected Member Functions inherited from FxObject
static PVOID _GetBase (__in FxObject *Object)
 
- Static Protected Attributes inherited from FxIoTarget
static MdCompletionRoutineType _RequestCompletionRoutine
 
static EVT_WDF_REQUEST_COMPLETION_ROUTINE _SyncCompletionRoutine
 

Detailed Description

Definition at line 409 of file fxusbpipe.hpp.

Constructor & Destructor Documentation

◆ FxUsbPipe()

FxUsbPipe::FxUsbPipe ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in FxUsbDevice UsbDevice 
)

Definition at line 1050 of file fxusbpipe.cpp.

1053  :
1054  FxIoTarget(FxDriverGlobals, sizeof(FxUsbPipe), FX_TYPE_IO_TARGET_USB_PIPE),
1056 {
1059 #if (FX_CORE_MODE == FX_CORE_USER_MODE)
1061 #endif
1062  m_InterfaceNumber = 0;
1063  m_Reader = NULL;
1064  m_UsbInterface = NULL;
1066  m_USBDHandle = UsbDevice->m_USBDHandle;
1067  m_UrbType = UsbDevice->m_UrbType;
1068 
1070 }
#define TRUE
Definition: types.h:120
FxUsbDevice * m_UsbDevice
Definition: fxusbpipe.hpp:698
FX_URB_TYPE m_UrbType
Definition: fxusbpipe.hpp:743
FxIoTarget(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize)
Definition: fxiotarget.cpp:34
_Must_inspect_result_ _In_ WDFDEVICE _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFUSBDEVICE * UsbDevice
Definition: wdfusb.h:901
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
VOID MarkNoDeleteDDI(__in FxObjectLockState State=ObjectLock)
Definition: fxobject.hpp:1118
LIST_ENTRY m_ListEntry
Definition: fxusbpipe.hpp:687
USBD_HANDLE m_USBDHandle
Definition: fxusbpipe.hpp:737
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define NULL
Definition: types.h:112
UCHAR m_InterfaceNumber
Definition: fxusbpipe.hpp:726
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
BOOLEAN m_CheckPacketSize
Definition: fxusbpipe.hpp:732

◆ ~FxUsbPipe()

FxUsbPipe::~FxUsbPipe ( )
protected

Definition at line 1091 of file fxusbpipe.cpp.

1092 {
1093  if (m_UsbInterface != NULL) {
1095  m_UsbInterface->RELEASE(this);
1096  }
1097 
1099 }
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define ASSERT(a)
Definition: mode.c:44
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
LIST_ENTRY m_ListEntry
Definition: fxusbpipe.hpp:687
VOID RemoveDeletedPipe(__in FxUsbPipe *Pipe)
#define NULL
Definition: types.h:112

Member Function Documentation

◆ _FormatTransfer()

return FxUsbPipe::_FormatTransfer ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in WDFUSBPIPE  Pipe,
__in WDFREQUEST  Request,
__in_opt WDFMEMORY  TransferMemory,
__in_opt PWDFMEMORY_OFFSET  TransferOffsets,
__in ULONG  Flags 
)
static

Definition at line 1536 of file fxusbpipe.cpp.

1544 {
1546  IFxMemory* pMemory;
1549  NTSTATUS status;
1550 
1551  FxObjectHandleGetPtrAndGlobals(FxDriverGlobals,
1552  Pipe,
1554  (PVOID*) &pUsbPipe,
1555  &FxDriverGlobals);
1556 
1557  FxObjectHandleGetPtr(FxDriverGlobals,
1558  Request,
1560  (PVOID*) &pRequest);
1561 
1562  //
1563  // We allow zero length transfers (which are indicated by TransferMemory == NULL)
1564  //
1565  if (TransferMemory != NULL) {
1566  FxObjectHandleGetPtr(FxDriverGlobals,
1569  (PVOID*) &pMemory);
1570 
1571  status = pMemory->ValidateMemoryOffsets(TransferOffsets);
1572  if (!NT_SUCCESS(status)) {
1573  goto Done;
1574  }
1575 
1576  buf.SetMemory(pMemory, TransferOffsets);
1577  }
1578  else {
1579  pMemory = NULL;
1580  }
1581 
1583 
1584  if (NT_SUCCESS(status)) {
1585  FxUsbPipeTransferContext* pContext;
1586 
1587  pContext = (FxUsbPipeTransferContext*) pRequest->GetContext();
1588 
1589  //
1590  // By assuming the fields are at the same offset, we can use simpler
1591  // logic (w/out comparisons for type) to set them.
1592  //
1593  WDFCASSERT(
1596  );
1597 
1598  WDFCASSERT(
1601  );
1602 
1604  pContext->m_UsbParameters.Parameters.PipeWrite.Length = buf.GetBufferLength();
1605 
1606  pContext->m_UsbParameters.Parameters.PipeWrite.Offset =
1607  (TransferOffsets != NULL) ? TransferOffsets->BufferOffset
1608  : 0;
1609  pContext->SetUsbType(
1612  );
1613  }
1614 
1615 Done:
1617  "WDFUSBPIPE %p, WDFREQUEST %p, WDFMEMORY %p, %!STATUS!",
1619 
1620  return status;
1621 }
_Must_inspect_result_ NTSTATUS FormatTransferRequest(__in FxRequestBase *Request, __in FxRequestBuffer *Buffer, __in ULONG TransferFlags=0)
_Must_inspect_result_ NTSTATUS ValidateMemoryOffsets(__in_opt PWDFMEMORY_OFFSET Offsets)
Definition: ifxmemory.hpp:105
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:863
WDFCASSERT(sizeof(WDF_DRIVER_CONFIG_V1_0)==sizeof(WDF_DRIVER_CONFIG_V1_1))
LONG NTSTATUS
Definition: precomp.h:26
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:160
FxRequest * pRequest
FxMemoryObject * pMemory
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Fdo, FX_TYPE_DEVICE,(PVOID *)&pFdo)
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_ WDFREQUEST _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ WDFMEMORY TransferMemory
Definition: wdfusb.h:1378
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define TRACE_LEVEL_VERBOSE
Definition: storswtr.h:30
VOID SetUsbType(__in WDF_USB_REQUEST_TYPE Type)
union _WDF_USB_REQUEST_COMPLETION_PARAMS::@3672 Parameters
struct _WDF_USB_REQUEST_COMPLETION_PARAMS::@3672::@3677 PipeRead
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741
WDF_USB_REQUEST_COMPLETION_PARAMS m_UsbParameters
FxUsbPipe * pUsbPipe
struct _WDF_USB_REQUEST_COMPLETION_PARAMS::@3672::@3676 PipeWrite
__inline FxRequestContext * GetContext(VOID)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Device, FX_TYPE_DEVICE,(PVOID *)&pDevice, &pFxDriverGlobals)
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
Definition: ps.c:97

Referenced by ValidateTransferLength().

◆ _SendTransfer()

return FxUsbPipe::_SendTransfer ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in WDFUSBPIPE  Pipe,
__in_opt WDFREQUEST  Request,
__in_opt PWDF_REQUEST_SEND_OPTIONS  RequestOptions,
__in_opt PWDF_MEMORY_DESCRIPTOR  MemoryDescriptor,
__out_opt PULONG  BytesTransferred,
__in ULONG  Flags 
)
static

Definition at line 1625 of file fxusbpipe.cpp.

1634 {
1637  NTSTATUS status;
1638 
1639  FxObjectHandleGetPtrAndGlobals(FxDriverGlobals,
1640  Pipe,
1642  (PVOID*) &pUsbPipe,
1643  &FxDriverGlobals);
1644 
1646 
1647  FxSyncRequest request(FxDriverGlobals, &context, Request);
1648 
1649  //
1650  // FxSyncRequest always succeesds for KM but can fail for UM.
1651  //
1652  status = request.Initialize();
1653  if (!NT_SUCCESS(status)) {
1655  "Failed to initialize FxSyncRequest");
1656  return status;
1657  }
1658 
1659  if (BytesTransferred != NULL) {
1660  *BytesTransferred = 0;
1661  }
1662 
1663  status = FxVerifierCheckIrqlLevel(FxDriverGlobals, PASSIVE_LEVEL);
1664  if (!NT_SUCCESS(status)) {
1665  return status;
1666  }
1667 
1668  status = FxValidateRequestOptions(FxDriverGlobals, RequestOptions);
1669  if (!NT_SUCCESS(status)) {
1670  return status;
1671  }
1672 
1673  //
1674  // We allow zero length writes (which are indicated by MemoryDescriptor == NULL)
1675  //
1676  if (MemoryDescriptor != NULL) {
1677  status = buf.ValidateMemoryDescriptor(FxDriverGlobals, MemoryDescriptor);
1678  if (!NT_SUCCESS(status)) {
1679  return status;
1680  }
1681  }
1682 
1683  status = pUsbPipe->FormatTransferRequest(request.m_TrueRequest, &buf, Flags);
1684 
1685  if (NT_SUCCESS(status)) {
1687  FxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGIOTARGET,
1688  "WDFUSBPIPE %p, WDFREQUEST %p being submitted",
1689  Pipe, request.m_TrueRequest->GetTraceObjectHandle());
1690 
1691  status = pUsbPipe->SubmitSync(request.m_TrueRequest, RequestOptions);
1692 
1693  //
1694  // Even on error we want to set this value. USBD should be clearing
1695  // it if the transfer fails.
1696  //
1697  if (BytesTransferred != NULL) {
1698  *BytesTransferred = context.GetUrbTransferLength();
1699  }
1700  }
1701 
1703  "WDFUSBPIPE %p, %!STATUS!", Pipe, status);
1704 
1705  return status;
1706 }
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ PWDF_MEMORY_DESCRIPTOR _Out_opt_ PULONG BytesTransferred
Definition: wdfusb.h:1331
_Must_inspect_result_ NTSTATUS FormatTransferRequest(__in FxRequestBase *Request, __in FxRequestBuffer *Buffer, __in ULONG TransferFlags=0)
Definition: http.c:7251
LONG NTSTATUS
Definition: precomp.h:26
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_Must_inspect_result_ NTSTATUS SubmitSync(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options=NULL, __out_opt PULONG Action=NULL)
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ PWDF_MEMORY_DESCRIPTOR MemoryDescriptor
Definition: wdfusb.h:1331
NTSTATUS __inline FxValidateRequestOptions(_In_ PFX_DRIVER_GLOBALS FxDriverGlobals, _In_ PWDF_REQUEST_SEND_OPTIONS Options, _In_opt_ FxRequestBase *Request=NULL)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
FxRequest * request
#define TRACE_LEVEL_VERBOSE
Definition: storswtr.h:30
__inline NTSTATUS FxVerifierCheckIrqlLevel(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in KIRQL Irql)
Definition: fxverifier.h:158
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
Definition: wdfdriver.h:113
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
FxUsbPipe * pUsbPipe
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
Definition: tftpd.h:85
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS RequestOptions
Definition: wdfiotarget.h:859
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Device, FX_TYPE_DEVICE,(PVOID *)&pDevice, &pFxDriverGlobals)
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
Definition: ps.c:97

Referenced by ValidateTransferLength().

◆ _UsbdPipeTypeToWdf()

static WDF_USB_PIPE_TYPE FxUsbPipe::_UsbdPipeTypeToWdf ( __in USBD_PIPE_TYPE  UsbdPipeType)
inlinestatic

Definition at line 643 of file fxusbpipe.hpp.

646  {
647  const static WDF_USB_PIPE_TYPE types[] = {
648  WdfUsbPipeTypeControl, // UsbdPipeTypeControl
649  WdfUsbPipeTypeIsochronous, // UsbdPipeTypeIsochronous
650  WdfUsbPipeTypeBulk, // UsbdPipeTypeBulk
651  WdfUsbPipeTypeInterrupt, // UsbdPipeTypeInterrupt
652  };
653 
654  if (UsbdPipeType < sizeof(types)/sizeof(types[0])) {
655  return types[UsbdPipeType];
656  }
657  else {
658  return WdfUsbPipeTypeInvalid;
659  }
660  }
Definition: cmds.c:130
enum _WDF_USB_PIPE_TYPE WDF_USB_PIPE_TYPE

Referenced by FxUsbInterface::CopyEndpointFieldsFromDescriptor(), GetInformation(), GetType(), and IsType().

◆ Dispose()

BOOLEAN FxUsbPipe::Dispose ( VOID  )
protectedvirtual

Reimplemented from FxIoTarget.

Definition at line 1102 of file fxusbpipe.cpp.

1103 {
1104  BOOLEAN callCleanup;
1105 
1106  //
1107  // Call base class: callbacks, terminates I/Os, etc.
1108  //
1109  callCleanup = FxIoTarget::Dispose(); // __super call
1110 
1111  //
1112  // Don't need the reader anymore. The reader is deleted after calling the
1113  // parent class Dispose() to preserve the existing deletion order (it was
1114  // deleted in the Pipe's dtor() before this change).
1115  //
1116  if (m_Reader != NULL)
1117  {
1118  delete m_Reader;
1119 
1120  //
1121  // By doing this assignment we prevent misbehaved drivers
1122  // from crashing the system when they call WdfIoTargetStop from their
1123  // usb pipe's destroy callback.
1124  //
1125  m_Reader = NULL;
1126  }
1127 
1128  return callCleanup;
1129 }
virtual BOOLEAN Dispose(VOID)
Definition: fxiotarget.cpp:154
unsigned char BOOLEAN
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
#define NULL
Definition: types.h:112

◆ FormatAbortRequest()

_Must_inspect_result_ NTSTATUS FxUsbPipe::FormatAbortRequest ( __in FxRequestBase Request)

Definition at line 1710 of file fxusbpipe.cpp.

1713 {
1714  FxUsbPipeRequestContext* pContext;
1715  NTSTATUS status;
1716  FX_URB_TYPE urbType;
1717 
1718  status = Request->ValidateTarget(this);
1719  if (!NT_SUCCESS(status)) {
1721  "Pipe %p, Request %p, setting target failed, "
1722  "status %!STATUS!", this, Request, status);
1723 
1724  return status;
1725  }
1726 
1727  if (Request->HasContextType(FX_RCT_USB_PIPE_REQUEST)) {
1728  pContext = (FxUsbPipeRequestContext*) Request->GetContext();
1729  }
1730  else {
1731 
1733  pContext = new(GetDriverGlobals()) FxUsbPipeRequestContext(urbType);
1734  if (pContext == NULL) {
1736  }
1737 
1738 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
1739  if (urbType == FxUrbTypeUsbdAllocated) {
1740  status = pContext->AllocateUrb(m_USBDHandle);
1741  if (!NT_SUCCESS(status)) {
1742  delete pContext;
1743  return status;
1744  }
1745  //
1746  // Since the AllocateUrb routine calls USBD_xxxUrbAllocate APIs to allocate an Urb, it is
1747  // important to release those resorces before the devnode is removed. Those
1748  // resoruces are removed at the time Request is disposed.
1749  //
1750  Request->EnableContextDisposeNotification();
1751  }
1752 #endif
1753 
1754  Request->SetContext(pContext);
1755  }
1756 
1757 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
1761 
1762  if (pContext->m_Urb == &pContext->m_UrbLegacy) {
1763  urbType = FxUrbTypeLegacy;
1764  }
1765  else {
1766  urbType = FxUrbTypeUsbdAllocated;
1767  }
1768 
1769  FxFormatUsbRequest(Request, (PURB)pContext->m_Urb, urbType, m_USBDHandle);
1770 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
1773  m_PipeInformationUm.PipeId,
1776 #endif
1777 
1778  return STATUS_SUCCESS;
1779 }
WINUSB_INTERFACE_HANDLE m_WinUsbHandle
struct _UMURB_PIPE_REQUEST UmUrbPipeRequest
Definition: umusb.h:186
FX_URB_TYPE GetFxUrbTypeForRequest(__in FxRequestBase *Request)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
__checkReturn NTSTATUS AllocateUrb(__in USBD_HANDLE USBDHandle)
Definition: fxusbpipe.cpp:992
enum _FX_URB_TYPE FX_URB_TYPE
FxUsbDevice * m_UsbDevice
Definition: fxusbpipe.hpp:698
USBD_PIPE_HANDLE PipeHandle
Definition: usb.h:264
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID SetInfo(__in WDF_USB_REQUEST_TYPE Type, __in USBD_PIPE_HANDLE PipeHandle, __in USHORT Function)
Definition: fxusbpipe.cpp:1028
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
VOID FxUsbUmFormatRequest(__in FxRequestBase *Request, __in_xcount(Urb->Length) PUMURB_HEADER Urb, __in IWudfFile *HostFile, __in BOOLEAN Reuse)
Definition: usbutil.cpp:486
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
USBD_HANDLE m_USBDHandle
Definition: fxusbpipe.hpp:737
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
Definition: usb.h:529
#define URB_FUNCTION_ABORT_PIPE
Definition: usb.h:88
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
_URB_PIPE_REQUEST * m_Urb
Definition: fxusbpipe.hpp:175
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
_URB_PIPE_REQUEST m_UrbLegacy
Definition: fxusbpipe.hpp:170
IWudfFile * m_pHostTargetFile
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
#define UMURB_FUNCTION_ABORT_PIPE
Definition: umusb.h:10
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
VOID FxFormatUsbRequest(__in FxRequestBase *Request, __in PURB Urb, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
Definition: usbutil.cpp:29
Definition: ps.c:97

Referenced by ValidateTransferLength().

◆ FormatResetRequest()

_Must_inspect_result_ NTSTATUS FxUsbPipe::FormatResetRequest ( __in FxRequestBase Request)

Definition at line 1783 of file fxusbpipe.cpp.

1786 {
1787  FxUsbPipeRequestContext* pContext;
1788  NTSTATUS status;
1789  FX_URB_TYPE urbType;
1790 
1791  status = Request->ValidateTarget(this);
1792  if (!NT_SUCCESS(status)) {
1794  "Pipe %p, Request %p, setting target failed, "
1795  "status %!STATUS!", this, Request, status);
1796 
1797  return status;
1798  }
1799 
1800  if (Request->HasContextType(FX_RCT_USB_PIPE_REQUEST)) {
1801  pContext = (FxUsbPipeRequestContext*) Request->GetContext();
1802  }
1803  else {
1805  pContext = new(GetDriverGlobals()) FxUsbPipeRequestContext(urbType);
1806  if (pContext == NULL) {
1808  }
1809 
1810 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
1811  if (urbType == FxUrbTypeUsbdAllocated) {
1812  status = pContext->AllocateUrb(m_USBDHandle);
1813  if (!NT_SUCCESS(status)) {
1814  delete pContext;
1815  return status;
1816  }
1817  //
1818  // Since the AllocateUrb routine calls USBD_xxxUrbAllocate APIs to allocate an Urb, it is
1819  // important to release those resorces before the devnode is removed. Those
1820  // resoruces are removed at the time Request is disposed.
1821  //
1822  Request->EnableContextDisposeNotification();
1823  }
1824 #endif
1825 
1826  Request->SetContext(pContext);
1827  }
1828 
1829 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
1830  //
1831  // URB_FUNCTION_RESET_PIPE and URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
1832  // are the same value
1833  //
1837 
1838  if (pContext->m_Urb == &pContext->m_UrbLegacy) {
1839  urbType = FxUrbTypeLegacy;
1840  }
1841  else {
1842  urbType = FxUrbTypeUsbdAllocated;
1843  }
1844 
1845  FxFormatUsbRequest(Request, (PURB)pContext->m_Urb, urbType, m_USBDHandle);
1846 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
1849  m_PipeInformationUm.PipeId,
1852 #endif
1853 
1854  return STATUS_SUCCESS;
1855 }
WINUSB_INTERFACE_HANDLE m_WinUsbHandle
struct _UMURB_PIPE_REQUEST UmUrbPipeRequest
Definition: umusb.h:186
FX_URB_TYPE GetFxUrbTypeForRequest(__in FxRequestBase *Request)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
__checkReturn NTSTATUS AllocateUrb(__in USBD_HANDLE USBDHandle)
Definition: fxusbpipe.cpp:992
enum _FX_URB_TYPE FX_URB_TYPE
FxUsbDevice * m_UsbDevice
Definition: fxusbpipe.hpp:698
USBD_PIPE_HANDLE PipeHandle
Definition: usb.h:264
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID SetInfo(__in WDF_USB_REQUEST_TYPE Type, __in USBD_PIPE_HANDLE PipeHandle, __in USHORT Function)
Definition: fxusbpipe.cpp:1028
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
#define UMURB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
Definition: umusb.h:38
VOID FxUsbUmFormatRequest(__in FxRequestBase *Request, __in_xcount(Urb->Length) PUMURB_HEADER Urb, __in IWudfFile *HostFile, __in BOOLEAN Reuse)
Definition: usbutil.cpp:486
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
#define URB_FUNCTION_RESET_PIPE
Definition: usb.h:151
USBD_HANDLE m_USBDHandle
Definition: fxusbpipe.hpp:737
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
Definition: usb.h:529
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
_URB_PIPE_REQUEST * m_Urb
Definition: fxusbpipe.hpp:175
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
_URB_PIPE_REQUEST m_UrbLegacy
Definition: fxusbpipe.hpp:170
IWudfFile * m_pHostTargetFile
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
VOID FxFormatUsbRequest(__in FxRequestBase *Request, __in PURB Urb, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
Definition: usbutil.cpp:29
Definition: ps.c:97

Referenced by Reset(), and ValidateTransferLength().

◆ FormatTransferRequest()

_Must_inspect_result_ NTSTATUS FxUsbPipe::FormatTransferRequest ( __in FxRequestBase Request,
__in FxRequestBuffer Buffer,
__in ULONG  TransferFlags = 0 
)

Definition at line 204 of file fxusbpipekm.cpp.

209 {
210  FxUsbPipeTransferContext* pContext;
212  size_t bufferSize;
213  ULONG dummyLength;
214  FX_URB_TYPE urbType;
215 
216  //
217  // Make sure request is for the right type
218  //
221 
223  "WDFUSBPIPE %p not the right type, %!STATUS!",
224  GetHandle(), status);
225 
226  return status;
227  }
228 
229  bufferSize = Buffer->GetBufferLength();
230 
231  status = RtlSizeTToULong(bufferSize, &dummyLength);
232  if (!NT_SUCCESS(status)) {
234  "WDFUSBPIPE %p, buffer size truncated, %!STATUS!",
235  GetHandle(), status);
236  return status;
237  }
238 
239  //
240  // On reads, check to make sure the read in value is an integral number of
241  // packet sizes
242  //
243  if (TransferFlags & USBD_TRANSFER_DIRECTION_IN) {
244  if (IsInEndpoint() == FALSE) {
246  "Pipe %p, sending __in transaction on a __out endpoint",
247  this);
248 
250  }
251 
252  if (m_CheckPacketSize &&
255  }
256  }
257  else {
258  if (IsOutEndpoint() == FALSE) {
260  "Pipe %p, sending __out transaction on an __in endpoint",
261  this);
262 
264  }
265  }
266 
267  status = Request->ValidateTarget(this);
268  if (!NT_SUCCESS(status)) {
270  "Pipe %p, Request %p, setting target failed, "
271  "status %!STATUS!", this, Request, status);
272 
273  return status;
274  }
275 
276  if (Request->HasContextType(FX_RCT_USB_PIPE_XFER)) {
277  pContext = (FxUsbPipeTransferContext*) Request->GetContext();
278  }
279  else {
281 
282  pContext = new(GetDriverGlobals()) FxUsbPipeTransferContext(urbType);
283  if (pContext == NULL) {
285  }
286 
287  if (urbType == FxUrbTypeUsbdAllocated) {
288  status = pContext->AllocateUrb(m_USBDHandle);
289  if (!NT_SUCCESS(status)) {
290  delete pContext;
291  return status;
292  }
293  //
294  // Since the AllocateUrb routine calls USBD_xxxUrbAllocate APIs to allocate an Urb, it is
295  // important to release those resorces before the devnode is removed. Those
296  // resoruces are removed at the time Request is disposed.
297  //
298  Request->EnableContextDisposeNotification();
299  }
300 
301  Request->SetContext(pContext);
302  }
303 
304  //
305  // Always set the memory after determining the context. This way we can
306  // free a previously referenced memory object if necessary.
307  //
308  if (Buffer->HasMdl()) {
309  PMDL pMdl;
310 
311  pMdl=NULL;
312  ASSERT(pContext->m_PartialMdl == NULL);
313 
314  //
315  // If it is an __in endpoint, the buffer will be written to by the
316  // controller, so request IoWriteAccess locking.
317  //
318  status = Buffer->GetOrAllocateMdl(
320  &pMdl,
321  &pContext->m_PartialMdl,
322  &pContext->m_UnlockPages,
324 
325  if (!NT_SUCCESS(status)) {
326  return status;
327  }
328 
329  ASSERT(pMdl != NULL);
330  }
331 
332  pContext->StoreAndReferenceMemory(Buffer);
333 
334  pContext->SetUrbInfo(m_PipeInformation.PipeHandle, TransferFlags);
335 
336  if (pContext->m_Urb == &pContext->m_UrbLegacy) {
337  urbType = FxUrbTypeLegacy;
338  }
339  else {
340  urbType = FxUrbTypeUsbdAllocated;
341  }
342 
343  FxFormatUsbRequest(Request, (PURB)pContext->m_Urb, urbType, m_USBDHandle);
344 
345  return STATUS_SUCCESS;
346 }
#define RtlSizeTToULong
FX_URB_TYPE GetFxUrbTypeForRequest(__in FxRequestBase *Request)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:160
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
__inline BOOLEAN IsOutEndpoint(VOID)
Definition: fxusbpipe.hpp:531
enum _FX_URB_TYPE FX_URB_TYPE
FxUsbDevice * m_UsbDevice
Definition: fxusbpipe.hpp:698
BOOLEAN IsType(__in WDF_USB_PIPE_TYPE Type)
__inline BOOLEAN IsInEndpoint(VOID)
Definition: fxusbpipe.hpp:513
#define FALSE
Definition: types.h:117
_URB_BULK_OR_INTERRUPT_TRANSFER m_UrbLegacy
Definition: fxusbpipe.hpp:86
Definition: bufpool.h:45
USBD_PIPE_HANDLE PipeHandle
Definition: usb.h:264
#define STATUS_INVALID_BUFFER_SIZE
Definition: ntstatus.h:650
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
USHORT MaximumPacketSize
Definition: usb.h:260
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
size_t bufferSize
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
USBD_HANDLE m_USBDHandle
Definition: fxusbpipe.hpp:737
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
Definition: usb.h:529
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
VOID SetUrbInfo(__in USBD_PIPE_HANDLE PipeHandle, __in ULONG TransferFlags)
Definition: fxusbpipe.cpp:903
#define STATUS_SUCCESS
Definition: shellext.h:65
BOOLEAN m_CheckPacketSize
Definition: fxusbpipe.hpp:732
static SERVICE_STATUS status
Definition: service.c:31
__checkReturn NTSTATUS AllocateUrb(__in USBD_HANDLE USBDHandle)
Definition: fxusbpipe.cpp:825
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
virtual VOID StoreAndReferenceMemory(__in FxRequestBuffer *Buffer)
Definition: fxusbpipekm.cpp:13
VOID FxFormatUsbRequest(__in FxRequestBase *Request, __in PURB Urb, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
Definition: usbutil.cpp:29
_URB_BULK_OR_INTERRUPT_TRANSFER * m_Urb
Definition: fxusbpipe.hpp:91
Definition: ps.c:97

Referenced by _FormatTransfer(), _SendTransfer(), FxUsbPipeContinuousReader::FormatRepeater(), and ValidateTransferLength().

◆ GetHandle()

◆ GetInformation()

VOID FxUsbPipe::GetInformation ( __out PWDF_USB_PIPE_INFORMATION  PipeInformation)

Definition at line 349 of file fxusbpipekm.cpp.

352 {
353  //
354  // Do a field by field copy for the WDF structure, since fields could change.
355  //
362 }
_In_ WDFUSBPIPE _Out_ PWDF_USB_PIPE_INFORMATION PipeInformation
Definition: wdfusb.h:1741
UCHAR EndpointAddress
Definition: usb.h:261
USHORT MaximumPacketSize
Definition: usb.h:260
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
ULONG MaximumTransferSize
Definition: usb.h:265
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
UCHAR GetConfiguredSettingIndex(VOID)
USBD_PIPE_TYPE PipeType
Definition: usb.h:263
static WDF_USB_PIPE_TYPE _UsbdPipeTypeToWdf(__in USBD_PIPE_TYPE UsbdPipeType)
Definition: fxusbpipe.hpp:643

Referenced by FxUsbInterface::GetConfiguredPipe().

◆ GetMaxPacketSize()

ULONG FxUsbPipe::GetMaxPacketSize ( VOID  )
inline

Definition at line 555 of file fxusbpipe.hpp.

558  {
559 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
561 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
562  return m_PipeInformationUm.MaximumPacketSize;
563 #endif
564  }
USHORT MaximumPacketSize
Definition: usb.h:260
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720

◆ GetType()

WDF_USB_PIPE_TYPE FxUsbPipe::GetType ( VOID  )

Definition at line 365 of file fxusbpipekm.cpp.

368 {
370 }
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
USBD_PIPE_TYPE PipeType
Definition: usb.h:263
static WDF_USB_PIPE_TYPE _UsbdPipeTypeToWdf(__in USBD_PIPE_TYPE UsbdPipeType)
Definition: fxusbpipe.hpp:643

Referenced by if().

◆ GetUrbType()

FX_URB_TYPE FxUsbPipe::GetUrbType ( VOID  )
inline

Definition at line 676 of file fxusbpipe.hpp.

679  {
680  return m_UrbType;
681  }
FX_URB_TYPE m_UrbType
Definition: fxusbpipe.hpp:743

Referenced by __in_xcount().

◆ GetUSBDHandle()

USBD_HANDLE FxUsbPipe::GetUSBDHandle ( VOID  )
inline

Definition at line 668 of file fxusbpipe.hpp.

671  {
672  return m_USBDHandle;
673  }
USBD_HANDLE m_USBDHandle
Definition: fxusbpipe.hpp:737

Referenced by __in_xcount().

◆ GotoPurgeState()

VOID FxUsbPipe::GotoPurgeState ( __in WDF_IO_TARGET_PURGE_IO_ACTION  Action,
__in PLIST_ENTRY  PendedRequestListHead,
__in PSINGLE_LIST_ENTRY  SentRequestListHead,
__out PBOOLEAN  Wait,
__in BOOLEAN  LockSelf 
)
virtual

Reimplemented from FxIoTarget.

Definition at line 1294 of file fxusbpipe.cpp.

1301 {
1302  KIRQL irql;
1304 
1305  irql = PASSIVE_LEVEL;
1307 
1308  if (LockSelf) {
1309  Lock(&irql);
1310  }
1311 
1312  if (m_Reader != NULL) {
1313  //
1314  // If we are a continuous reader, always wait for the sent io, so that we
1315  // can resubmit it later on a restart.
1316  //
1319  "WDFUSBPIPE %p converting purge action %!WDF_IO_TARGET_PURGE_IO_ACTION!"
1320  " to %!WDF_IO_TARGET_PURGE_IO_ACTION!", GetHandle(), Action,
1322 
1324  }
1325 
1326  FxIoTarget::GotoPurgeState(Action, // __super call
1327  PendedRequestListHead,
1328  SentRequestListHead,
1329  Wait,
1330  FALSE);
1331 
1332  if (m_Reader != NULL) {
1333  //
1334  // The continuous reader requests are no longer enqueued. Remember that
1335  // state, so when we restart, we resend them.
1336  //
1338 
1339  //
1340  // Log a message when misbehaved drivers call WdfIoTargetPurge
1341  // from EvtUsbTargetPipeReadersFailed callback.
1342  //
1346  "WDFUSBPIPE %p is purged from EvtUsbTargetPipeReadersFailed"
1347  " callback", GetHandle());
1348 
1350  }
1351 
1352  //
1353  // Make sure work item is done. It is possible for the upper class
1354  // to return wait = false if the list of sent requests is empty. We
1355  // still want to wait anyway for making sure work item is not about
1356  // to run or it is running.
1357  //
1358  *Wait = TRUE;
1359  }
1360 
1361  if (LockSelf) {
1362  Unlock(irql);
1363  }
1364 }
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
Definition: fxobject.hpp:1474
virtual VOID GotoPurgeState(__in WDF_IO_TARGET_PURGE_IO_ACTION Action, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
Definition: fxiotarget.cpp:790
#define TRUE
Definition: types.h:120
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:167
KIRQL irql
Definition: wave.h:1
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
PFX_DRIVER_GLOBALS pFxDriverGlobals
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
static __inline MxThread MxGetCurrentThread()
Definition: mxgeneralkm.h:61
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:506
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
volatile POINTER_ALIGNMENT MxThread m_WorkItemThread
Definition: fxusbpipe.hpp:372
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
FxVerifierDbgBreakPoint(pFxDriverGlobals)

Referenced by FxUsbDevice::Purge().

◆ GotoRemoveState()

VOID FxUsbPipe::GotoRemoveState ( __in WDF_IO_TARGET_STATE  NewState,
__in PLIST_ENTRY  PendedRequestListHead,
__in PSINGLE_LIST_ENTRY  SentRequestListHead,
__in BOOLEAN  Lock,
__out PBOOLEAN  Wait 
)
virtual

Reimplemented from FxIoTarget.

Definition at line 1367 of file fxusbpipe.cpp.

1374 {
1375  KIRQL irql;
1376 
1377  irql = PASSIVE_LEVEL;
1378 
1379  if (LockSelf) {
1380  Lock(&irql);
1381  }
1382 
1385  //
1386  // Driver forgot to stop the pipe on D0Exit.
1387  //
1390  "WDFUSBPIPE %p was not stopped in EvtDeviceD0Exit callback",
1391  GetHandle());
1392 
1393  if (GetDriverGlobals()->IsVerificationEnabled(1,9,OkForDownLevel)) {
1395  }
1396  }
1397 
1398  FxIoTarget::GotoRemoveState(NewState, // __super call
1399  PendedRequestListHead,
1400  SentRequestListHead,
1401  FALSE,
1402  Wait);
1403  if (m_Reader != NULL) {
1404  //
1405  // Make sure work item is done. It is possible for the upper class to
1406  // return wait = false if the list of sent requests is empty. We still
1407  // want to wait anyway for making sure work item is not about to run or
1408  // it is running.
1409  //
1410  *Wait = TRUE;
1411  }
1412 
1413  if (LockSelf) {
1414  Unlock(irql);
1415  }
1416 }
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
Definition: fxobject.hpp:1474
#define TRUE
Definition: types.h:120
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:167
KIRQL irql
Definition: wave.h:1
WDF_IO_TARGET_STATE m_State
Definition: fxiotarget.hpp:928
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
virtual VOID GotoRemoveState(__in WDF_IO_TARGET_STATE NewState, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __in BOOLEAN Lock, __out PBOOLEAN Wait)
Definition: fxiotarget.cpp:964
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
FxVerifierDbgBreakPoint(pFxDriverGlobals)

Referenced by FxUsbDevice::CleanupInterfacePipesAndDelete(), and FxUsbDevice::PipesGotoRemoveState().

◆ GotoStartState()

_Must_inspect_result_ NTSTATUS FxUsbPipe::GotoStartState ( __in PLIST_ENTRY  RequestListHead,
__in BOOLEAN  Lock = TRUE 
)
virtual

Reimplemented from FxIoTarget.

Definition at line 1133 of file fxusbpipe.cpp.

1137 {
1138  NTSTATUS status;
1139  LONG i;
1140 
1141  if (m_Reader != NULL) {
1142  if (m_Reader->m_ReadersSubmitted == FALSE) {
1144 
1145  for (i = 0; i < m_Reader->m_NumReaders; i++) {
1147 
1149 
1150  UNREFERENCED_PARAMETER(pRequest); //for fre build
1153  }
1154  }
1155  }
1156 
1157  status = FxIoTarget::GotoStartState(RequestListHead, Lock);
1158 
1159  if (m_Reader == NULL || !NT_SUCCESS(status)) {
1160  return status;
1161  }
1162 
1163  //
1164  // Add the repeater requests to the list head so that they are sent by the
1165  // caller of this function when this function returns IFF they have not yet
1166  // been queued. (They can be queued on a start -> start transition.)
1167  //
1168  if (m_Reader->m_ReadersSubmitted == FALSE) {
1169  for (i = 0; i < m_Reader->m_NumReaders; i++) {
1170  //
1171  // This will clear ReadCompletedEvent as well
1172  //
1174 
1175  if (!NT_SUCCESS(status)) {
1176  return status;
1177  }
1178  }
1179 
1180  //
1181  // Reset the number of failed readers in case we had failure in a
1182  // previously started state.
1183  //
1185 
1186  for (i = 0; i < m_Reader->m_NumReaders; i++) {
1188 
1190  pRequest->SetTarget(this);
1191  pRequest->ADDREF(this);
1192 
1193  //
1194  // NOTE: This is an elusive backdoor to send the Request down
1195  // since it is inserted directly into the IoTargets pended list.
1196  // The IoTarget is not started so we add the request to the
1197  // pended list so that it is processed when the IoTarget starts.
1198  //
1200  InsertTailList(RequestListHead, &pRequest->m_ListEntry);
1201 
1202  //
1203  // Clear the event only when we know it will be submitted to the
1204  // target. It will be set when the request is submitted to the
1205  // target and the submit fails or if it is cancelled.
1206  //
1208  }
1209 
1211  }
1212 
1213  return status;
1214 }
#define TRUE
Definition: types.h:120
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
LONG NTSTATUS
Definition: precomp.h:26
FxRequest * pRequest
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
LIST_ENTRY m_ListEntry
__inline VOID IncrementIoCount(VOID)
Definition: fxiotarget.hpp:767
#define FALSE
Definition: types.h:117
long LONG
Definition: pedump.c:60
__inline VOID Clear()
Definition: mxeventkm.h:102
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
struct _SINGLE_LIST_ENTRY * Next
Definition: ntbasedef.h:629
LIST_ENTRY m_SentIoListHead
Definition: fxiotarget.hpp:868
virtual _Must_inspect_result_ NTSTATUS GotoStartState(__in PLIST_ENTRY RequestListHead, __in BOOLEAN Lock=TRUE)
Definition: fxiotarget.cpp:306
_Must_inspect_result_ NTSTATUS FormatRepeater(__in FxUsbPipeRepeatReader *Repeater)
Definition: fxusbpipe.cpp:687
FxUsbPipeRepeatReader m_Readers[1]
Definition: fxusbpipe.hpp:406
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
SINGLE_LIST_ENTRY m_DrainSingleEntry
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
VOID __inline SetTarget(__in FxIoTarget *Target)
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by FxUsbDevice::Start().

◆ GotoStopState()

VOID FxUsbPipe::GotoStopState ( __in WDF_IO_TARGET_SENT_IO_ACTION  Action,
__in PSINGLE_LIST_ENTRY  SentRequestListHead,
__out PBOOLEAN  Wait,
__in BOOLEAN  LockSelf 
)
virtual

Reimplemented from FxIoTarget.

Definition at line 1217 of file fxusbpipe.cpp.

1223 {
1224  KIRQL irql;
1226 
1227  irql = PASSIVE_LEVEL;
1229 
1230  if (LockSelf) {
1231  Lock(&irql);
1232  }
1233 
1234  if (m_Reader != NULL) {
1235  //
1236  // If we are a continuous reader, always cancel the sent io so that we
1237  // can resubmit it later on a restart.
1238  //
1241  "WDFUSBPIPE %p converting stop action %!WDF_IO_TARGET_SENT_IO_ACTION!"
1242  " to %!WDF_IO_TARGET_SENT_IO_ACTION!", GetHandle(), Action,
1244 
1246  }
1247 
1248  FxIoTarget::GotoStopState(Action, SentRequestListHead, Wait, FALSE); // __super call
1249 
1250  if (m_Reader != NULL) {
1251  //
1252  // The continuous reader requests are no longer enqueued. Remember that
1253  // state, so when we restart, we resend them.
1254  //
1256 
1257  //
1258  // Log a message when misbehaved drivers call WdfIoTargetStop
1259  // from EvtUsbTargetPipeReadersFailed callback.
1260  //
1264  "WDFUSBPIPE %p is stopped from EvtUsbTargetPipeReadersFailed"
1265  " callback", GetHandle());
1266 
1269  }
1270  }
1271 
1272  //
1273  // Do not deadlock when misbehaved drivers (< v1.9) call
1274  // WdfIoTargetStop from EvtUsbTargetPipeReadersFailed callback.
1275  //
1278  //
1279  // Make sure work item is done. It is possible for the upper class
1280  // to return wait = false if the list of sent requests is empty. We
1281  // still want to wait anyway for making sure work item is not about
1282  // to run or it is running.
1283  //
1284  *Wait = TRUE;
1285  }
1286  }
1287 
1288  if (LockSelf) {
1289  Unlock(irql);
1290  }
1291 }
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
Definition: fxobject.hpp:1474
#define TRUE
Definition: types.h:120
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:167
KIRQL irql
Definition: wave.h:1
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
_Must_inspect_result_ BOOLEAN IsVersionGreaterThanOrEqualTo(__in ULONG Major, __in ULONG Minor)
Definition: globalskm.cpp:92
PFX_DRIVER_GLOBALS pFxDriverGlobals
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
virtual VOID GotoStopState(__in WDF_IO_TARGET_SENT_IO_ACTION Action, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
Definition: fxiotarget.cpp:617
_Must_inspect_result_ BOOLEAN IsVerificationEnabled(__in ULONG Major, __in ULONG Minor, __in FxVerifierDownlevelOption DownLevel)
Definition: fxglobals.h:286
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
static __inline MxThread MxGetCurrentThread()
Definition: mxgeneralkm.h:61
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:506
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
volatile POINTER_ALIGNMENT MxThread m_WorkItemThread
Definition: fxusbpipe.hpp:372
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
FxVerifierDbgBreakPoint(pFxDriverGlobals)

Referenced by FxUsbDevice::Stop().

◆ InitContinuousReader()

_Must_inspect_result_ NTSTATUS FxUsbPipe::InitContinuousReader ( __in PWDF_USB_CONTINUOUS_READER_CONFIG  Config,
__in size_t  TotalBufferLength 
)

Definition at line 1463 of file fxusbpipe.cpp.

1467 {
1468  FxUsbPipeContinuousReader* pReader;
1469  NTSTATUS status;
1470  UCHAR numReaders;
1471 
1472  pReader = NULL;
1473 
1474  if (m_Reader != NULL) {
1476 
1479  "Continuous reader already initialized on WDFUSBPIPE %p %!STATUS!",
1480  GetHandle(), status);
1481 
1482  return status;
1483  }
1484 
1485  numReaders = Config->NumPendingReads;
1486 
1487  if (numReaders == 0) {
1488  numReaders = NUM_PENDING_READS_DEFAULT;
1489  }
1490  else if (numReaders > NUM_PENDING_READS_MAX) {
1491  numReaders = NUM_PENDING_READS_MAX;
1492  }
1493 
1494  pReader = new(GetDriverGlobals(), numReaders)
1495  FxUsbPipeContinuousReader(this, numReaders);
1496 
1497  if (pReader == NULL) {
1499  }
1500 
1501  //
1502  // Allocate all of the structurs and objects required
1503  //
1504  status = pReader->Config(Config, TotalBufferLength);
1505 
1506  if (!NT_SUCCESS(status)) {
1507  delete pReader;
1508  return status;
1509  }
1510 
1511  pReader->m_ReadCompleteCallback = Config->EvtUsbTargetPipeReadComplete;
1512  pReader->m_ReadCompleteContext = Config->EvtUsbTargetPipeReadCompleteContext;
1513 
1514  pReader->m_ReadersFailedCallback = Config->EvtUsbTargetPipeReadersFailed;
1515 
1517  pReader,
1518  NULL) == NULL) {
1519  //
1520  // We set the field, do nothing.
1521  //
1522  DO_NOTHING();
1523  }
1524  else {
1525  //
1526  // Some other thread came in and set the field, free our allocation.
1527  //
1528  delete pReader;
1529  }
1530 
1531  return STATUS_SUCCESS;
1532 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
friend FxUsbPipeContinuousReader
Definition: fxusbpipe.hpp:413
#define NUM_PENDING_READS_DEFAULT
Definition: fxusbpipe.hpp:221
PFN_WDF_USB_READERS_FAILED m_ReadersFailedCallback
Definition: fxusbpipe.hpp:335
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
_Must_inspect_result_ NTSTATUS Config(__in PWDF_USB_CONTINUOUS_READER_CONFIG Config, __in size_t TotalBufferLength)
Definition: fxusbpipekm.cpp:88
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
unsigned char UCHAR
Definition: xmlstorage.h:181
WDFCONTEXT m_ReadCompleteContext
Definition: fxusbpipe.hpp:330
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG Config
Definition: wdfchildlist.h:474
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
PFN_WDF_USB_READER_COMPLETION_ROUTINE m_ReadCompleteCallback
Definition: fxusbpipe.hpp:325
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
#define NUM_PENDING_READS_MAX
Definition: fxusbpipe.hpp:222
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
#define DO_NOTHING()
Definition: mxgeneral.h:32
Definition: ps.c:97

◆ InitPipe() [1/2]

VOID FxUsbPipe::InitPipe ( __in PUSBD_PIPE_INFORMATION  PipeInfo,
__in UCHAR  InterfaceNumber,
__in FxUsbInterface UsbInterface 
)

Definition at line 1073 of file fxusbpipe.cpp.

1078 {
1081 
1082  if (m_UsbInterface != NULL) {
1083  m_UsbInterface->RELEASE(this);
1084  m_UsbInterface = NULL;
1085  }
1086 
1088  m_UsbInterface->ADDREF(this);
1089 }
_In_ PVOID _In_ LONG InterfaceNumber
Definition: usbdlib.h:168
_In_ WDFUSBINTERFACE UsbInterface
Definition: wdfusb.h:2276
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_opt_ PWDF_USB_PIPE_INFORMATION PipeInfo
Definition: wdfusb.h:2538
#define NULL
Definition: types.h:112
UCHAR m_InterfaceNumber
Definition: fxusbpipe.hpp:726
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by FxUsbInterface::MakeAndConfigurePipes(), and FxUsbInterface::SetInfo().

◆ InitPipe() [2/2]

VOID FxUsbPipe::InitPipe ( __in PWINUSB_PIPE_INFORMATION  PipeInfo,
__in UCHAR  InterfaceNumber,
__in FxUsbInterface UsbInterface 
)

Definition at line 199 of file fxusbpipeum.cpp.

204 {
207 
208  if (m_UsbInterface != NULL) {
209  m_UsbInterface->RELEASE(this);
211  }
212 
214  m_UsbInterface->ADDREF(this);
215 }
_In_ PVOID _In_ LONG InterfaceNumber
Definition: usbdlib.h:168
_In_ WDFUSBINTERFACE UsbInterface
Definition: wdfusb.h:2276
FxUsbInterface * m_UsbInterface
Definition: fxusbpipe.hpp:700
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_opt_ PWDF_USB_PIPE_INFORMATION PipeInfo
Definition: wdfusb.h:2538
#define NULL
Definition: types.h:112
UCHAR m_InterfaceNumber
Definition: fxusbpipe.hpp:726
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

◆ IsInEndpoint()

__inline BOOLEAN FxUsbPipe::IsInEndpoint ( VOID  )
inline

Definition at line 513 of file fxusbpipe.hpp.

516  {
517  //
518  // USB_ENDPOINT_DIRECTION_IN just does a bitwise compre so it could
519  // return 0 or some non zero value. Make sure the non zero value is
520  // TRUE
521  //
522 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
524 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
526 #endif
527  }
#define USB_ENDPOINT_DIRECTION_IN(x)
Definition: usb100.h:76
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UCHAR EndpointAddress
Definition: usb.h:261
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720

Referenced by FormatTransferRequest().

◆ IsOutEndpoint()

__inline BOOLEAN FxUsbPipe::IsOutEndpoint ( VOID  )
inline

Definition at line 531 of file fxusbpipe.hpp.

534  {
535  //
536  // USB_ENDPOINT_DIRECTION_OUT just does a bitwise compre so it could
537  // return 0 or some non zero value. Make sure the non zero value is
538  // TRUE
539  //
540 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
542 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
544 #endif
545  }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UCHAR EndpointAddress
Definition: usb.h:261
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
#define USB_ENDPOINT_DIRECTION_OUT(x)
Definition: usb100.h:75

Referenced by FormatTransferRequest().

◆ IsType()

BOOLEAN FxUsbPipe::IsType ( __in WDF_USB_PIPE_TYPE  Type)

Definition at line 373 of file fxusbpipekm.cpp.

376 {
378 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
Type
Definition: Type.h:6
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
USBD_PIPE_TYPE PipeType
Definition: usb.h:263
static WDF_USB_PIPE_TYPE _UsbdPipeTypeToWdf(__in USBD_PIPE_TYPE UsbdPipeType)
Definition: fxusbpipe.hpp:643

Referenced by FormatTransferRequest().

◆ Reset()

NTSTATUS FxUsbPipe::Reset ( VOID  )

Definition at line 1858 of file fxusbpipe.cpp.

1861 {
1863 
1864  FxSyncRequest request(GetDriverGlobals(), &context);
1865  NTSTATUS status;
1866 
1867  //
1868  // FxSyncRequest always succeesds for KM but can fail for UM.
1869  //
1870  status = request.Initialize();
1871  if (!NT_SUCCESS(status)) {
1873  "Failed to initialize FxSyncRequest");
1874  return status;
1875  }
1876 
1877  status = FormatResetRequest(request.m_TrueRequest);
1878  if (NT_SUCCESS(status)) {
1879  if (m_Reader != NULL) {
1880  //
1881  // This assumes that no other I/O besides reader I/O is going on.
1882  //
1884  }
1885  else {
1886  CancelSentIo();
1887  }
1889  }
1890  return status;
1891 }
Definition: http.c:7251
LONG NTSTATUS
Definition: precomp.h:26
FxRequest * request
_Must_inspect_result_ NTSTATUS SubmitSyncRequestIgnoreTargetState(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS RequestOptions)
VOID CancelSentIo(VOID)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
Definition: wdfdriver.h:113
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
Definition: tftpd.h:85
_Must_inspect_result_ NTSTATUS FormatResetRequest(__in FxRequestBase *Request)
Definition: fxusbpipe.cpp:1783
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
Definition: ps.c:97

Referenced by FxUsbPipeContinuousReader::FxUsbPipeRequestWorkItemHandler().

◆ SetNoCheckPacketSize()

__inline VOID FxUsbPipe::SetNoCheckPacketSize ( VOID  )
inline

Definition at line 480 of file fxusbpipe.hpp.

483  {
485  }
#define FALSE
Definition: types.h:117
BOOLEAN m_CheckPacketSize
Definition: fxusbpipe.hpp:732

◆ ValidateTransferLength()

_Must_inspect_result_ NTSTATUS FxUsbPipe::ValidateTransferLength ( __in size_t  Length)
inline

Definition at line 568 of file fxusbpipe.hpp.

571  {
572  //
573  // Assumes this is not a control pipe
574  //
575  if (m_CheckPacketSize &&
576 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
578 #elif (FX_CORE_MODE == FX_CORE_USER_MODE)
579  (Length % m_PipeInformationUm.MaximumPacketSize) != 0) {
580 #endif
582  }
583  else {
584  return STATUS_SUCCESS;
585  }
586  }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define STATUS_INVALID_BUFFER_SIZE
Definition: ntstatus.h:650
USHORT MaximumPacketSize
Definition: usb.h:260
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714
WINUSB_PIPE_INFORMATION m_PipeInformationUm
Definition: fxusbpipe.hpp:720
#define STATUS_SUCCESS
Definition: shellext.h:65
BOOLEAN m_CheckPacketSize
Definition: fxusbpipe.hpp:732

◆ WaitForSentIoToComplete()

VOID FxUsbPipe::WaitForSentIoToComplete ( VOID  )
virtual

Reimplemented from FxIoTarget.

Definition at line 1419 of file fxusbpipe.cpp.

1422 {
1423  if (m_Reader != NULL) {
1426  "WDFUSBPIPE %p, waiting for continuous reader work item to complete",
1427  GetHandle());
1428 
1429  //
1430  // First, wait for the work item to complete if it is running.
1431  //
1432  // NOTE: We don't wait for the DPC to complete because
1433  // they are flushed in FxUsbDevice::Dispose
1434  //
1436 
1439  "WDFUSBPIPE %p, cancelling for continuous reader (max of %d)",
1441 
1442  //
1443  // Now that the work item is not running, make sure all the readers are
1444  // truly canceled and *NOT* in the pended queue. In between the call to
1445  // GotoStopState and here, the work item could have run and retried to
1446  // send the I/O.
1447  //
1449  }
1450 
1453  "WDFUSBPIPE %p, waiting for all i/o to complete", GetHandle());
1454 
1455  //
1456  // Finally, let the parent class wait for all I/O to complete
1457  //
1458  FxIoTarget::WaitForSentIoToComplete(); // __super call
1459 }
FxSystemWorkItem * m_WorkItem
Definition: fxusbpipe.hpp:360
#define TRACE_LEVEL_VERBOSE
Definition: storswtr.h:30
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
FxUsbPipeContinuousReader * m_Reader
Definition: fxusbpipe.hpp:709
virtual VOID WaitForSentIoToComplete(VOID)
Definition: fxiotarget.hpp:676
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
#define TRACINGIOTARGET
Definition: dbgtrace.h:72

Referenced by FxUsbDevice::CleanupInterfacePipesAndDelete().

◆ WdmGetPipeHandle()

USBD_PIPE_HANDLE FxUsbPipe::WdmGetPipeHandle ( VOID  )
inline

Definition at line 634 of file fxusbpipe.hpp.

637  {
639  }
USBD_PIPE_HANDLE PipeHandle
Definition: usb.h:264
USBD_PIPE_INFORMATION m_PipeInformation
Definition: fxusbpipe.hpp:714

Member Data Documentation

◆ FxUsbDevice

friend FxUsbPipe::FxUsbDevice

Definition at line 411 of file fxusbpipe.hpp.

◆ FxUsbInterface

friend FxUsbPipe::FxUsbInterface

Definition at line 412 of file fxusbpipe.hpp.

◆ FxUsbPipeContinuousReader

friend FxUsbPipe::FxUsbPipeContinuousReader

Definition at line 413 of file fxusbpipe.hpp.

Referenced by InitContinuousReader().

◆ m_CheckPacketSize

BOOLEAN FxUsbPipe::m_CheckPacketSize
protected

◆ m_InterfaceNumber

UCHAR FxUsbPipe::m_InterfaceNumber
protected

Definition at line 726 of file fxusbpipe.hpp.

Referenced by FxUsbPipe(), and InitPipe().

◆ m_ListEntry

LIST_ENTRY FxUsbPipe::m_ListEntry

Definition at line 687 of file fxusbpipe.hpp.

Referenced by FxUsbPipe(), and ~FxUsbPipe().

◆ m_PipeInformation

◆ m_PipeInformationUm

WINUSB_PIPE_INFORMATION FxUsbPipe::m_PipeInformationUm
protected

◆ m_Reader

◆ m_UrbType

FX_URB_TYPE FxUsbPipe::m_UrbType
protected

Definition at line 743 of file fxusbpipe.hpp.

Referenced by FxUsbPipe(), and GetUrbType().

◆ m_UsbDevice

◆ m_USBDHandle

USBD_HANDLE FxUsbPipe::m_USBDHandle
protected

◆ m_UsbInterface

FxUsbInterface* FxUsbPipe::m_UsbInterface
protected

The documentation for this class was generated from the following files: