ReactOS 0.4.17-dev-1281-g065abb3
clientxrb.cpp File Reference
#include "ucx01000.h"
#include <debug.h>
Include dependency graph for clientxrb.cpp:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define UCX_REQUEST_REUSE_MUST_COMPLETE   0x00000002
 

Functions

NTSTATUS NTAPI UcxCompleteUrb (_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
 
VOID NTAPI UcxCompleteUrbAtDispatch (_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
 
VOID NTAPI UcxCompleteHeldUrbIrp (_In_ PIRP Irp)
 
static VOID NTAPI UcxXrbCheckOnSubmit (_In_ PIRP Irp, _In_ PURB Urb)
 
static NTSTATUS NTAPI UcxXrbSubmitTransfer (_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
 
static NTSTATUS NTAPI UcxXrbSubmitChainedMdlTransfer (_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
 
NTSTATUS NTAPI UcxProcessSubmitUrb (_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp)
 
NTSTATUS NTAPI UcxForwardStreamsUrb (_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb, _In_ UcxController *Controller)
 
static VOID NTAPI UcxXrbFixUnprocessed (_Inout_ PIRP Irp, _Inout_ PURB Urb, _In_ UcxUsbDevice *Device)
 
static NTSTATUS NTAPI UcxXrbTransferCompletion (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
 
static NTSTATUS NTAPI UcxXrbStreamsCompletion (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
 

Variables

static IO_COMPLETION_ROUTINE UcxXrbTransferCompletion
 
static IO_COMPLETION_ROUTINE UcxXrbStreamsCompletion
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file clientxrb.cpp.

◆ UCX_REQUEST_REUSE_MUST_COMPLETE

#define UCX_REQUEST_REUSE_MUST_COMPLETE   0x00000002

Definition at line 14 of file clientxrb.cpp.

Function Documentation

◆ UcxCompleteHeldUrbIrp()

VOID NTAPI UcxCompleteHeldUrbIrp ( _In_ PIRP  Irp)

Completes an IRP held after STATUS_MORE_PROCESSING_REQUIRED, statuses as they are.

Definition at line 61 of file clientxrb.cpp.

63{
65
66 if (UcxIsXrbIrp(Irp, Urb))
68
70}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
FORCEINLINE VOID NTAPI UcxXrbMarkInactive(_In_ PURB Urb)
Definition: clientxrb.h:90
FORCEINLINE BOOLEAN NTAPI UcxIsXrbIrp(_In_ PIRP Irp, _In_ PURB Urb)
Definition: clientxrb.h:79
_In_ PIRP Irp
Definition: kse.h:79
#define IoCompleteRequest
Definition: irp.c:1272
struct _IO_STACK_LOCATION::@5100::@5139 Others
union _IO_STACK_LOCATION::@1823 Parameters
Definition: usb.h:565
struct _URB * PURB
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by EndpointMachine::FinishStreamsCloseRequest(), EndpointMachine::FinishStreamsOpenRequest(), and UcxEndpoint::OpenStaticStreamsComplete().

◆ UcxCompleteUrb()

NTSTATUS NTAPI UcxCompleteUrb ( _In_ PIRP  Irp,
_In_ PURB  Urb,
_In_ NTSTATUS  Status,
_In_ USBD_STATUS  UsbdStatus 
)

Sets both statuses and completes at the current IRQL; returns Status.

Definition at line 23 of file clientxrb.cpp.

28{
29 if (UcxIsXrbIrp(Irp, Urb))
31
32 Urb->UrbHeader.Status = UsbdStatus;
33 Irp->IoStatus.Status = Status;
34 Irp->IoStatus.Information = 0;
36
37 return Status;
38}
Status
Definition: gdiplustypes.h:24
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
Definition: wdfusb.h:403

Referenced by UcxEndpoint::AbortPipe(), UcxEndpoint::CloseStaticStreams(), UcxEndpoint::GetIsochPathDelays(), UcxCompleteUrbAtDispatch(), UcxFailStreamsUrb(), UcxHandleGetCurrentFrame(), UcxHandleIsoch(), UcxHandleStandardRequest(), UcxProcessLegacyUrb(), and UcxXrbSubmitChainedMdlTransfer().

◆ UcxCompleteUrbAtDispatch()

VOID NTAPI UcxCompleteUrbAtDispatch ( _In_ PIRP  Irp,
_In_ PURB  Urb,
_In_ NTSTATUS  Status,
_In_ USBD_STATUS  UsbdStatus 
)

Same, but plain URBs complete at DISPATCH_LEVEL as they did under USBPORT.

Definition at line 42 of file clientxrb.cpp.

47{
48 if (UcxIsXrbIrp(Irp, Urb))
49 {
51 return;
52 }
53
56}
NTSTATUS NTAPI UcxCompleteUrb(_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
Definition: clientxrb.cpp:23

Referenced by EndpointMachine::CompleteAbortUrb(), and UcxCsqCompleteCanceledAbortIrp().

◆ UcxForwardStreamsUrb()

NTSTATUS NTAPI UcxForwardStreamsUrb ( _In_ WDFDEVICE  RootHubPdo,
_In_ PIRP  Irp,
_In_ PURB  Urb,
_In_ UcxController *  Controller 
)

Definition at line 212 of file clientxrb.cpp.

217{
218 Urb->UrbHeader.Status = USBD_STATUS_PENDING;
219
220 return UcxForwardIrpToQueue(RootHubPdo, Irp, UcxXrbStreamsCompletion, Urb, Controller->m_DeviceMgmtQueue);
221}
static IO_COMPLETION_ROUTINE UcxXrbStreamsCompletion
Definition: clientxrb.cpp:17
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
NTSTATUS NTAPI UcxForwardIrpToQueue(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Completion, _In_ PVOID Context, _In_ WDFQUEUE Queue)
Definition: urbroute.cpp:308
#define USBD_STATUS_PENDING
Definition: usb.h:179

Referenced by UcxEndpoint::CloseStaticStreams(), and UcxEndpoint::OpenStaticStreams().

◆ UcxProcessSubmitUrb()

NTSTATUS NTAPI UcxProcessSubmitUrb ( _In_ WDFDEVICE  RootHubPdo,
_In_ PIRP  Irp 
)

Definition at line 169 of file clientxrb.cpp.

172{
174
175 if (!UcxIsXrbIrp(Irp, Urb))
176 return UcxProcessLegacyUrb(RootHubPdo, Irp, Urb);
177
179
180 /* Older contracts take the legacy path; its completions reset the state */
181 if (UcxXrbFromUrb(Urb)->ContractVersion < USBD_CLIENT_CONTRACT_VERSION_602)
182 return UcxProcessLegacyUrb(RootHubPdo, Irp, Urb);
183
184 switch (Urb->UrbHeader.Function)
185 {
188 return UcxXrbSubmitTransfer(RootHubPdo, Irp, Urb);
189
192 return UcxXrbSubmitChainedMdlTransfer(RootHubPdo, Irp, Urb);
193
195 return UcxEndpoint::FromPipe(Urb->UrbOpenStaticStreams.PipeHandle)->OpenStaticStreams(Irp, Urb);
196
197 /* The pipe handle sits at the same offset in both stream URBs */
199 return UcxEndpoint::FromPipe(Urb->UrbOpenStaticStreams.PipeHandle)->CloseStaticStreams(Irp, Urb);
200
201 /* Only XRBs reach this; a plain URB with this function is invalid */
203 return UcxEndpoint::FromPipe(Urb->UrbGetIsochPipeTransferPathDelays.PipeHandle)->GetIsochPathDelays(Irp, Urb);
204
205 default:
206 return UcxProcessLegacyUrb(RootHubPdo, Irp, Urb);
207 }
208}
NTSTATUS GetIsochPathDelays(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:59
NTSTATUS CloseStaticStreams(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:267
static UcxEndpoint * FromPipe(_In_ USBD_PIPE_HANDLE Handle)
Definition: pipe.h:241
NTSTATUS OpenStaticStreams(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:171
static NTSTATUS NTAPI UcxXrbSubmitTransfer(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
Definition: clientxrb.cpp:111
static NTSTATUS NTAPI UcxXrbSubmitChainedMdlTransfer(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
Definition: clientxrb.cpp:141
static VOID NTAPI UcxXrbCheckOnSubmit(_In_ PIRP Irp, _In_ PURB Urb)
Definition: clientxrb.cpp:78
FORCEINLINE UcxXrbPreamble *NTAPI UcxXrbFromUrb(_In_ PURB Urb)
Definition: clientxrb.h:60
NTSTATUS NTAPI UcxProcessLegacyUrb(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
Definition: urbroute.cpp:760
#define URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL
Definition: usb.h:155
#define URB_FUNCTION_GET_ISOCH_PIPE_TRANSFER_PATH_DELAYS
Definition: usb.h:156
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDL
Definition: usb.h:154
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
Definition: usb.h:95
#define URB_FUNCTION_OPEN_STATIC_STREAMS
Definition: usb.h:152
#define URB_FUNCTION_CLOSE_STATIC_STREAMS
Definition: usb.h:153
#define URB_FUNCTION_ISOCH_TRANSFER
Definition: usb.h:96
#define USBD_CLIENT_CONTRACT_VERSION_602
Definition: usbdlib.h:100

Referenced by UcxEvtRootHubPreprocessInternalIoctl().

◆ UcxXrbCheckOnSubmit()

static VOID NTAPI UcxXrbCheckOnSubmit ( _In_ PIRP  Irp,
_In_ PURB  Urb 
)
static

Bugchecks a client that corrupted its XRB or submitted one that is still in flight.

Definition at line 78 of file clientxrb.cpp.

81{
83
84 if (Xrb->Signature != UCX_XRB_SIGNATURE)
85 {
86 DPRINT1("IRP %p submitted corrupted XRB for URB %p\n", Irp, Urb);
92 }
93
94 if (Xrb->State != UCX_XRB_IDLE)
95 {
96 DPRINT1("IRP %p resubmitted URB %p while it is still active\n", Irp, Urb);
100 (ULONG_PTR)Urb,
102 }
103
105}
#define DPRINT1
Definition: precomp.h:8
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
Definition: debug.c:485
PDEVICE_OBJECT m_ClientDeviceObject
Definition: clientif.h:50
#define UCX_XRB_SIGNATURE
Definition: clientxrb.h:11
#define UCX_USB3_ACTIVE_URB_REUSED
Definition: clientxrb.h:23
#define UCX_BUGCHECK_USB3
Definition: clientxrb.h:22
#define UCX_USB3_XRB_CORRUPTED
Definition: clientxrb.h:24
#define UCX_XRB_IN_FLIGHT
Definition: clientxrb.h:19
#define UCX_XRB_IDLE
Definition: clientxrb.h:18
ULONG Signature
Definition: clientxrb.h:47
UcxUsbdHandle * Handle
Definition: clientxrb.h:39
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by UcxProcessSubmitUrb().

◆ UcxXrbFixUnprocessed()

static VOID NTAPI UcxXrbFixUnprocessed ( _Inout_ PIRP  Irp,
_Inout_ PURB  Urb,
_In_ UcxUsbDevice *  Device 
)
static

Normalizes a URB the HCD never saw.

Definition at line 229 of file clientxrb.cpp.

233{
234 if (Device->m_Disconnected)
235 {
236 Urb->UrbHeader.Status = USBD_STATUS_DEVICE_GONE;
237 Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
238 }
239 else
240 {
241 Urb->UrbHeader.Status = USBD_STATUS_CANCELED;
242 }
243}
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define USBD_STATUS_DEVICE_GONE
Definition: usb.h:222
#define USBD_STATUS_CANCELED
Definition: usb.h:225

Referenced by UcxXrbStreamsCompletion(), and UcxXrbTransferCompletion().

◆ UcxXrbStreamsCompletion()

static NTSTATUS NTAPI UcxXrbStreamsCompletion ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_reads_opt_(_Inexpressible_("varies")) PVOID  Context 
)
static

Definition at line 299 of file clientxrb.cpp.

303{
304 PURB Urb = (PURB)Context;
305 UcxUsbDevice* Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Urb->UrbHeader.UsbdDeviceHandle);
307
309
310 if (Urb->UrbHeader.Status == USBD_STATUS_PENDING)
311 {
312 DPRINT1("Streams URB %p function 0x%x never reached the HCD\n", Urb, Urb->UrbHeader.Function);
314 }
315 else
316 {
317 if (!USBD_SUCCESS(Urb->UrbHeader.Status))
318 {
319 DPRINT1("Streams URB %p function 0x%x failed, USBD status 0x%lx\n",
320 Urb, Urb->UrbHeader.Function, Urb->UrbHeader.Status);
321 }
322
323 Irp->IoStatus.Status = UcxUsbdStatusToNtStatus(Urb->UrbHeader.Status);
324 }
325
326 if (Irp->PendingReturned)
328
329 Endpoint = UcxEndpoint::FromPipe(Urb->UrbOpenStaticStreams.PipeHandle);
330
331 switch (Urb->UrbHeader.Function)
332 {
334 return Endpoint->OpenStaticStreamsComplete(Irp, Urb);
335
337 return Endpoint->CloseStaticStreamsComplete(Irp);
338
339 default:
342 }
343}
static UcxUsbDevice * FromHandle(_In_ UCXUSBDEVICE Handle)
Definition: devobj.cpp:18
static VOID NTAPI UcxXrbFixUnprocessed(_Inout_ PIRP Irp, _Inout_ PURB Urb, _In_ UcxUsbDevice *Device)
Definition: clientxrb.cpp:229
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
IoMarkIrpPending(Irp)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
NTSTATUS NTAPI UcxUsbdStatusToNtStatus(_In_ USBD_STATUS UsbdStatus)
Definition: urbroute.cpp:18
#define USBD_SUCCESS(Status)
Definition: usb.h:174
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
#define STATUS_CONTINUE_COMPLETION

◆ UcxXrbSubmitChainedMdlTransfer()

static NTSTATUS NTAPI UcxXrbSubmitChainedMdlTransfer ( _In_ WDFDEVICE  RootHubPdo,
_In_ PIRP  Irp,
_In_ PURB  Urb 
)
static

Definition at line 141 of file clientxrb.cpp.

145{
147
148 if (!Handle->m_ChainedMdlGranted)
149 {
150 DPRINT1("Chained MDL URB %p from handle %p without the capability\n", Urb, Handle);
151
152 if (Handle->m_VerifierEnabled)
153 {
156 (ULONG_PTR)Irp,
157 (ULONG_PTR)Urb,
158 (ULONG_PTR)Handle->m_ClientDeviceObject);
159 }
160
162 }
163
164 return UcxXrbSubmitTransfer(RootHubPdo, Irp, Urb);
165}
#define UCX_USB3_CHAINED_MDL
Definition: clientxrb.h:30
ULONG Handle
Definition: gdb_input.c:15
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define USBD_STATUS_INVALID_PARAMETER
Definition: usb.h:203

Referenced by UcxProcessSubmitUrb().

◆ UcxXrbSubmitTransfer()

static NTSTATUS NTAPI UcxXrbSubmitTransfer ( _In_ WDFDEVICE  RootHubPdo,
_In_ PIRP  Irp,
_In_ PURB  Urb 
)
static

Definition at line 111 of file clientxrb.cpp.

115{
117 UcxPipe* Pipe;
119
120 Urb->UrbHeader.Status = USBD_STATUS_PENDING;
121
122 Pipe = UcxPipe::FromHandle(Urb->UrbBulkOrInterruptTransfer.PipeHandle);
126
127 if (Xrb->Request == NULL)
128 return UcxForwardIrpToQueue(RootHubPdo, Irp, UcxXrbTransferCompletion, Urb, Pipe->Queue);
129
130 /* The preallocated request saves a KMDF allocation per transfer */
133 WdfRequestReuse(Xrb->Request, &Reuse);
134
135 return UcxForwardIrpWithRequest(RootHubPdo, Irp, UcxXrbTransferCompletion, Urb, Pipe->Queue, Xrb->Request);
136}
#define UCX_REQUEST_REUSE_MUST_COMPLETE
Definition: clientxrb.cpp:14
static IO_COMPLETION_ROUTINE UcxXrbTransferCompletion
Definition: clientxrb.cpp:16
#define NULL
Definition: types.h:112
return pRequest Reuse(ReuseParams)
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: pipe.h:30
static UcxPipe * FromHandle(_In_ USBD_PIPE_HANDLE Handle)
Definition: pipe.h:53
WDFREQUEST Request
Definition: clientxrb.h:41
NTSTATUS NTAPI UcxForwardIrpWithRequest(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Completion, _In_ PVOID Context, _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request)
Definition: urbroute.cpp:323
VOID NTAPI UcxLockTransferBuffer(_Inout_ PURB Urb)
Definition: urbroute.cpp:82
FORCEINLINE VOID NTAPI UcxSetTransferDirection(_Inout_ PURB Urb, _In_ const UcxPipe *Pipe)
Definition: urbroute.h:48
FORCEINLINE VOID NTAPI UcxStampProcessorNumber(_Inout_ PURB Urb)
Definition: urbroute.h:32
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(_Inout_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ PIRP NewIrp)
Definition: wdfrequest.h:379
@ WDF_REQUEST_REUSE_SET_NEW_IRP
Definition: wdfrequest.h:93
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
Definition: wdfrequest.h:364
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741

Referenced by UcxProcessSubmitUrb(), and UcxXrbSubmitChainedMdlTransfer().

◆ UcxXrbTransferCompletion()

static NTSTATUS NTAPI UcxXrbTransferCompletion ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_reads_opt_(_Inexpressible_("varies")) PVOID  Context 
)
static

Definition at line 248 of file clientxrb.cpp.

252{
253 PURB Urb = (PURB)Context;
254 UcxUsbDevice* Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Urb->UrbHeader.UsbdDeviceHandle);
255 ULONG Index;
256
258
259 if (Urb->UrbHeader.Status == USBD_STATUS_PENDING)
260 {
261 DPRINT("XRB URB %p function 0x%x canceled before reaching the HCD\n", Urb, Urb->UrbHeader.Function);
262 Device->m_TransferFailureCount++;
263 Urb->UrbBulkOrInterruptTransfer.TransferBufferLength = 0;
265
266 /* Only the plain isoch function; the chained MDL one keeps its packets */
267 if (!Device->m_Disconnected && Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
268 {
269 for (Index = 0; Index < Urb->UrbIsochronousTransfer.NumberOfPackets; Index++)
270 Urb->UrbIsochronousTransfer.IsoPacket[Index].Status = 0xFFFFFFFF;
271 Urb->UrbIsochronousTransfer.ErrorCount = 0;
272 }
273 }
274 else
275 {
276 if (!USBD_SUCCESS(Urb->UrbHeader.Status))
277 {
278 DPRINT("XRB URB %p function 0x%x on device %p failed, USBD status 0x%lx\n",
279 Urb, Urb->UrbHeader.Function, Device, Urb->UrbHeader.Status);
280 Device->m_TransferFailureCount++;
281 Device->ReportNoPingResponseIfPending();
282 }
283
284 /* The URB status always wins on this path */
285 Irp->IoStatus.Status = UcxUsbdStatusToNtStatus(Urb->UrbHeader.Status);
286 }
287
288 if (Irp->PendingReturned)
290
294}
#define DPRINT
Definition: sndvol32.h:73
uint32_t ULONG
Definition: typedefs.h:59
VOID NTAPI UcxUnlockTransferBuffer(_Inout_ PURB Urb)
Definition: urbroute.cpp:130
_In_ WDFCOLLECTION _In_ ULONG Index

Variable Documentation

◆ UcxXrbStreamsCompletion

IO_COMPLETION_ROUTINE UcxXrbStreamsCompletion
static

Definition at line 17 of file clientxrb.cpp.

Referenced by UcxForwardStreamsUrb().

◆ UcxXrbTransferCompletion

IO_COMPLETION_ROUTINE UcxXrbTransferCompletion
static

Definition at line 16 of file clientxrb.cpp.

Referenced by UcxXrbSubmitTransfer().