ReactOS  0.4.15-dev-2956-g61e7ea5
FxUsbPipeContinuousReader Struct Reference

#include <fxusbpipe.hpp>

Inheritance diagram for FxUsbPipeContinuousReader:
Collaboration diagram for FxUsbPipeContinuousReader:

Public Member Functions

 FxUsbPipeContinuousReader (__in FxUsbPipe *Pipe, __in UCHAR NumReaders)
 
 ~FxUsbPipeContinuousReader ()
 
_Must_inspect_result_ NTSTATUS Config (__in PWDF_USB_CONTINUOUS_READER_CONFIG Config, __in size_t TotalBufferLength)
 
PVOID operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __range(1, NUM_PENDING_READS_MAX) ULONG NumReaders)
 
_Must_inspect_result_ NTSTATUS FormatRepeater (__in FxUsbPipeRepeatReader *Repeater)
 
VOID CancelRepeaters (VOID)
 
ULONG ResubmitRepeater (__in FxUsbPipeRepeatReader *Repeater, __out NTSTATUS *Status)
 
- Public Member Functions inherited from FxStump
PVOID operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
PVOID operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in POOL_TYPE PoolType)
 
VOID operator delete (__in PVOID pointer)
 
PVOID operator new[] (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
VOID operator delete[] (__in PVOID pointer)
 

Public Attributes

PFN_WDF_USB_READER_COMPLETION_ROUTINE m_ReadCompleteCallback
 
WDFCONTEXT m_ReadCompleteContext
 
PFN_WDF_USB_READERS_FAILED m_ReadersFailedCallback
 
FxUsbPipem_Pipe
 
FxLookasideListm_Lookaside
 
MdDeviceObject m_TargetDevice
 
WDFMEMORY_OFFSET m_Offsets
 
FxSystemWorkItemm_WorkItem
 
PVOID m_WorkItemRerunContext
 
volatile POINTER_ALIGNMENT MxThread m_WorkItemThread
 
ULONG m_WorkItemFlags
 
UCHAR m_NumFailedReaders
 
UCHAR m_NumReaders
 
BOOLEAN m_WorkItemQueued
 
BOOLEAN m_ReadersSubmitted
 
FxUsbPipeRepeatReader m_Readers [1]
 

Protected Member Functions

VOID DeleteMemory (__in FxRequestBase *Request)
 
BOOLEAN QueueWorkItemLocked (__in FxUsbPipeRepeatReader *Repeater)
 
__inline VOID FxUsbPipeRequestWorkItemHandler (__in FxUsbPipeRepeatReader *FailedRepeater)
 
- Protected Member Functions inherited from FxStump
 FxStump (VOID)
 

Static Protected Attributes

static MdDeferredRoutineType _FxUsbPipeContinuousReadDpc
 
static MX_WORKITEM_ROUTINE _ReadWorkItem
 
static EVT_WDF_REQUEST_COMPLETION_ROUTINE _FxUsbPipeRequestComplete
 
static EVT_SYSTEMWORKITEM _FxUsbPipeRequestWorkItemThunk
 

Detailed Description

Definition at line 234 of file fxusbpipe.hpp.

Constructor & Destructor Documentation

◆ FxUsbPipeContinuousReader()

FxUsbPipeContinuousReader::FxUsbPipeContinuousReader ( __in FxUsbPipe Pipe,
__in UCHAR  NumReaders 
)

Definition at line 30 of file fxusbpipe.cpp.

33  :
34  m_NumReaders(NumReaders),
36 {
37  m_WorkItem = NULL;
40  m_WorkItemFlags = 0;
43 
44  m_Lookaside = NULL;
45  m_Pipe = Pipe;
46 
48 
50 }
FxSystemWorkItem * m_WorkItem
Definition: fxusbpipe.hpp:360
#define FALSE
Definition: types.h:117
__inline MdDeviceObject GetTargetDevice(VOID)
Definition: fxiotarget.hpp:272
FxLookasideList * m_Lookaside
Definition: fxusbpipe.hpp:345
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741
FxUsbPipeRepeatReader m_Readers[1]
Definition: fxusbpipe.hpp:406
#define NULL
Definition: types.h:112
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
volatile POINTER_ALIGNMENT MxThread m_WorkItemThread
Definition: fxusbpipe.hpp:372
MdDeviceObject m_TargetDevice
Definition: fxusbpipe.hpp:350

◆ ~FxUsbPipeContinuousReader()

FxUsbPipeContinuousReader::~FxUsbPipeContinuousReader ( )

Definition at line 52 of file fxusbpipe.cpp.

53 {
54  LONG i;
55 
57 
58  //
59  // It is impoortant to delete the requests before the lookaside because the
60  // requests may have outstanding references on memory objects allocated by
61  // the lookaside. The lookaside will not be truly deleted until the oustanding
62  // memory object allocations are also freed.
63  //
64  for (i = 0; i < m_NumReaders; i++) {
65  if (reader[i].Request != NULL) {
67 
68  reader[i].Request->DeleteObject();
69  reader[i].Request = NULL;
70  }
71 
72 #if (FX_CORE_MODE == FX_CORE_USER_MODE)
73  reader[i].ReadCompletedEvent.Uninitialize();
74  reader[i].m_ReadWorkItem.Free();
75 #endif
76  }
77 
78  if (m_Lookaside != NULL) {
80  }
81 
82  if (m_WorkItem != NULL) {
84  m_WorkItem = NULL;
85  }
86 }
virtual VOID DeleteObject(VOID)
VOID DeleteMemory(__in FxRequestBase *Request)
Definition: fxusbpipe.hpp:276
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
FxSystemWorkItem * m_WorkItem
Definition: fxusbpipe.hpp:360
long LONG
Definition: pedump.c:60
FxLookasideList * m_Lookaside
Definition: fxusbpipe.hpp:345
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
#define NULL
Definition: types.h:112
Definition: reader.h:83

Member Function Documentation

◆ CancelRepeaters()

VOID FxUsbPipeContinuousReader::CancelRepeaters ( VOID  )

Definition at line 768 of file fxusbpipe.cpp.

771 {
772  LONG i;
773 
774  Mx::MxEnterCriticalRegion();
775 
776  for (i = 0; i < m_NumReaders; i++) {
779  m_Readers[i].ReadCompletedEvent.GetSelfPointer(),
780  "waiting for continuous reader to finish, WDFUSBPIPE",
781  m_Pipe->GetHandle(),
784 
785  }
786 
787  Mx::MxLeaveCriticalRegion();
788  //
789  // Checking for IO Count <= 1 is not a good idea here because there could be always other IO
790  // besides that from the continous reader going on the Read Pipe.
791  //
792 }
BOOLEAN Cancel(VOID)
VOID WaitForSignal(__in MxEvent *Event, __in PCSTR ReasonForWaiting, __in PVOID Handle, __in ULONG WarningTimeoutInSec, __in ULONG WaitSignalFlags)
Definition: globals.cpp:1705
long LONG
Definition: pedump.c:60
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
FxUsbPipeRepeatReader m_Readers[1]
Definition: fxusbpipe.hpp:406
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
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
ULONG FxVerifierDbgWaitForSignalTimeoutInSec
Definition: fxglobals.h:527

Referenced by FxUsbPipeRequestWorkItemHandler(), FxUsbPipe::Reset(), and FxUsbPipe::WaitForSentIoToComplete().

◆ Config()

_Must_inspect_result_ NTSTATUS FxUsbPipeContinuousReader::Config ( __in PWDF_USB_CONTINUOUS_READER_CONFIG  Config,
__in size_t  TotalBufferLength 
)

Definition at line 88 of file fxusbpipekm.cpp.

92 {
94  WDF_OBJECT_ATTRIBUTES attributes;
96  LONG i;
97 
99 
100  if (TotalBufferLength <= MAXUSHORT) {
103  }
104  else {
107  }
108 
109  if (m_Lookaside == NULL) {
111  }
112 
113  if (Config->BufferAttributes == NULL) {
114  WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
115  }
116  else {
117  RtlCopyMemory(&attributes,
118  Config->BufferAttributes,
119  sizeof(WDF_OBJECT_ATTRIBUTES));
120  }
121 
122  //
123  // By specifying the loookaside as the parent for the memory objects that
124  // will be created, when we destroy the lookaside list, we will destroy any
125  // outstanding memory objects that have been allocated. This can happen if
126  // we initialize the repeater, but never send any i/o. (Normally the
127  // memory object would be freed when the read completes.)
128  //
129  attributes.ParentObject = m_Lookaside->GetObjectHandle();
130 
131  status = m_Lookaside->Initialize(TotalBufferLength, &attributes);
132  if (!NT_SUCCESS(status)) {
133  return status;
134  }
135 
138  &m_WorkItem
139  );
140  if (!NT_SUCCESS(status)) {
142  "Could not allocate workitem: %!STATUS!", status);
143  return status;
144  }
145 
146  m_Offsets.BufferLength = Config->TransferLength;
147  m_Offsets.BufferOffset = Config->HeaderLength;
148 
149  for (i = 0; i < m_NumReaders; i++) {
150  FxUsbPipeRepeatReader* pRepeater;
151 
152  pRepeater = &m_Readers[i];
153 
154  pRepeater->Parent = this;
155 
157 
158  //
159  // This will allocate the PIRP
160  //
163  NULL,
164  m_Pipe,
167  &pRepeater->Request);
168 
169  if (!NT_SUCCESS(status)) {
170  return status;
171  }
172 
173  pRepeater->RequestIrp = pRepeater->Request->GetSubmitIrp();
174 
175  //
176  // Initialize the event before FormatRepeater clears it
177  //
179 
180  if (!NT_SUCCESS(status)) {
183  "Could not initialize ReadCompletedEvent: %!STATUS!",
184  status);
185 
186  return status;
187  }
188 
189  //
190  // This will allocate the context
191  //
192  status = FormatRepeater(pRepeater);
193 
194  if (!NT_SUCCESS(status)) {
195  return status;
196  }
197  }
198 
199  return STATUS_SUCCESS;
200 }
CfxDevice * m_Device
Definition: fxobject.hpp:329
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PVOID WdmObject, __out FxSystemWorkItem **pObject)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
MdDeviceObject __inline GetDeviceObject(VOID)
Definition: fxdevice.hpp:174
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES RequestAttributes, __in_opt MdIrp Irp, __in_opt FxIoTarget *Target, __in FxRequestIrpOwnership Ownership, __in FxRequestConstructorCaller Caller, __deref_out FxRequest **Request)
Definition: fxrequest.cpp:161
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
FxSystemWorkItem * m_WorkItem
Definition: fxusbpipe.hpp:360
CHECK_RETURN_IF_USER_MODE __inline NTSTATUS Initialize(__in EVENT_TYPE Type, __in BOOLEAN InitialState)
Definition: mxeventkm.h:55
long LONG
Definition: pedump.c:60
size_t BufferOffset
Definition: wdfmemory.h:65
PVOID __inline GetObjectHandle(VOID)
Definition: fxobject.hpp:603
static MdDeferredRoutineType _FxUsbPipeContinuousReadDpc
Definition: fxusbpipe.hpp:306
virtual _Must_inspect_result_ NTSTATUS Initialize(__in size_t BufferSize, __in PWDF_OBJECT_ATTRIBUTES MemoryAttributes)=0
PFX_DRIVER_GLOBALS pFxDriverGlobals
__inline MdIrp GetSubmitIrp(VOID)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
FxLookasideList * m_Lookaside
Definition: fxusbpipe.hpp:345
size_t BufferLength
Definition: wdfmemory.h:72
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG Config
Definition: wdfchildlist.h:474
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
_Must_inspect_result_ NTSTATUS FormatRepeater(__in FxUsbPipeRepeatReader *Repeater)
Definition: fxusbpipe.cpp:687
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147
FxUsbPipeRepeatReader m_Readers[1]
Definition: fxusbpipe.hpp:406
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
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
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
WDFOBJECT ParentObject
Definition: wdfobject.h:130
WDFMEMORY_OFFSET m_Offsets
Definition: fxusbpipe.hpp:355
#define NULL
Definition: types.h:112
#define WDF_NO_OBJECT_ATTRIBUTES
Definition: wdftypes.h:105
#define MAXUSHORT
Definition: typedefs.h:83
FxUsbPipeContinuousReader * Parent
Definition: fxusbpipe.hpp:194
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACINGIO
Definition: dbgtrace.h:66
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
Definition: ps.c:97

