ReactOS 0.4.17-dev-1281-g065abb3
devmisc.cpp
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: Device kind, speed and reset decisions, and the duplicate serial list
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "usbhub3.h"
9
10#define NDEBUG
11#include <debug.h>
12
13/* Retry limits */
14#define DEVICE_DUPLICATE_RETRY_LIMIT 10
15
16/* Two resets closer than a second apart make the next one a warm reset */
17#define DEVICE_FAST_RESET_WINDOW (1LL * 1000 * 1000 * 10)
18
19/* Validation code for a serial number another connected device already uses */
20#define HUB_VALIDATION_DUPLICATE_SERIAL 234
21
22/* Four attempts in all before the device is given up on */
23#define DEVICE_ENUM_RETRY_LIMIT 3
24
25/* USB 2 port status bits for the attached speed */
26#define PS_LOW_SPEED 0x0200
27#define PS_HIGH_SPEED 0x0400
28
31{
32 return m_Device->m_EnumRetryCount == 0;
33}
34
36static
37VOID
41{
42 if (Child->m_MsOs20Set != NULL)
44
45 Child->m_MsOs20Set = NULL;
46 Child->m_MsOs20SetLength = 0;
47 RtlZeroMemory(&Child->m_MsOs20, sizeof(Child->m_MsOs20));
48 RtlZeroMemory(&Child->m_MsOs20SetInfo, sizeof(Child->m_MsOs20SetInfo));
49 RtlZeroMemory(&Child->m_OriginalDeviceDescriptor, sizeof(Child->m_OriginalDeviceDescriptor));
50 Child->m_AltEnumCached = FALSE;
51 Child->m_HasResumeRecoveryTime = FALSE;
52 Child->m_ResumeRecoveryTime = 0;
53 Child->m_ResumeSignalingTime = 0;
56}
57
58VOID
60{
61 m_Device->ClearState(ChildState::ConfigurationValid);
62 m_Device->ClearState(ChildState::AltEnumCompleted);
63 m_Device->ClearState(ChildState::AltEnumCommandSent);
64 m_Device->ClearState(ChildState::U1EnabledUpstream);
65 m_Device->ClearState(ChildState::U2EnabledUpstream);
71}
72
75{
76 m_Device->SetState(ChildState::FailedAnEnumeration);
77
79 {
80 DPRINT1("Device %p failed %lu enumeration attempts\n", m_Device, m_Device->m_EnumRetryCount);
81 return TRUE;
82 }
83
84 DPRINT1("Device %p enumeration retry %lu\n", m_Device, m_Device->m_EnumRetryCount);
85 m_Device->ClearState(ChildState::ConfigurationValid);
88 return FALSE;
89}
90
91VOID
93{
95}
96
99{
101
102 DPRINT1("Device %p duplicate serial number retry %lu\n", m_Device, Count);
103
105 {
106 DPRINT1("Device %p duplicate is not going away, serial number dropped\n", m_Device);
107 return TRUE;
108 }
109
110 return FALSE;
111}
112
113/* A device that was high speed and now reports another speed is enumerated again */
116{
119 ULONG NewSpeed;
120
121 if (Status & PS_HIGH_SPEED)
122 {
123 NewSpeed = DSM_KIND_HIGH_SPEED;
124 m_Device->SetProperty(ChildProperty::HighSpeedCapable);
125 }
126 else if (Status & PS_LOW_SPEED)
127 {
128 NewSpeed = DSM_KIND_LOW_SPEED;
129 }
130 else
131 {
132 NewSpeed = DSM_KIND_FULL_SPEED;
133 }
134
135 m_Device->m_Kind = (m_Device->m_Kind & ~DSM_KIND_ANY_SPEED) | NewSpeed;
136
137 if (OldSpeed != 0 && OldSpeed != NewSpeed)
138 {
139 DPRINT1("Device %p changed speed 0x%lx to 0x%lx\n", m_Device, OldSpeed, NewSpeed);
140 if (OldSpeed == DSM_KIND_HIGH_SPEED)
141 return FALSE;
142 }
143
144 return TRUE;
145}
146
147/* A USB 3 bcdUSB on a USB 2 port counts as USB 2.x */
148VOID
150{
153
154 if (BcdUsb == 0x0100)
155 {
157 }
158 else if (BcdUsb < 0x0200)
159 {
160 if (BcdUsb < 0x0100)
161 DPRINT1("Device %p reports bad bcdUSB 0x%x\n", m_Device, BcdUsb);
163 }
164 else if (BcdUsb == 0x0200)
165 {
167 }
168 else if (BcdUsb < 0x0300)
169 {
171 }
172 else if (m_Device->m_Kind & DSM_KIND_PORT30)
173 {
175 }
176 else
177 {
178 DPRINT1("Device %p on a USB 2 port reports bcdUSB 0x%x\n", m_Device, BcdUsb);
180 }
181
182 m_Device->m_Kind = (m_Device->m_Kind & ~DSM_KIND_ANY_VERSION) | Version;
183}
184
185/* Both reset requests are consumed, whatever the answer */
188{
192
193 if (Child->m_EnumRetryCount > 0)
194 {
195 Kind = DsmResetWarm;
196 }
197 else
198 {
200
201 if (Now.QuadPart - Child->m_LastResetTime.QuadPart < DEVICE_FAST_RESET_WINDOW)
202 Kind = DsmResetWarm;
203 else if (Child->HasState(ChildState::WarmResetOnEnumeration))
204 Kind = DsmResetWarm;
205 else if (Child->HasState(ChildState::HotResetOnEnumeration))
206 Kind = Child->HasHack(ChildHack::DisableHotReset) ? DsmResetWarm : DsmResetHot;
207
208 Child->m_LastResetTime = Now;
209 }
210
211 Child->ClearState(ChildState::WarmResetOnEnumeration);
212 Child->ClearState(ChildState::HotResetOnEnumeration);
213 return Kind;
214}
215
216/* Only asked for devices below SuperSpeed */
219{
222
223 if (Speed == UsbSuperSpeed)
224 {
226 return FALSE;
227 }
228
229 if (Status & PS_HIGH_SPEED)
230 return Speed != UsbHighSpeed;
231 if (Status & PS_LOW_SPEED)
232 return Speed != UsbLowSpeed;
233 return Speed != UsbFullSpeed;
234}
235
236/* A device that switched descriptors through MS OS 2.0 reports its pre-switch descriptor after a reset */
239{
241
244
246 {
247 DPRINT("Device %p descriptor differs from the cached one\n", m_Device);
248 return FALSE;
249 }
250
251 return TRUE;
252}
253
256{
257 return m_Device->HasHack(ChildHack::RequestConfigDescOnReset);
258}
259
260/* Fast enumeration skips the second reset of a USB 2 device on its first try */
263{
264 if (m_Device->HasHack(ChildHack::AlwaysSecondReset))
265 return TRUE;
266
268 return FALSE;
269
271 !HubDriver.HasFlag(HubGlobal::AlwaysSecondReset) &&
273 {
274 return FALSE;
275 }
276
277 return TRUE;
278}
279
282{
283 return !(m_Device->m_Kind & DSM_KIND_SUPER_SPEED) || m_Device->HasState(ChildState::FailedAnEnumeration);
284}
285
288{
289 return m_Device->HasHack(ChildHack::DisableSuperSpeed) && (m_Device->m_Kind & DSM_KIND_SUPER_SPEED);
290}
291
294{
295 return m_Device->HasProperty(ChildProperty::ChargingPolicySupported);
296}
297
300{
301 return m_Device->HasProperty(ChildProperty::DualRole);
302}
303
306{
308}
309
312{
313 return m_Device->HasHack(ChildHack::NoExitLatencyRequest);
314}
315
318{
319 return m_Device->HasHack(ChildHack::NoIsochDelayRequest);
320}
321
324{
325 return m_Device->HasProperty(ChildProperty::LtmCapable) &&
326 m_Device->HasProperty(ChildProperty::NotRemovable) &&
327 HubDriver.HasFlag(HubGlobal::EnableUsbLtm);
328}
329
332{
333 return m_Device->HasHack(ChildHack::DisableOnSoftRemove) &&
334 m_Device->m_Hub->HasFlag(HubFlag::DisableOnSoftRemove) &&
335 HubDriver.HasFlag(HubGlobal::DisableOnSoftRemove);
336}
337
340{
341 return m_Device->HasHack(ChildHack::ResetAfterIdleResume);
342}
343
346{
347 return m_Device->HasHack(ChildHack::ResetAfterSystemResume);
348}
349
350/* The controller lost the device: every enabled pipe has to be programmed again */
353{
357 ULONG Index;
358
359 if (!m_Device->HasState(ChildState::ReprogrammingPending))
360 return FALSE;
361
362 m_Device->ClearState(ChildState::ReprogrammingPending);
363
364 if (m_Device->m_Pdo != NULL)
365 InterlockedOr(&m_Device->m_Pdo->m_Flags, (LONG)PdoFlag::ProgrammingLostOnReset);
366
367 if (Config != NULL)
368 {
369 for (Entry = Config->Interfaces.Flink; Entry != &Config->Interfaces; Entry = Entry->Flink)
370 {
372
373 for (Index = 0; Index < Interface->PipeCount; Index++)
374 {
375 if (Interface->Pipes[Index].State == PipeState::Enabled)
376 Interface->Pipes[Index].State = PipeState::Disabled;
377 }
378 }
379 }
380
381 return TRUE;
382}
383
384VOID
386{
387 m_Device->ClearState(ChildState::ReprogrammingPending);
388}
389
390/* PnP does not see this enumeration */
391VOID
393{
394 DPRINT1("Device %p enumerated again behind PnP\n", m_Device);
395}
396
397VOID
399{
400 DPRINT1("Device %p port %u reset timed out\n", m_Device, m_Device->m_Port->Number());
402}
403
404VOID
406{
407 DPRINT1("Boot device %p failed to enumerate again\n", m_Device);
410 (ULONG_PTR)WdfDeviceWdmGetDeviceObject(m_Device->m_Pdo->m_Device),
412 0);
413}
414
415/* Duplicate serial number list in usbd.sys */
416
417/* The other device with this serial number is going away: poll until it has */
420{
422 USB_ID_STRING Serial;
424
425 if (Child->m_SerialNumber == NULL)
426 return DsmAddChildDone;
427
428 RtlZeroMemory(&Serial, sizeof(Serial));
429 Serial.LanguageId = Child->m_LanguageId;
430 Serial.LengthInBytes = Child->m_SerialNumberLength;
431 Serial.Buffer = Child->m_SerialNumber;
432
434 Child->m_Hub,
435 Child->m_Port->Number(),
437 Child->m_DeviceDescriptor.idVendor,
438 Child->m_DeviceDescriptor.idProduct,
439 &Serial);
440
441 switch (Result)
442 {
444 return DsmAddChildDone;
445
447 DPRINT("Device %p waits for a departing duplicate\n", Child);
449
451 DPRINT1("Device %p serial number already in use\n", Child);
453 return DsmAddChildFailed;
454
456 DPRINT1("Device %p could not be added to the device list\n", Child);
457 return DsmAddChildFailed;
458
459 default:
460 DPRINT1("Device %p unexpected device list answer\n", Child);
462 return DsmAddChildFailed;
463 }
464}
465
466VOID
468{
471}
472
473VOID
475{
478}
479
480/* Codes land in the per device bitmap the registry module writes out */
481VOID
482NTAPI
486{
487 RtlSetBit(&Child->m_ValidationBitmap, Code);
488}
489
490/* Gated on the serial number errata */
493{
494 if (m_Device->HasHack(ChildHack::DisableSerialNumber))
495 return FALSE;
496
498}
499
502{
504
505 return Pdo != NULL && Pdo->HasFlag(PdoFlag::WakeArmRequested);
506}
507
510{
512
513 return Pdo != NULL && Pdo->HasFlag(PdoFlag::ArmedForWake);
514}
515
516/* Function suspend clients manage their own remote wake */
519{
521
522 if (!m_Device->HasProperty(ChildProperty::RemoteWakeCapable))
523 return FALSE;
524
525 return Pdo == NULL || !Pdo->HasFlag(PdoFlag::ClientDoesFunctionSuspend);
526}
unsigned char BOOLEAN
Definition: actypes.h:127
#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
_In_ BOOLEAN Known
Definition: childpdo.cpp:3265
BOOLEAN ArmForWakeWanted()
Definition: devmisc.cpp:501
BOOLEAN DisarmOnResume()
Definition: devmisc.cpp:518
BOOLEAN DeviceProgrammingLost()
Definition: devmisc.cpp:352
HubChild * m_Device
Definition: devsm.h:1832
BOOLEAN SelSkipped()
Definition: devmisc.cpp:311
BOOLEAN DeviceArmedForWake()
Definition: devmisc.cpp:509
BOOLEAN SupportsPdCharging()
Definition: devmisc.cpp:293
BOOLEAN ResetOnResumeFromSx()
Definition: devmisc.cpp:345
BOOLEAN SetSpeedFor20()
Definition: devmisc.cpp:115
BOOLEAN ResetOnResumeFromS0()
Definition: devmisc.cpp:339
VOID MarkDisconnected()
Definition: devmisc.cpp:474
BOOLEAN NeedsSecondReset()
Definition: devmisc.cpp:262
DSM_ADD_CHILD AddChildToHub()
Definition: devmisc.cpp:419
VOID ClearReprogramNeeded()
Definition: devmisc.cpp:385
BOOLEAN EnumRetriesUsedUp()
Definition: devmisc.cpp:74
VOID LogReenumeration()
Definition: devmisc.cpp:392
BOOLEAN ProductStringIndexZero()
Definition: devmisc.cpp:305
BOOLEAN IsFirstEnumTry()
Definition: devmisc.cpp:30
BOOLEAN DeviceSpeedChanged()
Definition: devmisc.cpp:218
BOOLEAN IsochDelaySkipped()
Definition: devmisc.cpp:317
VOID ForgetChild()
Definition: devmisc.cpp:467
VOID RecordResetTimeout()
Definition: devmisc.cpp:398
BOOLEAN DualRoleSupported()
Definition: devmisc.cpp:299
BOOLEAN ProductNameWanted()
Definition: devmisc.cpp:492
BOOLEAN DuplicateRetriesUsedUp()
Definition: devmisc.cpp:98
BOOLEAN ConfigReadOnReset()
Definition: devmisc.cpp:255
BOOLEAN WaitNeededAfterAddress()
Definition: devmisc.cpp:281
BOOLEAN DisableWhenUnused()
Definition: devmisc.cpp:331
BOOLEAN SuperSpeedMustBeDisabled()
Definition: devmisc.cpp:287
BOOLEAN SameDeviceConnected()
Definition: devmisc.cpp:238
DSM_RESET_KIND ResetKindNeeded()
Definition: devmisc.cpp:187
VOID StartEnumRetries()
Definition: devmisc.cpp:59
VOID RecordDeviceVersion()
Definition: devmisc.cpp:149
VOID BugCheckForBootDevice()
Definition: devmisc.cpp:405
BOOLEAN LtmWanted()
Definition: devmisc.cpp:323
VOID StartDuplicateRetries()
Definition: devmisc.cpp:92
HubPort * m_Port
Definition: hubchild.h:317
VOID ClearState(_In_ ChildState Flag)
Definition: hubchild.h:274
USB_DEVICE_SPEED Speed() const
Definition: hubchild.cpp:36
USB_DEVICE_DESCRIPTOR m_OriginalDeviceDescriptor
Definition: hubchild.h:502
ULONG m_DuplicateRetryCount
Definition: hubchild.h:349
USB_DEVICE_DESCRIPTOR m_DeviceDescriptor
Definition: hubchild.h:386
ULONG m_EnumRetryCount
Definition: hubchild.h:348
UCHAR m_U1Timeout
Definition: hubchild.h:421
HubMsOs20Info m_MsOs20
Definition: hubchild.h:494
HubFdo * m_Hub
Definition: hubchild.h:316
ULONG m_Kind
Definition: hubchild.h:328
ULONG m_EnumMessageId
Definition: hubchild.h:355
VOID SetProperty(_In_ ChildProperty Flag)
Definition: hubchild.h:295
BOOLEAN HasProperty(_In_ ChildProperty Flag) const
Definition: hubchild.h:288
PWCHAR m_SerialNumber
Definition: hubchild.h:400
UCHAR m_U2Timeout
Definition: hubchild.h:422
UCHAR m_ScratchBuffer[256]
Definition: hubchild.h:393
HubPdo * m_Pdo
Definition: hubchild.h:318
HubConfiguration * m_CurrentConfig
Definition: hubchild.h:370
VOID SetState(_In_ ChildState Flag)
Definition: hubchild.h:267
USHORT m_EffectiveExitLatency
Definition: hubchild.h:454
BOOLEAN HasHack(_In_ ChildHack Flag) const
Definition: hubchild.h:281
BOOLEAN HasState(_In_ ChildState Flag) const
Definition: hubchild.h:260
BOOLEAN HasFlag(_In_ HubFlag Flag) const
Definition: fdo.h:153
WDFDEVICE m_Device
Definition: childpdo.h:55
volatile LONG m_Flags
Definition: childpdo.h:61
USHORT Number() const
Definition: hubport.h:213
HubPortStatus m_Current
Definition: hubport.h:244
#define RtlSetBit
Definition: dbgbitmap.h:344
#define HUB_MSOS20_ALT_ENUM
Definition: desccheck.h:490
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
#define HUB_VALIDATION_DUPLICATE_SERIAL
Definition: devmisc.cpp:20
VOID NTAPI HubLogDeviceValidationError(_In_ HubChild *Child, _In_ ULONG Code)
Definition: devmisc.cpp:483
#define DEVICE_ENUM_RETRY_LIMIT
Definition: devmisc.cpp:23
static VOID NTAPI HubForgetMsOs20(_Inout_ HubChild *Child)
Definition: devmisc.cpp:39
#define PS_LOW_SPEED
Definition: devmisc.cpp:26
#define DEVICE_DUPLICATE_RETRY_LIMIT
Definition: devmisc.cpp:14
#define PS_HIGH_SPEED
Definition: devmisc.cpp:27
#define DEVICE_FAST_RESET_WINDOW
Definition: devmisc.cpp:17
enum _DSM_RESET_KIND DSM_RESET_KIND
#define DSM_KIND_USB2X
Definition: devsm.h:144
#define DSM_KIND_PORT30
Definition: devsm.h:153
#define DSM_KIND_ANY_SPEED
Definition: devsm.h:151
#define DSM_KIND_SUPER_SPEED
Definition: devsm.h:150
#define DSM_KIND_USB1X
Definition: devsm.h:142
#define DSM_KIND_LOW_SPEED
Definition: devsm.h:149
enum _DSM_ADD_CHILD DSM_ADD_CHILD
@ DsmResetWarm
Definition: devsm.h:102
@ DsmResetHot
Definition: devsm.h:101
@ DsmResetNone
Definition: devsm.h:100
#define DSM_KIND_USB20
Definition: devsm.h:143
#define DSM_KIND_FULL_SPEED
Definition: devsm.h:148
#define DSM_KIND_HIGH_SPEED
Definition: devsm.h:147
#define DSM_KIND_USB10
Definition: devsm.h:141
#define DSM_KIND_USB3X
Definition: devsm.h:145
@ DsmAddChildFailed
Definition: devsm.h:118
@ DsmAddChildDone
Definition: devsm.h:116
@ DsmAddChildDuplicate
Definition: devsm.h:117
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HubDriverState HubDriver
Definition: entry.cpp:13
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
Status
Definition: gdiplustypes.h:24
@ AltEnumCommandSent
#define HUB_BOOT_DEVICE_IS_STORAGE
Definition: hubdriver.h:159
#define HUB_USB3_BOOT_DEVICE_FAILED
Definition: hubdriver.h:158
#define HUB_BUGCHECK_USB3
Definition: hubdriver.h:157
#define HUB_BOOT_DEVICE_IS_HUB
Definition: hubdriver.h:160
BOOLEAN NTAPI HubIdLanguageSupported(_In_ HubChild *Child, _In_ USHORT Language)
Definition: hubid.cpp:911
#define HUB_ENUM_PORT_RESET_FAILED
Definition: hubid.h:13
VOID NTAPI USBD_MarkDeviceAsDisconnected(_In_ PVOID DeviceContext)
Definition: hubsup.c:269
ULONG NTAPI USBD_AddDeviceToGlobalList(_In_ PVOID DeviceContext, _In_opt_ PVOID HubContext, _In_ ULONG PortNumber, _In_opt_ PVOID ConnectorNode, _In_ USHORT IdVendor, _In_ USHORT IdProduct, _In_ PUSB_ID_STRING SerialNumber)
Definition: hubsup.c:204
VOID NTAPI USBD_RemoveDeviceFromGlobalList(_In_ PVOID DeviceContext)
Definition: hubsup.c:286
PVOID NTAPI HubConnectorNodeForPort(_In_ HubPort *Port)
Definition: portconn.cpp:320
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
Definition: hubucx.h:280
#define HUB_TAG_DEVICE
Definition: hubutil.h:13
void ClearState()
#define InterlockedOr
Definition: interlocked.h:239
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
ULONG64 Serial
Definition: rhubpdo.cpp:335
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
struct tm * Now
Definition: output.c:19
#define DPRINT
Definition: sndvol32.h:73
BOOLEAN HasFlag(_In_ HubGlobal Flag) const
Definition: hubdriver.h:119
USB_PORT_STATUS_AND_CHANGE StatusChange
Definition: hubport.h:56
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
USB_PORT_STATUS PortStatus
Definition: usb200.h:241
USHORT AsUshort16
Definition: usb200.h:223
@ UsbSuperSpeed
Definition: usb200.h:45
@ UsbHighSpeed
Definition: usb200.h:44
@ UsbLowSpeed
Definition: usb200.h:42
@ UsbFullSpeed
Definition: usb200.h:43
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
#define USBD_GLOBAL_LIST_DUPLICATE_PENDING
Definition: usbdhub.h:20
#define USBD_GLOBAL_LIST_ADDED
Definition: usbdhub.h:19
#define USBD_GLOBAL_LIST_DUPLICATE
Definition: usbdhub.h:21
#define USBD_GLOBAL_LIST_NO_MEMORY
Definition: usbdhub.h:22
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
Definition: wdfdevice.h:1707
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
#define NT_ASSERT
Definition: rtlfuncs.h:3334