ReactOS 0.4.17-dev-1281-g065abb3
hubutil.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS SuperSpeed USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Small C++ helpers shared by every part of the driver
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10/* Pool tags, as they show up in a pool dump */
11#define HUB_TAG_DRIVER 'w3HU'
12#define HUB_TAG_HUB 'h3HU'
13#define HUB_TAG_DEVICE 'd3HU'
14#define HUB_TAG_PORT 'p3HU'
15
16/* Objects live in WDF context memory; this builds them in place */
17inline
19operator new(
20 _In_ size_t Size,
21 _In_ PVOID Where) noexcept
22{
24 return Where;
25}
26
27inline
28VOID
29operator delete(
31 _In_ PVOID Where) noexcept
32{
35}
36
39{
40public:
41 explicit
44 : m_Lock(Lock)
45 {
47 }
48
50 {
52 }
53
56
57private:
60};
61
64{
65public:
66 explicit
68 _In_ WDFWAITLOCK Lock)
69 : m_Lock(Lock)
70 {
72 }
73
75 {
76 WdfWaitLockRelease(m_Lock);
77 }
78
81
82private:
83 WDFWAITLOCK m_Lock;
84};
85
86/* One shot state machine timer built on a KTIMER and DPC */
88{
89public:
91
92 VOID
96 {
97 m_Fired = Fired;
101 }
102
103 VOID
105 _In_ ULONG Milliseconds)
106 {
108
109 DueTime.QuadPart = -10000LL * Milliseconds;
111 }
112
114 BOOLEAN
116 {
117 return KeCancelTimer(&m_Timer);
118 }
119
120private:
121 static
122 VOID
123 NTAPI
125 _In_ PKDPC Dpc,
129 {
130 HubTimer* Self = (HubTimer*)Context;
131
135
136 Self->m_Fired(Self->m_Context);
137 }
138
143};
144
145/* A LIST_ENTRY with NULL links means "not on any list" throughout this driver */
147VOID
148NTAPI
151{
152 Entry->Flink = NULL;
153 Entry->Blink = NULL;
154}
155
158NTAPI
160 _In_ const LIST_ENTRY* Entry)
161{
162 return Entry->Flink != NULL;
163}
164
170VOID
171NTAPI
172HubWaitForPnpEvent(
176
179VOID
180NTAPI
183{
184 KIRQL Irql;
185
189}
190
193VOID
194NTAPI
197{
198 KIRQL Irql;
199
203}
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
HubSpinLockGuard(const HubSpinLockGuard &)=delete
HubSpinLockGuard(_Inout_ PKSPIN_LOCK Lock)
Definition: hubutil.h:42
PKSPIN_LOCK m_Lock
Definition: hubutil.h:58
HubSpinLockGuard & operator=(const HubSpinLockGuard &)=delete
KIRQL m_OldIrql
Definition: hubutil.h:59
PVOID m_Context
Definition: hubutil.h:142
KTIMER m_Timer
Definition: hubutil.h:139
VOID Start(_In_ ULONG Milliseconds)
Definition: hubutil.h:104
static VOID NTAPI DpcRoutine(_In_ PKDPC Dpc, _In_opt_ PVOID Context, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2)
Definition: hubutil.h:124
KDPC m_Dpc
Definition: hubutil.h:140
PFN_HUB_TIMER_FIRED m_Fired
Definition: hubutil.h:141
VOID(NTAPI * PFN_HUB_TIMER_FIRED)(_In_ PVOID Context)
Definition: hubutil.h:90
VOID Initialize(_In_ PFN_HUB_TIMER_FIRED Fired, _In_ PVOID Context)
Definition: hubutil.h:93
BOOLEAN Cancel()
Definition: hubutil.h:115
HubWaitLockGuard(const HubWaitLockGuard &)=delete
HubWaitLockGuard(_In_ WDFWAITLOCK Lock)
Definition: hubutil.h:67
HubWaitLockGuard & operator=(const HubWaitLockGuard &)=delete
WDFWAITLOCK m_Lock
Definition: hubutil.h:83
_In_ PVOID Argument2
Definition: classpnp.h:721
_Out_ PKIRQL Irql
Definition: csq.h:179
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
KSPIN_LOCK * PKSPIN_LOCK
Definition: env_spec_w32.h:73
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
FORCEINLINE VOID NTAPI HubDereferenceDeferred(_In_ WDFOBJECT Object)
Definition: hubutil.h:181
FORCEINLINE VOID NTAPI HubDeleteDeferred(_In_ WDFOBJECT Object)
Definition: hubutil.h:195
_In_ PCSTR What
Definition: hubutil.h:174
FORCEINLINE BOOLEAN NTAPI HubIsListEntryLinked(_In_ const LIST_ENTRY *Entry)
Definition: hubutil.h:159
FORCEINLINE VOID NTAPI HubClearListEntry(_Out_ PLIST_ENTRY Entry)
Definition: hubutil.h:149
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
Definition: ketypes.h:767
Definition: typedefs.h:120
struct _LIST_ENTRY * Blink
Definition: typedefs.h:122
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define NTAPI
Definition: typedefs.h:36
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
WdfObjectDelete(String)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
Definition: wdfmemory.h:169
#define WdfObjectDereference(Handle)
Definition: wdfobject.h:826
_Must_inspect_result_ FORCEINLINE NTSTATUS WdfWaitLockAcquire(_In_ _Requires_lock_not_held_(_Curr_) WDFWAITLOCK Lock, _In_opt_ PLONGLONG Timeout)
Definition: wdfsync.h:173
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:127
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190
#define FORCEINLINE
Definition: wdftypes.h:67
_IRQL_requires_same_ _In_opt_ PVOID Argument1
Definition: cmtypes.h:697