Referenced by FxUsbPipe::InitContinuousReader().

◆ DeleteMemory()

VOID FxUsbPipeContinuousReader::DeleteMemory ( __in FxRequestBase Request)
inlineprotected

Definition at line 276 of file fxusbpipe.hpp.

279  {
280  FxRequestContext* pContext;
281 
282  pContext = Request->GetContext();
283  if (pContext != NULL && pContext->m_RequestMemory != NULL) {
284  pContext->m_RequestMemory->Delete();
285  //
286  // NOTE: Don't NULL out the m_RequestMemory member as this will
287  // prevent Reuse from releasing a reference on the m_RequestMemory object
288  // and hence these memory objects will not be freed.
289  //
290  }
291  }
IFxMemory * m_RequestMemory
virtual VOID Delete(VOID)=0
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
#define NULL
Definition: types.h:112

Referenced by FormatRepeater(), and ~FxUsbPipeContinuousReader().

◆ FormatRepeater()

_Must_inspect_result_ NTSTATUS FxUsbPipeContinuousReader::FormatRepeater ( __in FxUsbPipeRepeatReader Repeater)

Definition at line 687 of file fxusbpipe.cpp.

690 {
693  FxUsbPipeTransferContext* pContext;
697 
698  pRequest = Repeater->Request;
699  //
700  // The repeater owns the request memory. If there is a memory on the
701  // context, delete it now. the memory will still be referencable since
702  // it will still have a reference against it until FormatTransferRequest is
703  // called or the request is freed and the context releases its references
704  //
706 
708 
709  pRequest->Reuse(&params);
710 
711  //
712  // pMemory will be deleted when either
713  // a) The request completes
714  // or
715  // b) The continuous reader is destroyed and we delete the lookaside. since
716  // the lookaside is the parent object for pMemory, pMemory will be disposed
717  // of when the parent is Disposed
718  //
720  if (!NT_SUCCESS(status)) {
721  FxRequestContext* pContext;
722 
723  pContext = pRequest->GetContext();
724  if (pContext != NULL ) {
725  pContext->m_RequestMemory = NULL;
726  }
727 
729  }
730 
732 
733  buf.SetMemory(pMemory, &m_Offsets);
734 
736  pRequest,
737  &buf,
739  );
740 
741  if (!NT_SUCCESS(status)) {
742  //
743  // In the case of failure, the context in the request will delete the
744  // memory. If there is no context, delete the memory here.
745  //
746  if (pRequest->GetContext() == NULL) {
747  //
748  // Use DeleteFromFailedCreate because the driver never saw the
749  // buffer, so they shouldn't be told about it going away.
750  //
752  }
753 
754  return status;
755  }
756 
758  pContext->SetUsbType(WdfUsbRequestTypePipeRead);
759  pContext->m_UsbParameters.Parameters.PipeRead.Buffer = (WDFMEMORY)
761 
763  return status;
764 }
__inline VOID SetCompletionRoutine(__in_opt PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine=NULL, __in_opt WDFCONTEXT CompletionContext=NULL)
IFxMemory * m_RequestMemory
_Must_inspect_result_ NTSTATUS FormatTransferRequest(__in FxRequestBase *Request, __in FxRequestBuffer *Buffer, __in ULONG TransferFlags=0)
return STATUS_NOT_SUPPORTED
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:160
FxRequest * pRequest
FxMemoryObject * pMemory
VOID DeleteMemory(__in FxRequestBase *Request)
Definition: fxusbpipe.hpp:276
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum const GLfloat * params
Definition: glext.h:5645
virtual _Must_inspect_result_ NTSTATUS Allocate(__out FxMemoryObject **PPMemory)=0
PVOID __inline GetObjectHandle(VOID)
Definition: fxobject.hpp:603
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
Definition: wdfrequest.h:364
static EVT_WDF_REQUEST_COMPLETION_ROUTINE _FxUsbPipeRequestComplete
Definition: fxusbpipe.hpp:315
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
FxLookasideList * m_Lookaside
Definition: fxusbpipe.hpp:345
virtual size_t GetBufferSize(VOID)
_Must_inspect_result_ NTSTATUS Reuse(__in PWDF_REQUEST_REUSE_PARAMS ReuseParams)
Definition: fxrequest.cpp:2136
#define USBD_SHORT_TRANSFER_OK
Definition: usb.h:154
__inline FxRequestContext * GetContext(VOID)
WDFMEMORY_OFFSET m_Offsets
Definition: fxusbpipe.hpp:355
#define NULL
Definition: types.h:112
VOID DeleteFromFailedCreate(VOID)
Definition: fxobject.cpp:391
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
static SERVICE_STATUS status
Definition: service.c:31
virtual PVOID GetBuffer(VOID)=0
Definition: ps.c:97

