ReactOS 0.4.17-dev-1281-g065abb3
devsm_boot.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Device state machine, device that holds the boot, paging or
5 * hibernation file. Its PDO never goes away; the machine waits
6 * for it to come back instead.
7 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
8 */
9
10/* INCLUDES *******************************************************************/
11
12#include "usbhub3.h"
13
14/* GLOBALS ********************************************************************/
15
16static const DsmEvent BootDiscards[] =
17{
19};
20
21/* Device failed; waiting for it to detach or for the client to reset it */
23 { NULL, "BootDeviceAwaitingReset", SM_STATE_TAKES_REQUESTS,
25
26/* Device detached; waiting for it to come back. m_ContextGone once the controller forgot it */
28 { NULL, "BootDeviceDetached", SM_STATE_TAKES_REQUESTS,
30
32 { NULL, "BootDeviceDetachedContextGone", SM_STATE_TAKES_REQUESTS,
35
36/* Client asked for a reset while detached; the reset runs on reattach */
38 { NULL, "BootDeviceResetPending", SM_STATE_TAKES_REQUESTS,
41
42/* Sub machine: keeps hub and PnP events balanced for the boot device */
45
46/* FUNCTIONS ******************************************************************/
47
50{
51 return SmCall(&BootDeviceEvents);
52}
53
54/* Configured device detached: purge its IO, then see whether it holds a system file */
57{
60}
61
62VOID
64{
67}
68
72{
73 if (Event != DsmEvent::ControllerIoctlDone)
74 return SmUnhandled();
75
76 if (IsBootDevice())
78
79 return DetachConfigured();
80}
81
84{
87}
88
91{
94}
95
96VOID
98{
101}
102
106{
107 if (Event != DsmEvent::ControllerIoctlDone)
108 return SmUnhandled();
109
112}
113
114/* The boot device failed: disable its endpoints and wait for a reset */
117{
120}
121
122VOID
124{
127}
128
132{
133 if (Event != DsmEvent::ControllerIoctlDone)
134 return SmUnhandled();
135
138}
139
140/* Detached while a reset was running: the reset continues on reattach */
143 _In_ BOOLEAN ContextGone)
144{
146 m_ContextGone = ContextGone;
148}
149
153{
154 switch (Event)
155 {
156 case DsmEvent::ClientUnconfigure:
157 case DsmEvent::ClientClearStall:
158 case DsmEvent::ClientSyncResetPipe:
159 case DsmEvent::ClientResetPipe:
160 case DsmEvent::ClientSetInterface:
161 case DsmEvent::ClientSelectConfig:
163 return SmHandled();
164
165 case DsmEvent::HubGetDescriptor:
167 return SmHandled();
168
169 case DsmEvent::NoPingResponse:
170 case DsmEvent::LpmSettingChanged:
171 return SmHandled();
172
173 case DsmEvent::DeviceTextQuery:
175 return SmHandled();
176
177 case DsmEvent::PdoPreStart:
178 AckPreStart();
179 return SmHandled();
180
181 case DsmEvent::ClientResetDevice:
183
184 case DsmEvent::PortDetached:
185 if (m_ContextGone)
187
190
191 case DsmEvent::ClientStreams:
193
194 default:
195 return SmUnhandled();
196 }
197}
198
201{
204 return SmCall(&BootDeviceEvents);
205}
206
209{
213 return SmCall(&BootDeviceEvents);
214}
215
219{
220 switch (Event)
221 {
222 case DsmEvent::ClientSetInterface:
223 case DsmEvent::ClientSelectConfig:
224 case DsmEvent::ClientResetPipe:
225 case DsmEvent::ClientSyncResetPipe:
226 case DsmEvent::ClientUnconfigure:
227 case DsmEvent::ClientClearStall:
229 return SmHandled();
230
231 case DsmEvent::NoPingResponse:
232 case DsmEvent::LpmSettingChanged:
233 return SmHandled();
234
235 case DsmEvent::HubGetDescriptor:
237 return SmHandled();
238
239 case DsmEvent::DeviceTextQuery:
241 return SmHandled();
242
243 case DsmEvent::ClientResetDevice:
245
246 case DsmEvent::PortReattached:
248
249 case DsmEvent::ClientStreams:
252
253 default:
254 return SmUnhandled();
255 }
256}
257
260{
262 return SmHandled();
263}
264
268{
269 if (Event != DsmEvent::PortReattached)
270 return SmUnhandled();
271
273}
274
278{
279 switch (Event)
280 {
281 case DsmEvent::ClientResetPipe:
282 case DsmEvent::ClientClearStall:
283 case DsmEvent::ClientSyncResetPipe:
285 return SmHandled();
286
287 case DsmEvent::LpmSettingChanged:
288 case DsmEvent::NoPingResponse:
289 return SmHandled();
290
291 case DsmEvent::HubGetDescriptor:
293 return SmHandled();
294
295 case DsmEvent::HubResumed:
296 case DsmEvent::HubResumedWithReset:
297 case DsmEvent::HubResumedInS0:
300
301 case DsmEvent::PdoInstallMsOsExt:
302 case DsmEvent::PdoPowerDown:
303 case DsmEvent::PdoPowerUp:
306
307 case DsmEvent::HubSuspending:
310
311 default:
312 return SmUnhandled();
313 }
314}
unsigned char BOOLEAN
Definition: actypes.h:127
static const State BootDeviceResetPending
Definition: devsm.h:1273
VOID FailHubDescriptorRequest()
Definition: hubioctl.cpp:383
VOID MarkPowerLost()
Definition: childpdo.cpp:4096
static const State BootDeviceAwaitingReset
Definition: devsm.h:1270
VOID DisableEndpointsAndNotify()
Definition: devsm_boot.cpp:123
SM_RESULT BootDeviceDisabledOnDetach(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:104
SM_RESULT OnBootDeviceDetached(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:217
SM_RESULT BootDeviceNotifyDetached()
Definition: devsm_boot.cpp:83
VOID AckPreStart()
Definition: childpdo.cpp:4051
SM_RESULT EnterBootDeviceEvents()
Definition: devsm_boot.cpp:49
VOID FailClientRequest()
Definition: childpdo.cpp:3558
SM_RESULT BootDeviceDisabledOnFailure(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:130
SM_RESULT OnBootDeviceEvents(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:276
SM_RESULT EnterBootDeviceDetachedContextGone()
Definition: devsm_boot.cpp:208
VOID PurgeDeviceIo()
Definition: devhcd.cpp:908
VOID NotifyDisconnected()
Definition: childpdo.cpp:3952
BOOLEAN m_ContextGone
Definition: devsm.h:1851
static const State BootDeviceEvents
Definition: devsm.h:1274
SM_RESULT PurgedOnDetach(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:70
SM_RESULT OnBootDeviceAwaitingReset(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:151
SM_RESULT PurgeOnDetach()
Definition: devsm_boot.cpp:56
VOID ReferenceDevicePower()
Definition: fanout.cpp:1038
SM_RESULT EnterBootDeviceDetached()
Definition: devsm_boot.cpp:200
VOID DisableEndpointsPowerLost()
Definition: devsm_boot.cpp:97
static const State BootDeviceDetached
Definition: devsm.h:1271
VOID DereferenceDevicePower()
Definition: fanout.cpp:1044
SM_RESULT BootDeviceFailed()
Definition: devsm_boot.cpp:116
VOID SignalPnpWaiter()
Definition: childpdo.cpp:4023
VOID NotifyPortDetached()
Definition: hubport.cpp:632
SM_RESULT BootDeviceDisableOnDetach()
Definition: devsm_boot.cpp:90
static const State RequestingCriticalPassive
Definition: devsm.h:233
SM_RESULT ForwardStreams(_In_ const State *ReturnTo)
Definition: devsm.cpp:645
SM_RESULT ReenumForBootClient(_In_ BOOLEAN AfterReattach)
VOID DisableAllEndpoints()
Definition: devhcd.cpp:1031
SM_RESULT BootDeviceDetachDuringReset(_In_ BOOLEAN ContextGone)
Definition: devsm_boot.cpp:142
SM_RESULT DetachConfigured()
static const State RequestingCritical
Definition: devsm.h:230
SM_RESULT OnBootDeviceResetPending(_In_ DsmEvent Event)
Definition: devsm_boot.cpp:266
static const State BootDeviceDetachedContextGone
Definition: devsm.h:1272
SM_RESULT EnterBootDeviceResetPending()
Definition: devsm_boot.cpp:259
BOOLEAN IsBootDevice()
Definition: childpdo.cpp:4128
VOID SignalQueryText()
Definition: childpdo.cpp:4064
VOID NotifyAndPurgeIo()
Definition: devsm_boot.cpp:63
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmCall(_In_ const State *Start)
Definition: smengine.h:209
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
DsmEvent
Definition: devsm.h:15
@ NoPingResponse
@ LpmSettingChanged
static const DsmEvent BootDiscards[]
Definition: devsm_boot.cpp:16
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define _In_
Definition: no_sal2.h:158
#define SM_STATE_TAKES_REQUESTS
Definition: smengine.h:39
#define SM_STATE_YIELDS_TO_CALLER
Definition: smengine.h:42
One state. Handler gets every event the state sees.
Definition: smengine.h:93
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request