ReactOS 0.4.17-dev-1281-g065abb3
devobj.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Host Controller Extension
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: UCXUSBDEVICE object
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10/* Device type bits */
11#define UCX_DEVICE_TYPE_HUB 0x1
12#define UCX_DEVICE_TYPE_ROOT_HUB 0x2
13
14/* Newer controller drivers pass one more slot than the 1.6 structure */
16{
19};
20
21/* Opaque to the HCD; lives on the UCX stack while EvtControllerUsbDeviceAdd runs */
23{
24 UCXUSBDEVICE ParentHub;
25 UCXUSBDEVICE Created;
27 UCXHUB_DEVICE_CONTEXT HubDeviceContext;
29};
30
32
33/* One armed remote wake notification */
35{
36 WDFREQUEST Request;
38};
39
40/* One function of a composite device; Index must stay the first member */
42{
47};
48
50{
51public:
52 /* Run when the last endpoint finished its part of a hub operation */
54
55 /* Exports */
56
57 static
58 VOID
62
64 static
66 Create(
67 _In_ UCXCONTROLLER Controller,
70 _Out_ UCXUSBDEVICE* UsbDevice);
71
72 VOID
75
76 /* Hub interface */
77
79 static
82 _In_ UCXUSBDEVICE Hub,
84 _Out_ UCXUSBDEVICE* UsbDevice);
85
86 VOID
88
90 VOID
93
94 VOID
95 SetPdo(
97
99 Timestamp() const
100 {
101 return m_Timestamp;
102 }
103
104 /* Lookups and flags */
105
106 static
109 _In_ UCXUSBDEVICE Handle);
110
111 BOOLEAN
112 IsRootHub() const
113 {
114 return (m_Type & UCX_DEVICE_TYPE_ROOT_HUB) != 0;
115 }
116
117 BOOLEAN
118 IsHub() const
119 {
120 return (m_Type & UCX_DEVICE_TYPE_HUB) != 0;
121 }
122
124 Speed() const
125 {
126 return m_Info.DeviceSpeed;
127 }
128
129 BOOLEAN
131 {
134 }
135
137 VOID
139 _In_ UCXROOTHUB Handle,
141
142 /* Tree walks, called with the topology lock held */
143
144 VOID
148 _In_ BOOLEAN IncludeDisconnected);
149
150 /* Device management, see devicemgmt.cpp */
151
152 VOID
154 _In_ WDFREQUEST Request,
156
158 VOID
160 _In_ WDFREQUEST Request,
162
165 _In_ PIRP Irp,
167
170 _In_ PIRP Irp,
172
175 _In_ PIRP Irp,
177
179 VOID
181
182 /* UCX default queue requests */
183
184 VOID
186 _In_ WDFREQUEST Request);
187
188 VOID
190 _In_ WDFREQUEST Request);
191
192 VOID
194 _In_ WDFREQUEST Request);
195
196 VOID
198 _In_ WDFREQUEST Request);
199
200 /* Other services */
201
204 EnableForwardProgress(
206
207 VOID
209
211 VOID
213
214public:
215 UCXUSBDEVICE m_Handle;
218 UCXHUB_DEVICE_CONTEXT m_HubDeviceContext;
225
226 /* Topology lock */
234
235 /* Strict pipe handle validation, its own lock inside the topology lock */
239
242
246
247 /* Set by the fail path, consumed by the device management completion routine */
251
252 /* One hub operation at a time; the hub serializes them per device */
256
259
260 /* What the hub gave us in its stack interface query, on hub devices */
261 UCXHUB_HUB_CONTEXT m_HubContext;
262 PFN_UCXHUB_CLEAR_TT_BUFFER m_HubClearTtBuffer;
263 PFN_UCXHUB_NO_PING_RESPONSE m_HubNoPingResponse;
265
266 /* Composite functions and remote wake */
272
273 /* USBD client handles registered against this device */
276
277private:
278 VOID
280
281 /* Pending operation helpers */
282
283 VOID
287 _In_ LONG Count);
288
289 PVOID
291 {
293
295 return Pending;
296 }
297
298 VOID
301
302 VOID
304 _In_ WDFREQUEST Request,
305 _In_ BOOLEAN OnSuspend);
306
307 VOID
309 _In_ WDFREQUEST Request);
310
311 VOID
313 _In_ WDFREQUEST Request);
314
315 VOID
317 _In_ WDFREQUEST Request);
318
319 VOID
321 _In_ WDFREQUEST Request,
322 _In_ BOOLEAN AfterReset);
323
324 VOID
326 _In_ WDFREQUEST Request,
327 _In_ BOOLEAN AfterReset);
328
329 VOID
331 _In_ WDFREQUEST Request,
332 _In_ BOOLEAN AfterReset);
333
334 VOID
336 _In_ WDFREQUEST Request);
337
338 /* Pending operation completions */
339
341 VOID PendReset();
350
351 static
352 EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy;
353
354 static
355 EVT_WDF_REQUEST_CANCEL EvtRemoteWakeCancel;
356};
357
359
360/* Controller queue handlers owned by this module */
361EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtDeviceMgmtIoInternalDeviceControl;
362EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtTreePurgeIoInternalDeviceControl;
363EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtPendDuringResetIoInternalDeviceControl;
static T & Reset(T &sei, UINT flags=SEE_MASK_FLAG_NO_UI)
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
const struct winhelp_callbacks Callbacks
Definition: callback.c:161
@ Create
Definition: registry.c:563
HubFdo * Hub
Definition: bootdev.cpp:261
PFN_UCX_OPERATION_DONE m_PendingOperationDone
Definition: devobj.h:254
UcxController * m_Controller
Definition: devobj.h:216
BOOLEAN m_EndpointResetFailedByControllerReset
Definition: devobj.h:249
VOID HandleHubStartIo(_In_ WDFREQUEST Request)
Definition: devicemgmt.cpp:422
VOID HandleHubTreePurge(_In_ WDFREQUEST Request)
Definition: devicemgmt.cpp:465
VOID HandleHubEndpointsConfigure(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
Definition: devicemgmt.cpp:548
ULONG m_FunctionCount
Definition: devobj.h:269
VOID DispatchManagement(_In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
Definition: devicemgmt.cpp:80
BOOLEAN m_Disconnected
Definition: devobj.h:231
BOOLEAN m_ChildrenMayLeavePurge
Definition: devobj.h:232
VOID HandleHubAbortIo(_In_ WDFREQUEST Request)
Definition: devicemgmt.cpp:433
VOID RemoteWakeNotification(_In_ ULONG Interface)
Definition: devobj.cpp:189
static UcxUsbDevice * FromHandle(_In_ UCXUSBDEVICE Handle)
Definition: devobj.cpp:18
LIST_ENTRY m_EndpointList
Definition: devobj.h:229
static EVT_WDF_REQUEST_CANCEL EvtRemoteWakeCancel
Definition: devobj.h:355
VOID SendEndpointsConfigureToController()
Definition: devicemgmt.cpp:615
BOOLEAN IsRootHub() const
Definition: devobj.h:112
UcxEndpoint * m_DefaultEndpoint
Definition: devobj.h:240
VOID WalkSubtree(_In_ PFN_UCX_DEVICE_VISITOR Visitor, _In_opt_ PVOID Context, _In_ BOOLEAN IncludeDisconnected)
Definition: devobj.cpp:396
LIST_ENTRY m_ChildList
Definition: devobj.h:227
VOID RequestRemoteWakeNotification(_In_ WDFREQUEST Request)
Definition: devobj.cpp:764
NTSTATUS OnHcdEnableDone(_In_ PIRP Irp, _In_ PUSBDEVICE_ENABLE Enable)
Definition: devicemgmt.cpp:709
VOID TrackStaleHandles()
Definition: devobj.cpp:500
USHORT m_BcdUsb
Definition: devobj.h:220
LONG m_PendingNoPingResponse
Definition: devobj.h:257
VOID CompleteHubRequest()
Definition: devicemgmt.cpp:654
ULONG64 Timestamp() const
Definition: devobj.h:99
VOID CompleteHubOperation()
Definition: devicemgmt.cpp:358
_IRQL_requires_(PASSIVE_LEVEL) NTSTATUS EnableForwardProgress(_In_ PUCXHUB_FORWARD_PROGRESS_INFO Info)
BOOLEAN m_DeprogrammedByControllerReset
Definition: devobj.h:244
static VOID InitSetEventCallbacks(_Inout_ PUCXUSBDEVICE_INIT Init, _In_ PUCX_USBDEVICE_EVENT_CALLBACKS Callbacks)
Definition: devobj.cpp:71
BOOLEAN m_ResetFailedByControllerReset
Definition: devobj.h:248
VOID CompleteEnableIrp()
Definition: devicemgmt.cpp:673
ULONG m_TransferFailureCount
Definition: devobj.h:258
VOID InitializeAsRootHub(_In_ UCXROOTHUB Handle, _In_ UcxController *Controller)
Definition: devobj.cpp:50
WDFMEMORY m_FunctionsMemory
Definition: devobj.h:271
VOID DisconnectPort(_In_ ULONG PortNumber)
Definition: devobj.cpp:440
VOID CompleteEndpointsConfigureIrp()
Definition: devicemgmt.cpp:684
VOID SetFunctionData(_In_ WDFREQUEST Request)
Definition: devobj.cpp:747
VOID HandleHubReset(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
Definition: devicemgmt.cpp:501
VOID FanOutToEndpoints(_In_ EpEvent Event)
Definition: devicemgmt.cpp:372
BOOLEAN m_Enabled
Definition: devobj.h:243
USB_DEVICE_SPEED Speed() const
Definition: devobj.h:124
LIST_ENTRY m_TrackingList
Definition: devobj.h:237
PVOID m_PendingOperation
Definition: devobj.h:253
VOID(UcxUsbDevice::* PFN_UCX_OPERATION_DONE)()
Definition: devobj.h:53
UcxPipe * m_DefaultPipe
Definition: devobj.h:241
VOID UpdateFromHub(_In_ WDFREQUEST Request)
Definition: devicemgmt.cpp:583
BOOLEAN IsHub() const
Definition: devobj.h:118
BOOLEAN m_EndpointsMayLeavePurge
Definition: devobj.h:233
UCXUSBDEVICE m_Handle
Definition: devobj.h:215
KSPIN_LOCK m_TrackingLock
Definition: devobj.h:236
BOOLEAN AllowsEndpointStart() const
Definition: devobj.h:130
VOID StartOperation(_In_ PVOID Pending, _In_ PFN_UCX_OPERATION_DONE Done, _In_ LONG Count)
Definition: devicemgmt.cpp:345
VOID ReportNoPingResponseIfPending()
Definition: devobj.cpp:521
PFN_UCXHUB_NO_PING_RESPONSE m_HubNoPingResponse
Definition: devobj.h:263
VOID FinishEndpointResetRequest()
Definition: devicemgmt.cpp:691
VOID PendEndpointsConfigure()
Definition: devicemgmt.cpp:648
PVOID TakeOperation()
Definition: devobj.h:290
PDEVICE_OBJECT m_Pdo
Definition: devobj.h:223
VOID FailManagement(_In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
Definition: devicemgmt.cpp:170
VOID SetPdo(_In_ PDEVICE_OBJECT Pdo)
Definition: devobj.cpp:489
LIST_ENTRY m_UsbdHandleList
Definition: devobj.h:275
NTSTATUS OnHcdEndpointsConfigureDone(_In_ PIRP Irp, _In_ PENDPOINTS_CONFIGURE Configure)
Definition: devicemgmt.cpp:743
BOOLEAN m_HubUsesGrownInterface
Definition: devobj.h:264
UCXHUB_HUB_CONTEXT m_HubContext
Definition: devobj.h:261
KSPIN_LOCK m_RemoteWakeLock
Definition: devobj.h:267
BOOLEAN m_FailNextStreamClose
Definition: devobj.h:250
UcxUsbDeviceCallbacks m_Callbacks
Definition: devobj.h:222
BOOLEAN m_PendingDelete
Definition: devobj.h:245
UcxFunctionRecord * m_Functions
Definition: devobj.h:270
UCXUSBDEVICE_INFO m_Info
Definition: devobj.h:221
VOID SendResetToController()
Definition: devicemgmt.cpp:603
LIST_ENTRY m_ChildLink
Definition: devobj.h:228
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
Definition: devobj.h:352
VOID InitializeLists()
Definition: devobj.cpp:36
UCXHUB_DEVICE_CONTEXT m_HubDeviceContext
Definition: devobj.h:218
VOID RegisterComposite(_In_ WDFREQUEST Request)
Definition: devobj.cpp:640
VOID UnregisterComposite(_In_ WDFREQUEST Request)
Definition: devobj.cpp:718
UcxRemoteWakeSlot m_RemoteWake
Definition: devobj.h:268
KSPIN_LOCK m_UsbdHandleLock
Definition: devobj.h:274
ULONG64 m_Timestamp
Definition: devobj.h:224
VOID SendDisableToController()
Definition: devicemgmt.cpp:609
BOOLEAN m_StalePipeIoAllowed
Definition: devobj.h:238
VOID DeleteFromHub()
Definition: devobj.cpp:351
VOID PendDisable()
Definition: devicemgmt.cpp:642
VOID PendReset()
Definition: devicemgmt.cpp:636
NTSTATUS OnHcdResetDone(_In_ PIRP Irp, _In_ PUSBDEVICE_RESET Reset)
Definition: devicemgmt.cpp:730
VOID HandleHubDisable(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
Definition: devicemgmt.cpp:532
VOID HandleHubPurgeIo(_In_ WDFREQUEST Request, _In_ BOOLEAN OnSuspend)
Definition: devicemgmt.cpp:409
LIST_ENTRY m_StaleEndpointList
Definition: devobj.h:230
PFN_UCXHUB_CLEAR_TT_BUFFER m_HubClearTtBuffer
Definition: devobj.h:262
ULONG m_Type
Definition: devobj.h:219
LONG m_PendingOperationCount
Definition: devobj.h:255
UcxUsbDevice * m_ParentHub
Definition: devobj.h:217
static _Must_inspect_result_ NTSTATUS CreateFromHub(_In_ UCXUSBDEVICE Hub, _In_ PUCXHUB_DEVICE_CREATE_INFO Info, _Out_ UCXUSBDEVICE *UsbDevice)
Definition: devobj.cpp:297
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtTreePurgeIoInternalDeviceControl
Definition: devobj.h:362
#define UCX_DEVICE_TYPE_ROOT_HUB
Definition: devobj.h:12
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtDeviceMgmtIoInternalDeviceControl
Definition: devobj.h:361
#define UCX_DEVICE_TYPE_HUB
Definition: devobj.h:11
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtPendDuringResetIoInternalDeviceControl
Definition: devobj.h:363
KEVENT Done
Definition: devreq.cpp:1162
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
EpEvent
Definition: epsm.h:15
@ Pending
Definition: fs_rec.h:186
ULONG Handle
Definition: gdb_input.c:15
_In_ UCXUSBDEVICE UsbDevice
Definition: hostctl.h:31
VOID(NTAPI * PFN_UCX_DEVICE_VISITOR)(_In_ UcxUsbDevice *Device, _In_opt_ PVOID Context)
Definition: hostctl.h:108
_In_ ULONG PortNumber
Definition: hubucx.h:272
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
Definition: hubucx.h:280
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
unsigned __int64 ULONG64
Definition: imports.h:198
static LRESULT Configure(const CodecInfo *pi, HWND hWnd)
Definition: msrle32.c:1192
#define _Inout_
Definition: no_sal2.h:162
#define _Must_inspect_result_
Definition: no_sal2.h:62
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
UcxUsbDevice * Device
Definition: devobj.h:44
PDEVICE_OBJECT ClientPdo
Definition: devobj.h:45
UcxRemoteWakeSlot Wake
Definition: devobj.h:46
Definition: pipe.h:30
WDFREQUEST Request
Definition: devobj.h:36
PREQUEST_REMOTE_WAKE_NOTIFICATION Params
Definition: devobj.h:37
UCX_USBDEVICE_EVENT_CALLBACKS Public
Definition: devobj.h:17
Definition: typedefs.h:120
USB_DEVICE_SPEED DeviceSpeed
Definition: ucxusbdevice.h:176
UCXUSBDEVICE ParentHub
Definition: devobj.h:24
UCXHUB_DEVICE_CONTEXT HubDeviceContext
Definition: devobj.h:27
UcxUsbDeviceCallbacks Callbacks
Definition: devobj.h:28
UCXUSBDEVICE Created
Definition: devobj.h:25
UCXUSBDEVICE_INFO Info
Definition: devobj.h:26
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
USHORT Count
Definition: userreq.cpp:200
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
Definition: wdfobject.h:350