Referenced by Config(), FxUsbPipe::GotoStartState(), and ResubmitRepeater().

◆ FxUsbPipeRequestWorkItemHandler()

VOID FxUsbPipeContinuousReader::FxUsbPipeRequestWorkItemHandler ( __in FxUsbPipeRepeatReader FailedRepeater)
protected

Definition at line 395 of file fxusbpipe.cpp.

398 {
400  NTSTATUS status, failedStatus;
401  USBD_STATUS usbdStatus;
402  LONG i;
403  KIRQL irql;
406  PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;
408 
410 
411  //
412  // Get failed info.
413  //
414  failedStatus = FailedRepeater->Request->GetStatus();
415 
416  //
417  // Context is allocated at config time and gets reused so context
418  // will never be NULL.
419  //
420  context = FailedRepeater->Request->GetContext();
421  usbCompletionParams = context->m_CompletionParams.Parameters.Usb.Completion;
422 
423  //
424  // In case FormatRepeater fails to allocate memory usbCompletionParams
425  // pointer is not set.
426  //
427  // usbCompletionParams are part of the context and
428  // not really allocated at the time of every Format but
429  // the pointer gets cleared by request->Reuse and gets set again by
430  // context->SetUsbType.
431  //
432  // In FormatRepeater, context->SetUsbType is skipped
433  // if a memory failure occurs before this step.
434  //
435  // Hence retrieve usbdStatus only when usbCompletionParams is set.
436  //
437  if (usbCompletionParams) {
438  usbdStatus = usbCompletionParams->UsbdStatus;
439  }
440  else {
441  //
442  // Set usbdStatus to success as we didn't receive a failure from
443  // USB stack.
444  //
445  // This path is reached during memory allocation failure. In such
446  // case failedStatus would already be set appropriately. (usbdStatus
447  // and failedStatus are passed to m_ReadersFailedCallback below.)
448  //
449  usbdStatus = STATUS_SUCCESS;
450  }
451 
452  //
453  // No read requests should be in progress when the framework calls the
454  // EvtUsbTargetPipeReadersFailed callback function. This is part of the
455  // contract so that the Driver doesn't need to bother with the
456  // Completion calllback while taking corrective action.
457  //
458  CancelRepeaters();
460 
461  if (m_ReadersFailedCallback != NULL) {
462  //
463  // Save the current thread object pointer. This value is
464  // used for not deadlocking when misbehaved drivers (< v1.9) call
465  // WdfIoTargetStop from EvtUsbTargetPipeReadersFailed callback
466  //
469 
471  (WDFUSBPIPE) m_Pipe->GetHandle(),
472  failedStatus,
473  usbdStatus
474  );
475 
477  }
478  else {
479  //
480  // By default, we restart the readers
481  //
482  restart = TRUE;
483  }
484 
485  if (restart) {
486  status = pDevice->IsConnected();
487 
488  if (NT_SUCCESS(status)) {
489 
490  //
491  // for v1.9 or higher use the error recovery procedure prescribed
492  // by the USB team.
493  //
495 
496  if (pDevice->IsEnabled()) {
497  //
498  // Reset the pipe if port status is enabled
499  //
500  m_Pipe->Reset();
501  }
502  else {
503  //
504  // Reset the device if port status is disabled
505  //
506  status = pDevice->Reset();
507  }
508  }
509  else {
510  //
511  // Reset the device if port status is disabled
512  //
513  status = pDevice->Reset();
514  }
515  }
516  else {
517  //
518  // if port status is disconnected we would get back
519  // a !NT_SUCCESS. This would mean that we would not
520  // send the readers again and treat it like a failed reader.
521  //
522  DO_NOTHING();
523  }
524 
525  }
526  else {
527  //
528  // By setting status to !NT_SUCCESS, we will not send the readers
529  // again and treat it like a failed reader.
530  //
532  }
533 
534  //
535  // Work item is no longer queued. We set this before resubmitting the
536  // repeaters so that if they all complete and fail, we will requeue the
537  // work item.
538  //
539  m_Pipe->Lock(&irql);
541  m_Pipe->Unlock(irql);
542 
543  if (NT_SUCCESS(status)) {
544  ULONG action;
545 
546  //
547  // Reset the count to zero. This is safe since we stopped all the
548  // readers at the beginning of this function.
549  //
550  m_NumFailedReaders = 0;
551 
552  //
553  // restart the readers
554  //
555  for (i = 0; i < m_NumReaders; i++) {
556  FxUsbPipeRepeatReader* pRepeater;
557 
558  pRepeater = &m_Readers[i];
559 
560  action = ResubmitRepeater(pRepeater, &status);
561 
562  if (action & SubmitSend) {
563  //
564  // Ignore the return value because once we have sent the
565  // request, we want all processing to be done in the
566  // completion routine.
567  //
569  }
570  }
571  }
572 }
MdDeviceObject m_TargetDevice
Definition: fxiotarget.hpp:910
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
NTSTATUS Reset(VOID)
Definition: fxusbpipe.cpp:1858
Definition: http.c:7251
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
__inline FxIrp * GetSubmitFxIrp(VOID)
KIRQL irql
Definition: wave.h:1
PFN_WDF_USB_READERS_FAILED m_ReadersFailedCallback
Definition: fxusbpipe.hpp:335
ULONG ResubmitRepeater(__in FxUsbPipeRepeatReader *Repeater, __out NTSTATUS *Status)
Definition: fxusbpipe.cpp:135
FxUsbDevice * m_UsbDevice
Definition: fxusbpipe.hpp:698
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
long LONG
Definition: pedump.c:60
unsigned char BOOLEAN
_Must_inspect_result_ BOOLEAN IsVersionGreaterThanOrEqualTo(__in ULONG Major, __in ULONG Minor)
Definition: globalskm.cpp:92
NTSTATUS CallDriver(__in MdDeviceObject DeviceObject)
Definition: fxirpum.cpp:36
FxDevice * pDevice
void restart(int argc, const char *argv[])
Definition: cmds.c:2115
PFX_DRIVER_GLOBALS pFxDriverGlobals
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
Definition: wdfdriver.h:113
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
LONG USBD_STATUS
Definition: usb.h:165
static __inline MxThread MxGetCurrentThread()
Definition: mxgeneralkm.h:61
FxUsbPipeRepeatReader m_Readers[1]
Definition: fxusbpipe.hpp:406
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
const WCHAR * action
Definition: action.c:7783
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
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
volatile POINTER_ALIGNMENT MxThread m_WorkItemThread
Definition: fxusbpipe.hpp:372
static SERVICE_STATUS status
Definition: service.c:31
#define DO_NOTHING()
Definition: mxgeneral.h:32
Definition: ps.c:97

