ReactOS 0.4.17-dev-1281-g065abb3
portacpi.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: ACPI description of hub ports: _ADR, _DSM, _DSD, _UPC and _PLD
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "usbhub3.h"
9#include "hubid.h"
10
11#include <acpiioct.h>
12
13#define NDEBUG
14#include <debug.h>
15
16/* Room for any method result this module reads */
17#define HUB_ACPI_RESULT_BYTES (sizeof(ACPI_EVAL_OUTPUT_BUFFER) + 1024)
18
19/* "<device path>.XXXX" plus the NUL must fit the 256 byte method name */
20#define HUB_ACPI_METHOD_SUFFIX 6U
21
22/* _UPC connector type of a Type-C connector carrying USB 2 and SuperSpeed without a mux */
23#define HUB_UPC_TYPE_C_NO_SWITCH 0x0A
24
25/* _UPC: Connectable, connector type and two reserved values */
26#define HUB_UPC_ELEMENTS 4
27
28/* The first 16 bytes of _PLD are all the port keeps */
29#define HUB_PLD_BYTES 16
30
31/* USB _DSM {CE2EE385-00E6-48CB-9F05-2EDB927C4899}, revision 0, function 2: interconnect type */
32static const GUID HubUsbDsmGuid =
33 { 0xCE2EE385, 0x00E6, 0x48CB, { 0x9F, 0x05, 0x2E, 0xDB, 0x92, 0x7C, 0x48, 0x99 } };
34
35#define HUB_DSM_REVISION 0
36#define HUB_DSM_INTERCONNECT_TYPE 2
37
38/* Function 5 returns 1 when U2 must stay off for the port */
39#define HUB_DSM_DISABLE_U2 5
40
41/* _DSD device properties {DAFFD814-6EBA-4D8C-8A91-BC9BBF4AA301} */
43 { 0xDAFFD814, 0x6EBA, 0x4D8C, { 0x8A, 0x91, 0xBC, 0x9B, 0xBF, 0x4A, 0xA3, 0x01 } };
44
45/* Port property naming the USB4 host router the port is tunneled through */
46static const CHAR HubUsb4HostProperty[] = "usb4-host-interface";
47
48/* A property entry is a package of the name and the value */
49#define HUB_DSD_ENTRY_MIN_BYTES 16
50
51/* Header, a 16 byte buffer, two integers and an empty package */
52#define HUB_DSM_INPUT_BYTES (FIELD_OFFSET(ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX, Argument) + \
53 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(GUID)) + \
54 2 * ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) + \
55 ACPI_METHOD_ARGUMENT_LENGTH(0))
56
61
63static
68 _In_ size_t Bytes,
69 _Out_ WDFMEMORY* Memory,
71{
74
76 Attributes.ParentObject = Hub->m_Device;
77
79 if (!NT_SUCCESS(Status))
80 {
81 DPRINT1("Hub %p ACPI buffer of %lu bytes failed 0x%lx\n", Hub, (ULONG)Bytes, Status);
82 *Memory = NULL;
83 *Buffer = NULL;
84 return Status;
85 }
86
88 return STATUS_SUCCESS;
89}
90
91static
92VOID
95 _In_opt_ WDFMEMORY Memory)
96{
97 if (Memory != NULL)
99}
100
101/* Synchronous internal IOCTL to the ACPI filter on the hub's PDO, if there is one */
103static
105NTAPI
106HubAcpiSend(
107 _In_ HubFdo* Hub,
109 _In_ WDFMEMORY Input,
110 _In_ WDFMEMORY Output,
112{
115
118
119 *Information = 0;
121 NULL,
125 NULL,
127}
128
129/* METHOD EVALUATION *********************************************************/
130
131/* STATUS_NO_SUCH_DEVICE may still come with a result; only _DSM looks at it */
133static
135NTAPI
136HubAcpiEvaluate(
137 _In_ HubFdo* Hub,
138 _In_ WDFMEMORY Input,
139 _In_ WDFMEMORY Output,
141{
146
149 {
151 DPRINT1("Hub %p ACPI %s failed 0x%lx\n", Hub, Method->MethodName, Status);
152 return Status;
153 }
154
155 if (Result->Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE || Result->Count == 0)
156 {
157 DPRINT1("Hub %p ACPI %s returned no usable result\n", Hub, Method->MethodName);
159 }
160
161 return Status;
162}
163
165static
167NTAPI
173{
174 if (Device->Length + HUB_ACPI_METHOD_SUFFIX > sizeof(Input->MethodName))
175 {
176 DPRINT1("ACPI device path %Z is too long for a method name\n", Device);
178 }
179
181 Input->Size = sizeof(*Input);
182 Input->ArgumentCount = ArgumentCount;
183
184 RtlCopyMemory(Input->MethodName, Device->Buffer, Device->Length);
185 Input->MethodName[Device->Length] = '.';
186 RtlCopyMemory(&Input->MethodName[Device->Length + 1], Method, 4);
187 Input->MethodName[Device->Length + 5] = ANSI_NULL;
188 return STATUS_SUCCESS;
189}
190
193static
195NTAPI
196HubAcpiEvaluateMethod(
197 _In_ HubFdo* Hub,
200 _In_ WDFMEMORY Output)
201{
203 WDFMEMORY InputMemory;
205
207 if (!NT_SUCCESS(Status))
208 return Status;
209
212 {
213 RtlZeroMemory(WdfMemoryGetBuffer(Output, NULL), HUB_ACPI_RESULT_BYTES);
214 Status = HubAcpiEvaluate(Hub, InputMemory, Output, FALSE);
215 }
216
218 return Status;
219}
220
221/* The Size field is the structure size, not the 312 bytes sent */
223static
225NTAPI
226HubAcpiEvaluateDsm(
227 _In_ HubFdo* Hub,
230 _In_ WDFMEMORY Output)
231{
234 WDFMEMORY InputMemory;
236
238 if (!NT_SUCCESS(Status))
239 return Status;
240
241 Status = HubAcpiPrepareInput(Input, Device, "_DSM", 4);
243 {
245 return Status;
246 }
247
248 Argument = Input->Argument;
250 Argument->DataLength = sizeof(HubUsbDsmGuid);
252
255 Argument->DataLength = sizeof(ULONG);
256 Argument->Argument = HUB_DSM_REVISION;
257
260 Argument->DataLength = sizeof(ULONG);
261 Argument->Argument = Function;
262
265 Argument->DataLength = 0;
266
268 Status = HubAcpiEvaluate(Hub, InputMemory, Output, TRUE);
269
271 return Status;
272}
273
274/* CHILD ENUMERATION *********************************************************/
275
276/* A 20 byte output only queries the size, returned in NumberOfChildren with STATUS_BUFFER_OVERFLOW */
278static
280NTAPI
281HubAcpiEnumChildren(
282 _In_ HubFdo* Hub,
283 _In_ WDFMEMORY Output,
285{
288 WDFMEMORY InputMemory;
291
293 if (!NT_SUCCESS(Status))
294 return Status;
295
298 Input->NameLength = 0;
299
302
304 return Status;
305
307 {
308 DPRINT1("Hub %p ACPI child enumeration failed 0x%lx\n", Hub, Status);
309 return Status;
310 }
311
313 {
315 Children->Signature != ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE ||
316 Children->NumberOfChildren < sizeof(ACPI_ENUM_CHILDREN_OUTPUT_BUFFER))
317 {
318 DPRINT1("Hub %p ACPI child enumeration size query is invalid 0x%lx\n", Hub, Status);
320 }
321
323 }
324
325 if (!NT_SUCCESS(Status))
326 {
327 DPRINT1("Hub %p ACPI child enumeration overflowed %lu bytes\n", Hub, (ULONG)OutputBytes);
328 return Status;
329 }
330
331 if (Children->Signature != ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE ||
332 Children->NumberOfChildren == 0 ||
334 {
335 DPRINT1("Hub %p ACPI child enumeration returned no children\n", Hub);
337 }
338
340}
341
342/* ONE PORT ******************************************************************/
343
345static
347NTAPI
349 _In_ WDFMEMORY Output,
351{
353
354 *Value = 0;
355 if (Result->Count == 0 || Result->Argument[0].Type != ACPI_METHOD_ARGUMENT_INTEGER)
356 return FALSE;
357
358 *Value = Result->Argument[0].Argument;
359 return TRUE;
360}
361
362/* The interconnect type is only kept for diagnostics */
364static
365VOID
366NTAPI
367HubAcpiReadInterconnect(
368 _In_ HubFdo* Hub,
371 _In_ WDFMEMORY Output)
372{
373 ULONG Value;
374
376 return;
377
379 {
380 DPRINT1("Port %u: _DSM interconnect type is not an integer (platform compliance)\n", Port->Number());
381 return;
382 }
383
385 if (Port->m_InterconnectType > 2)
386 DPRINT1("Port %u: unknown interconnect type %u\n", Port->Number(), Port->m_InterconnectType);
387 else if (Port->m_InterconnectType != 0)
388 DPRINT("Port %u is %s\n", Port->Number(), (Port->m_InterconnectType == 1) ? "HSIC" : "SSIC");
389}
390
391/* Only a result of exactly 1 sets the flag; nothing clears it */
393static
394VOID
395NTAPI
396HubAcpiReadNoU2(
397 _In_ HubFdo* Hub,
400 _In_ WDFMEMORY Output)
401{
402 ULONG Value;
403
404 if (!NT_SUCCESS(HubAcpiEvaluateDsm(Hub, Device, HUB_DSM_DISABLE_U2, Output)))
405 return;
406
408 {
409 DPRINT1("Port %u: _DSM U2 setting is not an integer (platform compliance)\n", Port->Number());
410 return;
411 }
412
413 if (Value == 0)
414 return;
415
416 if (Value != 1)
417 {
418 DPRINT1("Port %u: unknown _DSM U2 setting %lu\n", Port->Number(), Value);
419 return;
420 }
421
422 DPRINT("Port %u: platform keeps U2 off\n", Port->Number());
424}
425
427static
429NTAPI
430HubAcpiArgumentFits(
433{
435
436 return Data <= End && Argument->DataLength <= (ULONG)(End - Data);
437}
438
443static
445NTAPI
446HubAcpiFindUsb4Host(
447 _In_ WDFMEMORY Output,
449{
453 PACPI_METHOD_ARGUMENT Package = NULL;
457 PUCHAR PackageEnd;
458 PUCHAR EntryEnd;
459 ULONG Index;
460
461 *Value = NULL;
462
463 for (Index = 0;
464 Index < Result->Count && HubAcpiArgumentFits(Argument, End);
466 {
467 if ((Index & 1) != 0 ||
469 Argument->DataLength != sizeof(GUID) ||
471 {
472 continue;
473 }
474
476 if (HubAcpiArgumentFits(Next, End) && Next->Type == ACPI_METHOD_ARGUMENT_PACKAGE)
477 {
478 Package = Next;
479 break;
480 }
481 }
482
483 if (Package == NULL)
484 return STATUS_UNSUCCESSFUL;
485
486 PackageEnd = Package->Data + Package->DataLength;
487
488 for (Entry = (PACPI_METHOD_ARGUMENT)Package->Data;
489 HubAcpiArgumentFits(Entry, PackageEnd);
491 {
493 continue;
494
496 EntryEnd = Entry->Data + Entry->DataLength;
497
498 if (!HubAcpiArgumentFits(Name, EntryEnd) ||
500 Name->DataLength != sizeof(HubUsb4HostProperty) ||
501 strncmp((PCSTR)Name->Data, HubUsb4HostProperty, sizeof(HubUsb4HostProperty) - 1) != 0)
502 {
503 continue;
504 }
505
506 /* A device reference in the ASL arrives as the path string of that device */
508 if (!HubAcpiArgumentFits(Next, EntryEnd))
509 return STATUS_ACPI_FATAL;
510
513
514 *Value = Next;
515 return STATUS_SUCCESS;
516 }
517
518 return STATUS_UNSUCCESSFUL;
519}
520
521/* Widens the ASCII path into a string owned by the hub */
523static
525NTAPI
526HubAcpiCreateHostName(
527 _In_ HubFdo* Hub,
529 _Out_ WDFSTRING* Name)
530{
533 PWCHAR Wide;
534 ULONG Chars = 0;
535 ULONG Index;
537
538 while (Chars < Value->DataLength && Value->Data[Chars] != ANSI_NULL)
539 Chars++;
540
541 if (Chars == 0 || Chars > MAXUSHORT / sizeof(WCHAR))
543
545 if (Wide == NULL)
547
548 for (Index = 0; Index < Chars; Index++)
549 Wide[Index] = (WCHAR)Value->Data[Index];
550
551 Text.Buffer = Wide;
552 Text.Length = (USHORT)(Chars * sizeof(WCHAR));
554
556 Attributes.ParentObject = Hub->m_Device;
557
558 Status = WdfStringCreate(&Text, &Attributes, Name);
559
561 return Status;
562}
563
569static
571NTAPI
572HubAcpiBindUsb4Host(
573 _In_ HubFdo* Hub,
576 _In_ WDFMEMORY Output)
577{
579 WDFSTRING Name = Hub->m_Usb4HostName;
581
582 if (Name == NULL)
583 {
584 if (!NT_SUCCESS(HubAcpiEvaluateMethod(Hub, Device, "_DSD", Output)))
585 return STATUS_SUCCESS;
586
587 Status = HubAcpiFindUsb4Host(Output, &Value);
588 if (NT_SUCCESS(Status))
589 Status = HubAcpiCreateHostName(Hub, Value, &Name);
590
591 if (!NT_SUCCESS(Status))
592 {
594 DPRINT1("Port %u: _DSD USB4 host is unusable 0x%lx\n", Port->Number(), Status);
595 return STATUS_SUCCESS;
596 }
597 }
598
599 Status = HubUsb4BindPort(Hub, Port, Name);
600 if (!NT_SUCCESS(Status))
601 DPRINT1("Port %u not bound to its USB4 host 0x%lx\n", Port->Number(), Status);
602
603 return Status;
604}
605
606/* Elements stored before an error, or past a short package, are left as they are */
607static
609NTAPI
610HubAcpiStoreUpc(
612 _In_ WDFMEMORY Output)
613{
616 PACPI_METHOD_ARGUMENT Element = Result->Argument;
617 ULONG Index;
618
619 if (Result->Count == 0)
621
622 for (Index = 0;
623 Index < Result->Count &&
626 Index++, Element = ACPI_METHOD_NEXT_ARGUMENT(Element))
627 {
628 if (Index >= HUB_UPC_ELEMENTS)
630
631 if (Element->Type != ACPI_METHOD_ARGUMENT_INTEGER)
633
634 switch (Index)
635 {
636 case 0:
637 Port->m_AcpiUpc.Connectable = (UCHAR)Element->Argument;
638 break;
639
640 case 1:
641 Port->m_AcpiUpc.ConnectorType = (UCHAR)Element->Argument;
642 break;
643
644 case 2:
645 Port->m_AcpiUpc.Reserved0 = Element->Argument;
646 break;
647
648 default:
649 Port->m_AcpiUpc.Reserved1 = Element->Argument;
650 break;
651 }
652 }
653
654 return STATUS_SUCCESS;
655}
656
657/* "Type-C without switch" is never cleared once a _UPC reported it */
659static
661NTAPI
662HubAcpiReadUpc(
663 _In_ HubFdo* Hub,
666 _In_ WDFMEMORY Output)
667{
669
670 Status = HubAcpiEvaluateMethod(Hub, Device, "_UPC", Output);
671 if (NT_SUCCESS(Status))
672 Status = HubAcpiStoreUpc(Port, Output);
673
674 if (!NT_SUCCESS(Status))
675 {
676 DPRINT1("Port %u: _UPC unusable: 0x%lx\n", Port->Number(), Status);
677 return FALSE;
678 }
679
681
682 if (Port->m_AcpiUpc.Connectable == 0)
684 else
686
689
690 return TRUE;
691}
692
694static
695VOID
696NTAPI
697HubAcpiReadPld(
698 _In_ HubFdo* Hub,
701 _In_ WDFMEMORY Output)
702{
705
706 Status = HubAcpiEvaluateMethod(Hub, Device, "_PLD", Output);
707 if (!NT_SUCCESS(Status))
708 {
709 DPRINT1("Port %u: _PLD failed: 0x%lx\n", Port->Number(), Status);
710 return;
711 }
712
713 if (Result->Count == 0 ||
714 Result->Argument[0].Type != ACPI_METHOD_ARGUMENT_BUFFER ||
715 Result->Argument[0].DataLength < HUB_PLD_BYTES)
716 {
717 DPRINT1("Port %u: _PLD buffer unusable\n", Port->Number());
718 return;
719 }
720
721 RtlCopyMemory(&Port->m_AcpiPld, Result->Argument[0].Data, HUB_PLD_BYTES);
723
726
728}
729
730/* The child's _ADR is the port number; fails only when binding fails */
732static
734NTAPI
735HubAcpiReadPort(
736 _In_ HubFdo* Hub,
738 _In_ WDFMEMORY Output)
739{
740 HubPort* Port;
744
745 if (!NT_SUCCESS(HubAcpiEvaluateMethod(Hub, Device, "_ADR", Output)) ||
747 {
748 return STATUS_SUCCESS;
749 }
750
752 if (PortNumber == 0 || PortNumber > Hub->m_PortCount)
753 {
754 DPRINT1("Hub %p: ACPI port address %u out of range (platform compliance)\n", Hub, PortNumber);
755 return STATUS_SUCCESS;
756 }
757
759 if (Port == NULL)
760 return STATUS_SUCCESS;
761
762 HubAcpiReadInterconnect(Hub, Port, Device, Output);
763
764 if (Port->IsUsb30())
765 {
766 Status = HubAcpiBindUsb4Host(Hub, Port, Device, Output);
767 if (!NT_SUCCESS(Status))
768 return Status;
769 }
770
771 HubAcpiReadNoU2(Hub, Port, Device, Output);
772
773 if (!HubAcpiReadUpc(Hub, Port, Device, Output))
774 return STATUS_SUCCESS;
775
776 HubAcpiReadPld(Hub, Port, Device, Output);
777 return STATUS_SUCCESS;
778}
779
780/*
781 * A hub without ACPI nodes simply keeps its descriptor values. Only a port
782 * that cannot be bound to its USB4 host router ends the walk with an error.
783 */
786NTAPI
787HubAcpiReadPortAttributes(
788 _In_ HubFdo* Hub)
789{
792 WDFMEMORY SizeMemory = NULL;
793 WDFMEMORY ChildMemory = NULL;
794 WDFMEMORY ResultMemory = NULL;
797 ULONG ChildBytes;
798 ULONG Index;
801
802 PAGED_CODE();
803
804 Status = HubAcpiAllocate(Hub, sizeof(*Children), &SizeMemory, (PVOID*)&Children);
805 if (!NT_SUCCESS(Status))
806 goto Done;
807
808 Status = HubAcpiEnumChildren(Hub, SizeMemory, sizeof(*Children));
810 {
812 DPRINT("Hub %p has no ACPI namespace node\n", Hub);
813 goto Done;
814 }
815
816 DPRINT("Hub %p has an ACPI namespace node\n", Hub);
817
818 ChildBytes = Children->NumberOfChildren;
819 Status = HubAcpiAllocate(Hub, ChildBytes, &ChildMemory, (PVOID*)&Children);
820 if (!NT_SUCCESS(Status))
821 goto Done;
822
823 Status = HubAcpiEnumChildren(Hub, ChildMemory, ChildBytes);
824 if (!NT_SUCCESS(Status))
825 goto Done;
826
828 if (!NT_SUCCESS(Status))
829 goto Done;
830
831 /* The first child is the hub itself */
832 Child = Children->Children;
833 for (Index = 1; Index < Children->NumberOfChildren; Index++)
834 {
836
837 if ((PUCHAR)Child + FIELD_OFFSET(ACPI_ENUM_CHILD, Name) > (PUCHAR)Children + ChildBytes ||
838 (PUCHAR)ACPI_ENUM_CHILD_NEXT(Child) > (PUCHAR)Children + ChildBytes)
839 {
840 break;
841 }
842
843 if (!(Child->Flags & ACPI_OBJECT_HAS_CHILDREN) || Child->NameLength == 0)
844 continue;
845
846 Device.Buffer = Child->Name;
847 Device.Length = (USHORT)(Child->NameLength - 1);
848 Device.MaximumLength = (USHORT)Child->NameLength;
849
850 Result = HubAcpiReadPort(Hub, &Device, ResultMemory);
851 if (!NT_SUCCESS(Result))
852 break;
853 }
854
855Done:
856 HubAcpiFree(ResultMemory);
857 HubAcpiFree(ChildMemory);
858 HubAcpiFree(SizeMemory);
859 return Result;
860}
#define PAGED_CODE()
ACPI_METHOD_ARGUMENT UNALIGNED * PACPI_METHOD_ARGUMENT
Definition: acpiioct.h:80
#define ACPI_METHOD_NEXT_ARGUMENT(Argument)
Definition: acpiioct.h:159
#define ACPI_ENUM_CHILD_NEXT(Child)
Definition: acpiioct.h:182
#define ACPI_METHOD_ARGUMENT_STRING
Definition: acpiioct.h:31
#define ACPI_METHOD_ARGUMENT_INTEGER
Definition: acpiioct.h:30
#define ENUM_CHILDREN_IMMEDIATE_ONLY
Definition: acpiioct.h:41
struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX * PACPI_EVAL_INPUT_BUFFER_COMPLEX_EX
#define IOCTL_ACPI_ENUM_CHILDREN
Definition: acpiioct.h:201
#define ACPI_METHOD_ARGUMENT_BUFFER
Definition: acpiioct.h:32
#define IOCTL_ACPI_EVAL_METHOD_EX
Definition: acpiioct.h:199
#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:16
#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE_EX
Definition: acpiioct.h:27
#define ACPI_ENUM_CHILDREN_INPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:23
ACPI_ENUM_CHILDREN_OUTPUT_BUFFER UNALIGNED * PACPI_ENUM_CHILDREN_OUTPUT_BUFFER
Definition: acpiioct.h:151
#define ACPI_OBJECT_HAS_CHILDREN
Definition: acpiioct.h:39
#define ACPI_METHOD_ARGUMENT_PACKAGE
Definition: acpiioct.h:33
ACPI_ENUM_CHILD UNALIGNED * PACPI_ENUM_CHILD
Definition: acpiioct.h:144
ACPI_EVAL_OUTPUT_BUFFER UNALIGNED * PACPI_EVAL_OUTPUT_BUFFER
Definition: acpiioct.h:99
#define ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:22
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
HubFdo * Hub
Definition: bootdev.cpp:261
Definition: bufpool.h:45
Definition: fdo.h:132
WDFSTRING m_Usb4HostName
Definition: fdo.h:464
WDFDEVICE m_Device
Definition: fdo.h:349
VOID SetFlag(_In_ HubFlag Flag)
Definition: fdo.h:160
ULONG m_PortCount
Definition: fdo.h:379
HubPort * FindPort(_In_ ULONG PortNumber)
Definition: fanout.cpp:42
USHORT Number() const
Definition: hubport.h:213
HubAcpiUpc m_AcpiUpc
Definition: hubport.h:261
BOOLEAN IsUsb30() const
Definition: hubport.h:219
USHORT m_InterconnectType
Definition: hubport.h:265
VOID SetFlag(_In_ PortFlag Flag)
Definition: hubport.h:192
HubAcpiPld m_AcpiPld
Definition: hubport.h:262
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
PUCHAR End
Definition: desccheck.cpp:2229
LPWSTR Name
Definition: desk.c:124
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
KEVENT Done
Definition: devreq.cpp:1162
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG _In_ PVOID Argument
Definition: dispmprt.h:1288
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG DataLength
Definition: dispmprt.h:233
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_ACRTIMP int __cdecl strncmp(const char *, const char *, size_t)
Definition: string.c:3335
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:24
FORCEINLINE VOID NTAPI HubClearPortProperty(_In_ HubPort *Port, _In_ PortProperty Property)
Definition: hubid.h:87
FORCEINLINE VOID NTAPI HubSetPortProperty(_In_ HubPort *Port, _In_ PortProperty Property)
Definition: hubid.h:77
ULONG Chars
Definition: hubtunnel.cpp:833
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_ ULONG PortNumber
Definition: hubucx.h:272
#define HUB_TAG_HUB
Definition: hubutil.h:12
#define HUB_TAG_PORT
Definition: hubutil.h:14
#define C_ASSERT(e)
Definition: intsafe.h:73
if(dx< 0)
Definition: linetemp.h:194
_In_ UINT Bytes
Definition: mmcopy.h:9
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define min(a, b)
Definition: monoChain.cc:55
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Outptr_result_bytebuffer_(s)
Definition: no_sal2.h:288
#define _Outptr_result_maybenull_
Definition: no_sal2.h:266
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define ANSI_NULL
#define STATUS_ACPI_INVALID_OBJTYPE
Definition: ntstatus.h:1656
#define STATUS_ACPI_INVALID_ARGTYPE
Definition: ntstatus.h:1655
#define STATUS_ACPI_INVALID_DATA
Definition: ntstatus.h:1662
#define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT
Definition: ntstatus.h:1658
#define STATUS_ACPI_FATAL
Definition: ntstatus.h:1653
short WCHAR
Definition: pedump.c:58
unsigned short USHORT
Definition: pedump.c:61
char CHAR
Definition: pedump.c:57
static WCHAR Address[46]
Definition: ping.c:68
#define HUB_DSM_REVISION
Definition: portacpi.cpp:35
static const GUID HubUsbDsmGuid
Definition: portacpi.cpp:32
#define HUB_UPC_ELEMENTS
Definition: portacpi.cpp:26
_In_ HubPort * Port
Definition: portacpi.cpp:369
static VOID NTAPI HubAcpiFree(_In_opt_ WDFMEMORY Memory)
Definition: portacpi.cpp:94
_In_ PCANSI_STRING Device
Definition: portacpi.cpp:198
_In_ ULONG _In_ WDFMEMORY _In_ WDFMEMORY Output
Definition: portacpi.cpp:110
WDFMEMORY InputMemory
Definition: portacpi.cpp:203
#define HUB_PLD_BYTES
Definition: portacpi.cpp:29
static NTSTATUS NTAPI HubAcpiPrepareInput(_Out_ PACPI_EVAL_INPUT_BUFFER_COMPLEX_EX Input, _In_ PCANSI_STRING Device, _In_reads_(4) PCSTR Method, _In_ ULONG ArgumentCount)
Definition: portacpi.cpp:168
static NTSTATUS NTAPI HubAcpiAllocate(_In_ HubFdo *Hub, _In_ size_t Bytes, _Out_ WDFMEMORY *Memory, _Outptr_result_bytebuffer_(Bytes) PVOID *Buffer)
Definition: portacpi.cpp:66
#define HUB_DSM_INPUT_BYTES
Definition: portacpi.cpp:52
static const CHAR HubUsb4HostProperty[]
Definition: portacpi.cpp:46
_In_ PCANSI_STRING _In_ ULONG Function
Definition: portacpi.cpp:229
NTSTATUS Status
Definition: portacpi.cpp:145
_In_ WDFMEMORY _In_ size_t OutputBytes
Definition: portacpi.cpp:285
PACPI_METHOD_ARGUMENT Argument
Definition: portacpi.cpp:233
#define HUB_DSD_ENTRY_MIN_BYTES
Definition: portacpi.cpp:49
return STATUS_SUCCESS
Definition: portacpi.cpp:339
_In_ ULONG _In_ WDFMEMORY Input
Definition: portacpi.cpp:109
PACPI_EVAL_INPUT_BUFFER_COMPLEX_EX Method
Definition: portacpi.cpp:143
#define HUB_UPC_TYPE_C_NO_SWITCH
Definition: portacpi.cpp:23
WDF_MEMORY_DESCRIPTOR_INIT_HANDLE & InputDescriptor
Definition: portacpi.cpp:116
static BOOLEAN NTAPI HubAcpiResultInteger(_In_ WDFMEMORY Output, _Out_ PULONG Value)
Definition: portacpi.cpp:348
static const GUID HubDsdPropertiesGuid
Definition: portacpi.cpp:42
return WdfIoTargetSendInternalIoctlSynchronously(WdfDeviceGetIoTarget(Hub->m_Device), NULL, IoControlCode, &InputDescriptor, &OutputDescriptor, NULL, Information)
_In_ WDFMEMORY _In_ WDFMEMORY _In_ BOOLEAN CheckResultOnNoDevice
Definition: portacpi.cpp:141
_In_ ULONG _In_ WDFMEMORY _In_ WDFMEMORY _Out_ PULONG_PTR Information
Definition: portacpi.cpp:112
#define HUB_DSM_DISABLE_U2
Definition: portacpi.cpp:39
#define HUB_ACPI_RESULT_BYTES
Definition: portacpi.cpp:17
#define HUB_ACPI_METHOD_SUFFIX
Definition: portacpi.cpp:20
WDF_MEMORY_DESCRIPTOR OutputDescriptor
Definition: portacpi.cpp:114
#define HUB_DSM_INTERCONNECT_TYPE
Definition: portacpi.cpp:36
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
PACPI_METHOD_ARGUMENT Next
Definition: slotdev.cpp:96
Input ArgumentCount
Definition: slotdev.cpp:121
#define DPRINT
Definition: sndvol32.h:73
ULONG UserVisible
Definition: hubport.h:117
ULONG Reserved1
Definition: hubport.h:106
UCHAR ConnectorType
Definition: hubport.h:104
ULONG Reserved0
Definition: hubport.h:105
UCHAR Connectable
Definition: hubport.h:103
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint32_t * PULONG_PTR
Definition: typedefs.h:65
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
const char * PCSTR
Definition: typedefs.h:52
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define MAXUSHORT
Definition: typedefs.h:83
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint16_t * PWCHAR
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
@ InAcpiNamespace
UNICODE_STRING Text
Definition: userreq.cpp:261
WdfObjectDelete(String)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
_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
FORCEINLINE VOID WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(_Out_ PWDF_MEMORY_DESCRIPTOR Descriptor, _In_ WDFMEMORY Memory, _In_opt_ PWDFMEMORY_OFFSET Offsets)
Definition: wdfmemory.h:117
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1049
_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