◆ operator new()

Definition at line 670 of file fxusbpipe.cpp.

675 {
676  ASSERT(NumReaders >= 1);
677 
678  return FxPoolAllocate(
679  FxDriverGlobals,
680  NonPagedPool,
681  Size + (NumReaders-1) * sizeof(FxUsbPipeRepeatReader)
682  );
683 }
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
#define ASSERT(a)
Definition: mode.c:44

◆ QueueWorkItemLocked()

BOOLEAN FxUsbPipeContinuousReader::QueueWorkItemLocked ( __in FxUsbPipeRepeatReader Repeater)
protected

Definition at line 89 of file fxusbpipe.cpp.

92 {
93  BOOLEAN queued;
95 
96  queued = FALSE;
98 
100  //
101  // No item queued, queue it up now.
102  //
105  "WDFUSBPIPE %p continuous reader queueing work item to recover "
106  "from failed allocation", m_Pipe->GetHandle());
107 
110  queued = TRUE;
111  }
112  else {
114  "Could not Queue workitem");
115  }
116  }
117 
118  //
119  // We only want to queue the work item while the target is in the
120  // started state. If it is not started, then we are no longer sending
121  // i/o and we should not queue the work item to try to restart.
122  //
123  if (FALSE == queued) {
126  "WDFUSBPIPE %p continuous reader not queueing work item,"
127  "WorkItemQueued = %d, target state %!WDF_IO_TARGET_STATE!",
129  }
130 
131  return queued;
132 }
#define TRUE
Definition: types.h:120
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
FxSystemWorkItem * m_WorkItem
Definition: fxusbpipe.hpp:360
__inline BOOLEAN Enqueue(__in PFN_WDF_SYSTEMWORKITEM CallbackFunc, __in PVOID Parameter)
static EVT_SYSTEMWORKITEM _FxUsbPipeRequestWorkItemThunk
Definition: fxusbpipe.hpp:319
WDF_IO_TARGET_STATE m_State
Definition: fxiotarget.hpp:928
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
PFX_DRIVER_GLOBALS fxDriverGlobals
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define TRACINGIO
Definition: dbgtrace.h:66
#define TRACINGIOTARGET
Definition: dbgtrace.h:72

Referenced by ResubmitRepeater().

◆ ResubmitRepeater()

ULONG FxUsbPipeContinuousReader::ResubmitRepeater ( __in FxUsbPipeRepeatReader Repeater,
__out NTSTATUS Status 
)

Definition at line 135 of file fxusbpipe.cpp.

139 {
142  ULONG action;
143  KIRQL irql;
144 
145  action = 0;
148 
149  //
150  // Reformat and allocate any new needed buffers
151  //
152  status = FormatRepeater(Repeater);
153 
154  m_Pipe->Lock(&irql);
155 
156  //
157  // Do not re-submit repeaters if there is a queued/running work-item to
158  // reset pipe. Work-item will restart this repeater later.
159  // This check needs to be done after the FormatRepeater() call above to
160  // prevent a race condition where we are not detecting when the repeater
161  // is cancelled.
162  //
163  if (m_WorkItemQueued) {
164  //
165  // Return an error and no action flags to let the caller know that
166  // this request was not sent.
167  //
169 
172  "WDFUSBPIPE %p is being reset, continuous reader %p FxRequest %p"
173  " PIRP %p is deferred for later.",
174  m_Pipe->GetHandle(), Repeater, Repeater->Request,
175  Repeater->RequestIrp);
176  }
177  else if (NT_SUCCESS(status)) {
178  //
179  // Get ready to re-submit the repeater.
180  //
182  Repeater->Request,
183  NULL,
185  );
186 
187  if (action & SubmitSend) {
188  //
189  // Clear the event only if we are going to send the request
190  //
191  Repeater->ReadCompletedEvent.Clear();
192  }
193  else if (action & SubmitQueued) {
194  //
195  // Request got canceled asynchronously. The other thread is now
196  // responsible for calling its completion callback.
197  //
199  }
200  else {
201  //
202  // Submit failed (which is expected when we are changing the target
203  // state or when the request is canceled). It should always be an
204  // error.
205  //
206  status = Repeater->Request->GetFxIrp()->GetStatus();
208  }
209  }
210  else {
211  //
212  // Could not allocate a new buffer
213  //
214  Repeater->Request->GetFxIrp()->SetStatus(status);
215 
218  "WDFUSBPIPE %p continuous reader, format failed, %!STATUS!, "
219  "repeater %p", m_Pipe->GetHandle(), status, Repeater);
220 
224 
226  //
227  // Queue a work item to clear problem.
228  //
229  QueueWorkItemLocked(Repeater);
230  }
231  else {
234  "WDFUSBPIPE %p continuous reader, buffer alloc failed, but "
235  "there are %d readers left out of a max of %d",
237  m_NumReaders);
238 
239  //
240  // There are still other pending readers, just use those for
241  // now.
242  //
243  DO_NOTHING();
244  }
245  }
246  else {
249  "WDFUSBPIPE %p continuous reader, buffer alloc failed, but not "
250  "in started state", m_Pipe->GetHandle());
251  }
252  }
253 
254  m_Pipe->Unlock(irql);
255 
256  *Status = status;
257 
258  return action;
259 }
#define WDF_REQUEST_SEND_INTERNAL_OPTION_FAIL_ON_PEND
LONG NTSTATUS
Definition: precomp.h:26
KIRQL irql
Definition: wave.h:1
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
WDF_IO_TARGET_STATE m_State
Definition: fxiotarget.hpp:928
BOOLEAN QueueWorkItemLocked(__in FxUsbPipeRepeatReader *Repeater)
Definition: fxusbpipe.cpp:89
UCHAR KIRQL
Definition: env_spec_w32.h:591
Status
Definition: gdiplustypes.h:24
PFX_DRIVER_GLOBALS pFxDriverGlobals
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
WDFUSBPIPE GetHandle(VOID)
Definition: fxusbpipe.hpp:504
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ NTSTATUS FormatRepeater(__in FxUsbPipeRepeatReader *Repeater)
Definition: fxusbpipe.cpp:687
ULONG SubmitLocked(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in ULONG Flags)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
const WCHAR * action
Definition: action.c:7783
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
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

Referenced by FxUsbPipeRequestWorkItemHandler().

Member Data Documentation

◆ _FxUsbPipeContinuousReadDpc

MdDeferredRoutineType FxUsbPipeContinuousReader::_FxUsbPipeContinuousReadDpc
staticprotected

Definition at line 306 of file fxusbpipe.hpp.

Referenced by Config().

◆ _FxUsbPipeRequestComplete

VOID FxUsbPipeContinuousReader::_FxUsbPipeRequestComplete
staticprotected

Definition at line 315 of file fxusbpipe.hpp.

Referenced by FormatRepeater().

◆ _FxUsbPipeRequestWorkItemThunk

VOID FxUsbPipeContinuousReader::_FxUsbPipeRequestWorkItemThunk
staticprotected

Definition at line 319 of file fxusbpipe.hpp.

Referenced by QueueWorkItemLocked().

◆ _ReadWorkItem

VOID FxUsbPipeContinuousReader::_ReadWorkItem
staticprotected

Definition at line 310 of file fxusbpipe.hpp.

◆ m_Lookaside

FxLookasideList* FxUsbPipeContinuousReader::m_Lookaside

◆ m_NumFailedReaders

UCHAR FxUsbPipeContinuousReader::m_NumFailedReaders

◆ m_NumReaders

◆ m_Offsets

WDFMEMORY_OFFSET FxUsbPipeContinuousReader::m_Offsets

Definition at line 355 of file fxusbpipe.hpp.

Referenced by Config(), and FormatRepeater().

◆ m_Pipe

◆ m_ReadCompleteCallback

PFN_WDF_USB_READER_COMPLETION_ROUTINE FxUsbPipeContinuousReader::m_ReadCompleteCallback

Definition at line 325 of file fxusbpipe.hpp.

Referenced by FxUsbPipe::InitContinuousReader().

◆ m_ReadCompleteContext

WDFCONTEXT FxUsbPipeContinuousReader::m_ReadCompleteContext

Definition at line 330 of file fxusbpipe.hpp.

Referenced by FxUsbPipe::InitContinuousReader().

◆ m_Readers

◆ m_ReadersFailedCallback

PFN_WDF_USB_READERS_FAILED FxUsbPipeContinuousReader::m_ReadersFailedCallback

◆ m_ReadersSubmitted

BOOLEAN FxUsbPipeContinuousReader::m_ReadersSubmitted

◆ m_TargetDevice

MdDeviceObject FxUsbPipeContinuousReader::m_TargetDevice

Definition at line 350 of file fxusbpipe.hpp.

Referenced by FxUsbPipeContinuousReader().

◆ m_WorkItem

◆ m_WorkItemFlags

ULONG FxUsbPipeContinuousReader::m_WorkItemFlags

Definition at line 377 of file fxusbpipe.hpp.

Referenced by FxUsbPipeContinuousReader().

◆ m_WorkItemQueued

BOOLEAN FxUsbPipeContinuousReader::m_WorkItemQueued

◆ m_WorkItemRerunContext

PVOID FxUsbPipeContinuousReader::m_WorkItemRerunContext

Definition at line 365 of file fxusbpipe.hpp.

Referenced by FxUsbPipeContinuousReader().

◆ m_WorkItemThread


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