ReactOS 0.4.16-dev-1972-gf20c09f
Bus_PDO_EvalMethod.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Unit Tests for acpi!Bus_PDO_EvalMethod (IOCTL_ACPI_EVAL_METHOD handler)
5 * COPYRIGHT: Copyright 2024 Dmitry Borisov (di.sean@protonmail.com)
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include <apitest.h>
11
12#define WIN32_NO_STATUS
13#include <ndk/rtlfuncs.h>
14
15#define UNIT_TEST
16#include <acpi.h>
17
18#include <acpiioct.h>
19#include <ntintsafe.h>
20#include <initguid.h>
21
22/* TEST DEFINITIONS ***********************************************************/
23
24#define ok_eq_str_ex(entry, value, expected) \
25 ok(!strcmp(value, expected), \
26 "Line %lu: " #value " = \"%s\", expected \"%s\"\n", (entry)->Line, value, expected)
27
28#define ok_eq_print_ex(entry, value, expected, spec) \
29 ok((value) == (expected), \
30 "Line %lu: " #value " = " spec ", expected " spec "\n", (entry)->Line, value, expected)
31
32#define ok_not_print_ex(entry, value, expected, spec) \
33 ok((value) != (expected), \
34 "Line %lu: " #value " = " spec ", expected " spec "\n", (entry)->Line, value, expected)
35
36#define ok_eq_hex_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "0x%08lx")
37#define ok_eq_pointer_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "%p")
38#define ok_eq_int_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "%d")
39#define ok_eq_uint_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "%u")
40#define ok_eq_ulong_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "%lu")
41#define ok_eq_ulonglong_ex(entry, value, expected) ok_eq_print_ex(entry, value, expected, "%I64u")
42
43#define ok_not_pointer_ex(entry, value, expected) ok_not_print_ex(entry, value, expected, "%p")
44
45typedef struct _EVAL_TEST_ENTRY
46{
48
50#define STM_TEST_FLAG_INVALID_ARG_3_1 (1 << 0 )
51#define STM_TEST_FLAG_INVALID_ARG_3_2 (1 << 1 )
52#define STM_TEST_FLAG_INVALID_ARG_3_4 (1 << 2 )
53#define STM_TEST_FLAG_INVALID_ARG_3_5 (1 << 3 )
54#define STM_TEST_FLAG_INVALID_SIZE_1 (1 << 4 )
55#define STM_TEST_FLAG_LARGE_ARG_BUFFER (1 << 5 )
56#define STM_TEST_FLAG_CHANGE_ARG_COUNT (1 << 6 )
57#define STM_TEST_FLAG_SUB_IN_BUFFER (1 << 7 )
58#define STM_TEST_FLAG_SUB_IRP_BUFFER (1 << 8 )
59#define STM_TEST_FLAG_SET_IN_BUFFER (1 << 9 )
60#define STM_TEST_FLAG_SET_IRP_BUFFER (1 << 10)
61#define STM_TEST_FLAG_BAD_ARG_TYPE (1 << 11)
62#define STM_TEST_FLAG_IS_TODO (1 << 12)
63
64#define GTM_TEST_FLAG_BAD_SIGNARUTE (1 << 0)
65#define GTM_TEST_FLAG_BUFFER_HAS_SIGNARUTE (1 << 1)
66#define GTM_TEST_FLAG_BUFFER_HAS_COUNT (1 << 2)
67#define GTM_TEST_FLAG_BUFFER_HAS_LENGTH (1 << 3)
68#define GTM_TEST_FLAG_ARG_HAS_BUFFER_TYPE (1 << 4)
69#define GTM_TEST_FLAG_ARG_HAS_DATA_LENGTH (1 << 5)
70#define GTM_TEST_FLAG_INC_OUT_BUFFER (1 << 6)
71#define GTM_TEST_FLAG_DEC_OUT_BUFFER (1 << 7)
72#define GTM_TEST_FLAG_SET_OUT_BUFFER (1 << 8)
73#define GTM_TEST_FLAG_IS_TODO (1 << 9)
74
75#define GTM_TEST_FLAG_METHOD_SUCCESS \
76 (GTM_TEST_FLAG_BUFFER_HAS_SIGNARUTE | \
77 GTM_TEST_FLAG_BUFFER_HAS_COUNT | GTM_TEST_FLAG_BUFFER_HAS_LENGTH | \
78 GTM_TEST_FLAG_ARG_HAS_BUFFER_TYPE | GTM_TEST_FLAG_ARG_HAS_DATA_LENGTH)
79
80#define DSM_TEST_FLAG_EMPTY_PACKAGE (1 << 0)
81#define DSM_TEST_FLAG_LARGE_SUB_PACKAGE_BUFFER (1 << 1)
82
86
87/* KERNEL DEFINITIONS (MOCK) **************************************************/
88
89#define PAGED_CODE()
90#define CODE_SEG(...)
91#define DPRINT(...) do { if (0) DbgPrint(__VA_ARGS__); } while (0)
92#define DPRINT1(...) do { if (0) DbgPrint(__VA_ARGS__); } while (0)
93
94typedef struct _IO_STACK_LOCATION
95{
96 union
97 {
98 struct
99 {
105
106typedef struct _IRP
107{
108 union
109 {
113
117
119
120#define ExAllocatePoolUninitialized ExAllocatePoolWithTag
121#define NonPagedPool 1
122static
123PVOID
125{
126 PULONG_PTR Mem;
127
128 Mem = HeapAlloc(GetProcessHeap(), 0, NumberOfBytes + 2 * sizeof(PVOID));
129 Mem[0] = NumberOfBytes;
130 Mem[1] = Tag;
131
133
134 return (PVOID)(Mem + 2);
135}
136
137static
138VOID
140{
141 PULONG_PTR Mem = MemPtr;
142
143 Mem -= 2;
144 ok(Mem[1] == Tag, "Tag is %lx, expected %lx\n", Tag, Mem[1]);
145 HeapFree(GetProcessHeap(), 0, Mem);
146
148}
149
150static
153{
154 return &Irp->MyStack;
155}
156
157/* ACPI DEFINITIONS ***********************************************************/
158
159#include <pshpack1.h>
161{
162 struct
163 {
166 } Drive[2];
167
170#include <poppack.h>
171
172#define STM_ID_BLOCK_SIZE 512
173
174/* ACPI DEFINITIONS (MOCK) ****************************************************/
175
176#define FAKE_SB_NAMESPACE_ACPI_HANDLE 0xFF0F0001
177#define FAKE_INTB_ACPI_HANDLE 0xFF0F0002
178#define FAKE_INTC_ACPI_HANDLE 0xFF0F0003
179
180typedef struct _PDO_DEVICE_DATA
181{
184
185typedef struct _GTM_OBJECT_BUFFER
186{
190
191typedef struct _BIF_OBJECT_BUFFER
192{
195 CHAR Buffer1[1 + 1];
196 CHAR Buffer2[1 + 1];
197 CHAR Buffer3[4 + 1];
198 CHAR Buffer4[7 + 1];
200
201typedef struct _PCL_OBJECT_BUFFER
202{
205
206typedef struct _PRT_OBJECT_BUFFER
207{
213
214DEFINE_GUID(MY_DSM_GUID,
215 0xB76E0B40, 0x3EC6, 0x4DBD, 0x8A, 0xCB, 0x8B, 0xCA, 0x65, 0xB8, 0xBC, 0x70);
216
218{
219 0, 50000, 50000, 1, 10000, 100, 50, 1, 1
220};
221
223{
224 0xAAAAAAAA, 0xBBBBBBBB, 0xDDDDDDDD
225};
226
228
229void *
231 ACPI_SIZE Size)
232{
233 return ExAllocatePoolWithTag(NonPagedPool, Size, 'FFUB');
234}
235
236void
238 void * Memory)
239{
240 ExFreePoolWithTag(Memory, 'FFUB');
241}
242
248{
249 /* We don't support anything else */
250 ok(NameType == ACPI_SINGLE_NAME, "Unexpected call to %s\n", __FUNCTION__);
251
252 /* Return a NULL-terminated string */
253 if (Buffer->Length < (4 + 1))
254 return AE_BUFFER_OVERFLOW;
255
256 switch ((ULONG_PTR)Handle)
257 {
259 RtlCopyMemory(Buffer->Pointer, "_SB_", sizeof("_SB_"));
260 break;
261
263 RtlCopyMemory(Buffer->Pointer, "LNKB", sizeof("LNKB"));
264 break;
265
267 RtlCopyMemory(Buffer->Pointer, "LNKC", sizeof("LNKC"));
268 break;
269
270 default:
271 return AE_BAD_PARAMETER;
272 }
273
274 return AE_OK;
275}
276
282 ACPI_BUFFER *ReturnObjectBuffer)
283{
285
286 /* We don't support anything else */
287 ok(ReturnObjectBuffer->Length == ACPI_ALLOCATE_BUFFER,
288 "Unexpected call to %s\n", __FUNCTION__);
289
290 if (strcmp(Pathname, "_STM") == 0)
291 {
292 ACPI_OBJECT* Arg;
294
295 if (ParameterObjects->Count > 3)
297
298 if (ParameterObjects->Count != 3)
299 return AE_OK;
300
301 /* Argument 1 */
302 {
303 Arg = ParameterObjects->Pointer;
304
306 ok_eq_uint_ex(DrvpEvalTestEntry, Arg->Buffer.Length, sizeof(*TimingMode));
307
308 TimingMode = (PIDE_ACPI_TIMING_MODE_BLOCK)Arg->Buffer.Pointer;
309
310 ok_eq_ulong_ex(DrvpEvalTestEntry, TimingMode->Drive[0].PioSpeed, 508LU);
311 ok_eq_ulong_ex(DrvpEvalTestEntry, TimingMode->Drive[0].DmaSpeed, 120LU);
312 ok_eq_ulong_ex(DrvpEvalTestEntry, TimingMode->Drive[1].PioSpeed, 240LU);
313 ok_eq_ulong_ex(DrvpEvalTestEntry, TimingMode->Drive[1].DmaSpeed, 180LU);
314 ok_eq_hex_ex(DrvpEvalTestEntry, TimingMode->ModeFlags, 0x10LU);
315 }
316 /* Argument 2 */
317 {
318 ++Arg;
319
322 }
323 /* Argument 3 */
324 {
325 ++Arg;
326
329 }
330
331 return AE_OK;
332 }
333 else if (strcmp(Pathname, "_GTM") == 0)
334 {
335 PGTM_OBJECT_BUFFER ReturnObject;
337
338 ReturnObject = AcpiOsAllocate(sizeof(*ReturnObject));
339 if (!ReturnObject)
340 return AE_NO_MEMORY;
341
342 /*
343 * VPC 2007 output
344 * AcpiGetHandle(NULL, "\\_SB.PCI0.IDE0.CHN1", &ObjHandle);
345 * AcpiEvaluateObject(ObjHandle, "_GTM", NULL, &ReturnObj);
346 */
347 TimingMode = &ReturnObject->TimingMode;
348 TimingMode->Drive[0].PioSpeed = 900;
349 TimingMode->Drive[0].DmaSpeed = 900;
350 TimingMode->Drive[1].PioSpeed = 120;
351 TimingMode->Drive[1].DmaSpeed = 120;
352 TimingMode->ModeFlags = 0x12;
353
354 ReturnObject->Obj.Type = ACPI_TYPE_BUFFER;
355 ReturnObject->Obj.Buffer.Length = sizeof(*TimingMode);
356 ReturnObject->Obj.Buffer.Pointer = (PUCHAR)TimingMode;
357
358 ReturnObjectBuffer->Pointer = ReturnObject;
359 ReturnObjectBuffer->Length = sizeof(*ReturnObject);
360 return AE_OK;
361 }
362 else if (strcmp(Pathname, "_BIF") == 0)
363 {
364 PBIF_OBJECT_BUFFER ReturnObject;
366 ULONG i;
367
368 ReturnObject = AcpiOsAllocate(sizeof(*ReturnObject));
369 if (!ReturnObject)
370 return AE_NO_MEMORY;
371
372 /*
373 * Vbox 7.0 output
374 * AcpiGetHandle(NULL, "\\_SB.PCI0.BAT0", &ObjHandle);
375 * AcpiEvaluateObject(ObjHandle, "_BIF", NULL, &ReturnObj);
376 */
377 BatteryInformation = &ReturnObject->BatteryInformation[0];
378 for (i = 0; i < RTL_NUMBER_OF(DrvpBifIntegerFields); ++i)
379 {
380 BatteryInformation[i].Integer.Type = ACPI_TYPE_INTEGER;
381 BatteryInformation[i].Integer.Value = DrvpBifIntegerFields[i];
382 }
384 BatteryInformation[i].String.Length = 1; /* Excluding the trailing null */
385 BatteryInformation[i].String.Pointer = &ReturnObject->Buffer1[0];
386 RtlCopyMemory(BatteryInformation[i].String.Pointer, "1", sizeof("1"));
387 ++i;
389 BatteryInformation[i].String.Length = 1;
390 BatteryInformation[i].String.Pointer = &ReturnObject->Buffer2[0];
391 RtlCopyMemory(BatteryInformation[i].String.Pointer, "0", sizeof("0"));
392 ++i;
394 BatteryInformation[i].String.Length = 4;
395 BatteryInformation[i].String.Pointer = &ReturnObject->Buffer3[0];
396 RtlCopyMemory(BatteryInformation[i].String.Pointer, "VBOX", sizeof("VBOX"));
397 ++i;
399 BatteryInformation[i].String.Length = 7;
400 BatteryInformation[i].String.Pointer = &ReturnObject->Buffer4[0];
401 RtlCopyMemory(BatteryInformation[i].String.Pointer, "innotek", sizeof("innotek"));
402
403 ReturnObject->Obj.Type = ACPI_TYPE_PACKAGE;
404 ReturnObject->Obj.Package.Count = 13;
405 ReturnObject->Obj.Package.Elements = BatteryInformation;
406
407 ReturnObjectBuffer->Pointer = ReturnObject;
408 ReturnObjectBuffer->Length = sizeof(*ReturnObject);
409 return AE_OK;
410 }
411 else if (strcmp(Pathname, "_PCL") == 0)
412 {
413 PPCL_OBJECT_BUFFER ReturnObject;
414
415 ReturnObject = AcpiOsAllocate(sizeof(*ReturnObject));
416 if (!ReturnObject)
417 return AE_NO_MEMORY;
418
419 /*
420 * Vbox 7.0 output
421 * AcpiGetHandle(NULL, "\\_SB.PCI0.AC", &ObjHandle);
422 * AcpiEvaluateObject(ObjHandle, "_PCL", NULL, &ReturnObj);
423 */
424 ReturnObject->Obj.Reference.Type = ACPI_TYPE_LOCAL_REFERENCE;
425 ReturnObject->Obj.Reference.ActualType = ACPI_TYPE_DEVICE;
427
428 ReturnObjectBuffer->Pointer = ReturnObject;
429 ReturnObjectBuffer->Length = sizeof(*ReturnObject);
430 return AE_OK;
431 }
432 else if (strcmp(Pathname, "_PRT") == 0)
433 {
434 PPRT_OBJECT_BUFFER ReturnObject;
435 ULONG i;
436
437 ReturnObject = AcpiOsAllocate(sizeof(*ReturnObject));
438 if (!ReturnObject)
439 return AE_NO_MEMORY;
440
441 /*
442 * Vbox 7.0 output
443 * AcpiGetHandle(NULL, "\\_SB.PCI0", &ObjHandle);
444 * AcpiEvaluateObject(ObjHandle, "_PRT", NULL, &ReturnObj);
445 *
446 * NOTE: To avoid similar copies of code executed and tested over and over again
447 * we return 2 packages. The original method returns 120 packages.
448 */
449 ReturnObject->Obj.Type = ACPI_TYPE_PACKAGE;
450 ReturnObject->Obj.Package.Count = 2;
451 ReturnObject->Obj.Package.Elements = &ReturnObject->PackageContainer[0];
452
453 i = 0;
454 ReturnObject->PackageContainer[i].Type = ACPI_TYPE_PACKAGE;
455 ReturnObject->PackageContainer[i].Package.Count = 4;
456 ReturnObject->PackageContainer[i].Package.Elements = &ReturnObject->Package1[0];
457 ++i;
458 ReturnObject->PackageContainer[i].Type = ACPI_TYPE_PACKAGE;
459 ReturnObject->PackageContainer[i].Package.Count = 4;
460 ReturnObject->PackageContainer[i].Package.Elements = &ReturnObject->Package2[0];
461
462 /* Package 1 */
463 i = 0;
464 ReturnObject->Package1[i].Integer.Type = ACPI_TYPE_INTEGER;
465 ReturnObject->Package1[i].Integer.Value = 0x0002FFFF;
466 ++i;
467 ReturnObject->Package1[i].Integer.Type = ACPI_TYPE_INTEGER;
468 ReturnObject->Package1[i].Integer.Value = 0x00000000;
469 ++i;
470 ReturnObject->Package1[i].Reference.Type = ACPI_TYPE_LOCAL_REFERENCE;
471 ReturnObject->Package1[i].Reference.ActualType = ACPI_TYPE_DEVICE;
473 ++i;
474 ReturnObject->Package1[i].Integer.Type = ACPI_TYPE_INTEGER;
475 ReturnObject->Package1[i].Integer.Value = 0x00000000;
476
477 /* Package 2 */
478 i = 0;
479 ReturnObject->Package2[i].Integer.Type = ACPI_TYPE_INTEGER;
480 ReturnObject->Package2[i].Integer.Value = 0x0002FFFF;
481 ++i;
482 ReturnObject->Package2[i].Integer.Type = ACPI_TYPE_INTEGER;
483 ReturnObject->Package2[i].Integer.Value = 0x00000001;
484 ++i;
485 ReturnObject->Package2[i].Reference.Type = ACPI_TYPE_LOCAL_REFERENCE;
486 ReturnObject->Package2[i].Reference.ActualType = ACPI_TYPE_DEVICE;
488 ++i;
489 ReturnObject->Package2[i].Integer.Type = ACPI_TYPE_INTEGER;
490 ReturnObject->Package2[i].Integer.Value = 0x00000000;
491
492 ReturnObjectBuffer->Pointer = ReturnObject;
493 ReturnObjectBuffer->Length = sizeof(*ReturnObject);
494 return AE_OK;
495 }
496 else if (strcmp(Pathname, "_DSM") == 0)
497 {
498 ACPI_OBJECT* Arg;
499
500 /* Assumed object count per the spec */
501 ok_eq_uint(ParameterObjects->Count, 4);
502
503 if (ParameterObjects->Count != 4)
505
506 /* Argument 1 */
507 {
508 Arg = ParameterObjects->Pointer;
509
511 ok_eq_uint_ex(DrvpEvalTestEntry, Arg->Buffer.Length, sizeof(GUID));
512 }
513
514 /* NOTE: This UUID doesn't exist, for testing purposes only */
515 if (IsEqualGUID(Arg->Buffer.Pointer, &MY_DSM_GUID))
516 {
517 /* Argument 2 */
518 {
519 ++Arg;
520
523 }
524 /* Argument 3 */
525 {
526 ++Arg;
527
530 }
531 /* Argument 4 */
532 {
533 ++Arg;
534
536
538 {
541 }
542 else
543 {
544 ACPI_OBJECT* PackageArg;
545 ACPI_OBJECT* PackageArg2;
546 ULONG i;
547
550
551 if (!Arg->Package.Elements)
553
554 /* Package 1 Arguments 1-2 */
555 PackageArg = Arg->Package.Elements;
556 for (i = 0; i < RTL_NUMBER_OF(DrvpMyDsmIntegerFields) - 1; i++)
557 {
560 PackageArg->Integer.Value,
562
563 ++PackageArg;
564 }
565
566 /* Package 1 Argument 3 */
567 {
568 Arg = PackageArg;
569
572
573 /* Package 2 Argument 1 */
574 PackageArg2 = Arg->Package.Elements;
575
577
578 /* Excluding the trailing null */
580 PackageArg2->String.Length,
581 (sizeof("1_TESTDATATESTDATA_2") - 1));
583 memcmp(PackageArg2->String.Pointer,
584 "1_TESTDATATESTDATA_2",
585 sizeof("1_TESTDATATESTDATA_2") - 1),
586 0);
587 }
588 /* Package 1 Argument 4 */
589 {
590 ++PackageArg;
591
594 PackageArg->Integer.Value,
596 }
597 }
598 }
599
600 return AE_OK;
601 }
602 }
603
604 return AE_NOT_FOUND;
605}
606
607#include "../../../../drivers/bus/acpi/eval.c"
608
609/* GLOBALS ********************************************************************/
610
611/* 2 ID blocks + timings + room for the test data */
612#define STM_MAX_BUFFER_SIZE \
613 (FIELD_OFFSET(ACPI_EVAL_INPUT_BUFFER_COMPLEX, Argument) + \
614 2 * STM_ID_BLOCK_SIZE + sizeof(IDE_ACPI_TIMING_MODE_BLOCK) + 0x100)
615
616#define GTM_MAX_BUFFER_SIZE \
617 (FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) + \
618 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(IDE_ACPI_TIMING_MODE_BLOCK)) + 0x50)
619
621{
622 { __LINE__, 0, STATUS_SUCCESS },
638 sizeof(ACPI_EVAL_INPUT_BUFFER) - 2 },
640 sizeof(ACPI_EVAL_INPUT_BUFFER) - 1 },
642 sizeof(ACPI_EVAL_INPUT_BUFFER) },
644 sizeof(ACPI_EVAL_INPUT_BUFFER) + 1 },
646 sizeof(ACPI_EVAL_INPUT_BUFFER) + 2 },
649
650#if 0
651 /*
652 * The return status depends on AML interpreter implementation
653 * and testing it is not practical, keeping this for reference only.
654 */
661#endif
662};
663
665{
667 { __LINE__, GTM_TEST_FLAG_METHOD_SUCCESS |
669 { __LINE__, GTM_TEST_FLAG_METHOD_SUCCESS |
674 FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) - 1 },
678 FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) + 1 },
680 sizeof(ACPI_EVAL_OUTPUT_BUFFER) - 1 },
686 sizeof(ACPI_EVAL_OUTPUT_BUFFER) },
692 sizeof(ACPI_EVAL_OUTPUT_BUFFER) + 1 },
693
694 /* Pass an invalid signature */
700 sizeof(ACPI_EVAL_OUTPUT_BUFFER) - 1 },
703 sizeof(ACPI_EVAL_OUTPUT_BUFFER) },
704};
705
707{
708 { __LINE__, 0, STATUS_SUCCESS },
709};
710
712{
713 { __LINE__, 0, STATUS_SUCCESS },
714};
715
717{
718 { __LINE__, 0, STATUS_SUCCESS },
719};
720
722{
723 { __LINE__, 0, STATUS_SUCCESS },
726};
727
728/* FUNCTIONS ******************************************************************/
729
730static
737{
739 IRP Irp;
740
741 DeviceData.AcpiHandle = NULL;
742
743 Irp.AssociatedIrp.SystemBuffer = InputBuffer;
744 Irp.OutputBuffer = OutputBuffer;
745
746 Irp.MyStack.Parameters.DeviceIoControl.InputBufferLength = InputBufferLength;
747 Irp.MyStack.Parameters.DeviceIoControl.OutputBufferLength = OutputBufferLength;
748
750}
751
752static
753VOID
757 _In_ PUCHAR IdBlock,
759{
760 PACPI_METHOD_ARGUMENT Argument, Argument2, Argument3;
762 ULONG InputBufferSize, IrpBufferSize;
763
764 InputBufferSize = FIELD_OFFSET(ACPI_EVAL_INPUT_BUFFER_COMPLEX, Argument) +
765 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(*TimingMode)) +
768
770 {
773 }
774
775 InputBuffer->MethodNameAsUlong = 'MTS_'; // _STM
778 {
779 InputBuffer->Size = InputBufferSize - TestEntry->Value;
780 }
781 else if (TestEntry->Flags & STM_TEST_FLAG_SET_IN_BUFFER)
782 {
783 InputBuffer->Size = TestEntry->Value;
784 }
785 else
786 {
787 InputBuffer->Size = InputBufferSize;
788 }
789
791 {
792 InputBuffer->ArgumentCount = TestEntry->Value;
793 }
794 else
795 {
796 InputBuffer->ArgumentCount = 3;
797 }
798
799 /* Argument 1: The channel timing information block */
800 Argument = InputBuffer->Argument;
801 ACPI_METHOD_SET_ARGUMENT_BUFFER(Argument, TimingMode, sizeof(*TimingMode));
802
803 /* Argument 2: The ATA drive ID block */
806
807 /* Argument 3: The ATA drive ID block */
810
812 {
813 Argument3->Type = 0xFFFF;
814 }
815
817 {
818 Argument2->DataLength = STM_ID_BLOCK_SIZE * 2;
819 Argument3->DataLength = STM_ID_BLOCK_SIZE * 2;
820 }
821
823 {
824 ACPI_METHOD_SET_ARGUMENT_STRING(Argument3, IdBlock);
825 }
827 {
828 ACPI_METHOD_SET_ARGUMENT_INTEGER(Argument3, 0xDEADBEEF);
829 }
831 {
832 Argument3->DataLength += 5;
833 }
835 {
836 Argument3->DataLength -= 5;
837 }
838
840 {
841 IrpBufferSize = InputBufferSize - TestEntry->Value;
842 }
843 else if (TestEntry->Flags & STM_TEST_FLAG_SET_IRP_BUFFER)
844 {
845 IrpBufferSize = TestEntry->Value;
846 }
847 else
848 {
849 IrpBufferSize = InputBufferSize;
850 }
851
852 /* Evaluate the _STM method */
854 Status = DrvCallAcpiDriver(InputBuffer, IrpBufferSize, NULL, 0);
855
858}
859
860static
861VOID
863{
865 UCHAR IdBlock[STM_ID_BLOCK_SIZE];
866 ULONG i;
869
870 /* Initialize method arguments */
871 RtlZeroMemory(IdBlock, sizeof(IdBlock));
872 TimingMode.Drive[0].PioSpeed = 508;
873 TimingMode.Drive[0].DmaSpeed = 120;
874 TimingMode.Drive[1].PioSpeed = 240;
875 TimingMode.Drive[1].DmaSpeed = 180;
876 TimingMode.ModeFlags = 0x10;
877
878 for (i = 0; i < RTL_NUMBER_OF(DrvpSmtTests); ++i)
879 {
880 DrvEvaluateStmObject(&DrvpSmtTests[i], &TimingMode, IdBlock, InputBuffer);
881 }
882}
883
884static
885VOID
889{
891 ULONG OutputBufferSize;
893 PACPI_METHOD_ARGUMENT Argument;
897
898 InputBuffer.MethodNameAsUlong = 'MTG_'; // _GTM
900 InputBuffer.Signature = 'BAD0';
901 else
903
904 OutputBufferSize = FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) +
905 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(*TimingMode));
906
908 {
909 OutputBufferSize += TestEntry->Value;
910 }
911 else if (TestEntry->Flags & GTM_TEST_FLAG_DEC_OUT_BUFFER)
912 {
913 OutputBufferSize -= TestEntry->Value;
914 }
915 else if (TestEntry->Flags & GTM_TEST_FLAG_SET_OUT_BUFFER)
916 {
917 OutputBufferSize = TestEntry->Value;
918 }
919
920 /* Evaluate the _GTM method */
921 Status = DrvCallAcpiDriver(&InputBuffer, sizeof(InputBuffer), OutputBuffer, OutputBufferSize);
922
923 todo_if(!is_reactos() && (TestEntry->Flags & GTM_TEST_FLAG_IS_TODO) && (Status != TestEntry->Status))
925
928 else
929 Signature = 0;
931
933 Count = 1;
934 else
935 Count = 0;
937
939 {
941 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(*TimingMode));
942 }
943 else
944 {
945 Length = 0;
946 }
948
949 Argument = OutputBuffer->Argument;
952 else
954 todo_if(!is_reactos() && (TestEntry->Flags & GTM_TEST_FLAG_IS_TODO) && (Type != Argument->Type))
955 ok_eq_uint_ex(TestEntry, Argument->Type, Type);
956
959 else
960 DataLength = 0;
961 todo_if(!is_reactos() && (TestEntry->Flags & GTM_TEST_FLAG_IS_TODO) && (DataLength != Argument->DataLength))
962 ok_eq_uint_ex(TestEntry, Argument->DataLength, DataLength);
963
965 {
966 TimingMode = (PIDE_ACPI_TIMING_MODE_BLOCK)Argument->Data;
967
968 ok_eq_ulong_ex(TestEntry, TimingMode->Drive[0].PioSpeed, 900LU);
969 ok_eq_ulong_ex(TestEntry, TimingMode->Drive[0].DmaSpeed, 900LU);
970 ok_eq_ulong_ex(TestEntry, TimingMode->Drive[1].PioSpeed, 120LU);
971 ok_eq_ulong_ex(TestEntry, TimingMode->Drive[1].DmaSpeed, 120LU);
972 ok_eq_hex_ex(TestEntry, TimingMode->ModeFlags, 0x12LU);
973 }
974}
975
976static
977VOID
979{
981 ULONG i;
983
984 for (i = 0; i < RTL_NUMBER_OF(DrvpGtmTests); ++i)
985 {
986 RtlZeroMemory(Buffer, sizeof(Buffer));
987
989 }
990}
991
992static
993VOID
997{
999 ULONG i, OutputBufferSize;
1001 PACPI_METHOD_ARGUMENT Argument;
1002
1003 InputBuffer.MethodNameAsUlong = 'FIB_'; // _BIF
1005
1006 OutputBufferSize = FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) +
1007 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) * 9 +
1008 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("1")) +
1009 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("0")) +
1010 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("VBOX")) +
1011 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("innotek"));
1012
1013 /* Evaluate the _BIF method */
1014 Status = DrvCallAcpiDriver(&InputBuffer, sizeof(InputBuffer), OutputBuffer, OutputBufferSize);
1015
1019 ok_eq_ulong_ex(TestEntry, OutputBuffer->Length, OutputBufferSize);
1020
1021 /* Arguments 1-9 */
1022 Argument = OutputBuffer->Argument;
1023 for (i = 0; i < RTL_NUMBER_OF(DrvpBifIntegerFields); ++i)
1024 {
1026 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof(ULONG));
1027 ok_eq_ulong_ex(TestEntry, Argument->Argument, DrvpBifIntegerFields[i]);
1028
1029 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1030 }
1031 /* Argument 10 */
1032 {
1034 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof("1")); // Including the trailing null
1035 ok_eq_str_ex(TestEntry, (PCSTR)Argument->Data, "1");
1036 }
1037 /* Argument 11 */
1038 {
1039 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1040
1042 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof("0"));
1043 ok_eq_str_ex(TestEntry, (PCSTR)Argument->Data, "0");
1044 }
1045 /* Argument 12 */
1046 {
1047 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1048
1050 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof("VBOX"));
1051 ok_eq_str_ex(TestEntry, (PCSTR)Argument->Data, "VBOX");
1052 }
1053 /* Argument 13 */
1054 {
1055 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1056
1058 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof("innotek"));
1059 ok_eq_str_ex(TestEntry, (PCSTR)Argument->Data, "innotek");
1060 }
1061}
1062
1063static
1064VOID
1066{
1067 UCHAR Buffer[0x100];
1068 ULONG i;
1070
1071 for (i = 0; i < RTL_NUMBER_OF(DrvpBifTests); ++i)
1072 {
1073 RtlZeroMemory(Buffer, sizeof(Buffer));
1074
1076 }
1077}
1078
1079static
1080VOID
1084{
1086 ULONG OutputBufferSize;
1088 PACPI_METHOD_ARGUMENT Argument;
1089
1090 InputBuffer.MethodNameAsUlong = 'LCP_'; // _PCL
1092
1093 OutputBufferSize = FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) +
1094 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("ABCD")); // ACPI name for the object
1095
1096 /* Evaluate the _PCL method */
1097 Status = DrvCallAcpiDriver(&InputBuffer, sizeof(InputBuffer), OutputBuffer, OutputBufferSize);
1098
1102 ok_eq_ulong_ex(TestEntry, OutputBuffer->Length, OutputBufferSize);
1103
1104 Argument = OutputBuffer->Argument;
1105
1107 ok_eq_uint_ex(TestEntry, Argument->DataLength, sizeof("ABCD"));
1108 ok_eq_str_ex(TestEntry, (PCSTR)Argument->Data, "_SB_");
1109}
1110
1111static
1112VOID
1114{
1115 UCHAR Buffer[0x100];
1116 ULONG i;
1118
1119 for (i = 0; i < RTL_NUMBER_OF(DrvpPclTests); ++i)
1120 {
1121 RtlZeroMemory(Buffer, sizeof(Buffer));
1122
1124 }
1125}
1126
1127static
1128VOID
1132{
1134 ULONG PackageNum, ArgNum, OutputBufferSize;
1136 PACPI_METHOD_ARGUMENT Argument, PackageArgument;
1137
1138 InputBuffer.MethodNameAsUlong = 'TRP_'; // _PRT
1140
1141#define PRT_PACKAGE_ENTRY_SIZE \
1142 (ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) * 3 + \
1143 ACPI_METHOD_ARGUMENT_LENGTH(sizeof("LNKB")))
1144
1145 OutputBufferSize = FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) +
1147
1148 /* Evaluate the _PRT method */
1149 Status = DrvCallAcpiDriver(&InputBuffer, sizeof(InputBuffer), OutputBuffer, OutputBufferSize);
1150
1154 ok_eq_ulong_ex(TestEntry, OutputBuffer->Length, OutputBufferSize);
1155
1156 Argument = OutputBuffer->Argument;
1157 for (PackageNum = 0; PackageNum < 2; PackageNum++)
1158 {
1160 ok_eq_uint_ex(TestEntry, Argument->DataLength, (USHORT)PRT_PACKAGE_ENTRY_SIZE);
1161
1162 PackageArgument = (PACPI_METHOD_ARGUMENT)Argument->Data;
1163 for (ArgNum = 0; ArgNum < 4; ArgNum++)
1164 {
1165 if (ArgNum != 2)
1166 {
1167 ULONG ExpectedValue;
1168
1169 ok_eq_uint_ex(TestEntry, PackageArgument->Type, ACPI_METHOD_ARGUMENT_INTEGER);
1170 ok_eq_uint_ex(TestEntry, PackageArgument->DataLength, sizeof(ULONG));
1171
1172 if (ArgNum == 0)
1173 {
1174 ExpectedValue = 0x0002FFFF;
1175 }
1176 else
1177 {
1178 if ((PackageNum == 1) && (ArgNum == 1))
1179 ExpectedValue = 0x00000001;
1180 else
1181 ExpectedValue = 0x00000000;
1182 }
1183 ok_eq_ulong_ex(TestEntry, PackageArgument->Argument, ExpectedValue);
1184 }
1185 else
1186 {
1187 ok_eq_uint_ex(TestEntry, PackageArgument->Type, ACPI_METHOD_ARGUMENT_STRING);
1188 ok_eq_uint_ex(TestEntry, PackageArgument->DataLength, sizeof("ABCD"));
1189 ok_eq_str_ex(TestEntry, (PCSTR)PackageArgument->Data,
1190 (PackageNum == 0) ? "LNKB" : "LNKC");
1191 }
1192
1193 PackageArgument = ACPI_METHOD_NEXT_ARGUMENT(PackageArgument);
1194 }
1195
1196 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1197 }
1198}
1199
1200static
1201VOID
1203{
1204 UCHAR Buffer[0x100];
1205 ULONG i;
1207
1208 for (i = 0; i < RTL_NUMBER_OF(DrvpPclTests); ++i)
1209 {
1210 RtlZeroMemory(Buffer, sizeof(Buffer));
1211
1213 }
1214}
1215
1216static
1217VOID
1220{
1221#define MY_DSM_SUB_PACKAGE_ENTRY_SIZE \
1222 (ACPI_METHOD_ARGUMENT_LENGTH(sizeof("1_TESTDATATESTDATA_2")))
1223
1224#define MY_DSM_PACKAGE_ENTRY_SIZE \
1225 (ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) * 3 + \
1226 ACPI_METHOD_ARGUMENT_LENGTH(MY_DSM_SUB_PACKAGE_ENTRY_SIZE))
1227
1228#define MY_DSM_BUFFER_SIZE \
1229 (FIELD_OFFSET(ACPI_EVAL_INPUT_BUFFER_COMPLEX, Argument) + \
1230 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(GUID)) + \
1231 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) + \
1232 ACPI_METHOD_ARGUMENT_LENGTH(sizeof(ULONG)) + \
1233 ACPI_METHOD_ARGUMENT_LENGTH(MY_DSM_PACKAGE_ENTRY_SIZE))
1234
1236 ULONG InputSize;
1238 PACPI_METHOD_ARGUMENT Argument, PackageArgument, PackageArgument2;
1240
1241 RtlZeroMemory(Buffer, sizeof(Buffer));
1242
1243 InputSize = MY_DSM_BUFFER_SIZE;
1245 {
1248 }
1249
1250 InputBuffer->MethodNameAsUlong = 'MSD_'; // _DSM
1252 InputBuffer->ArgumentCount = 4;
1253 InputBuffer->Size = InputSize;
1254
1255 /* Argument 1: The UUID */
1256 Argument = InputBuffer->Argument;
1257 ACPI_METHOD_SET_ARGUMENT_BUFFER(Argument, &MY_DSM_GUID, sizeof(GUID));
1258
1259 /* Argument 2: The Revision ID */
1260 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1262
1263 /* Argument 3: The Function Index */
1264 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1266
1267 /* Argument 4: The device-specific package */
1268 Argument = ACPI_METHOD_NEXT_ARGUMENT(Argument);
1269 Argument->Type = ACPI_METHOD_ARGUMENT_PACKAGE;
1271 {
1272 /* Empty package */
1273 Argument->DataLength = ACPI_METHOD_ARGUMENT_LENGTH(0);
1274 Argument->Argument = 0;
1275 }
1276 else
1277 {
1278 Argument->DataLength = MY_DSM_PACKAGE_ENTRY_SIZE;
1279
1280 /* Package 1 Argument 1: Some test data */
1281 PackageArgument = (PACPI_METHOD_ARGUMENT)Argument->Data;
1283
1284 /* Package 1 Argument 2: Some test data */
1285 PackageArgument = ACPI_METHOD_NEXT_ARGUMENT(PackageArgument);
1287
1288 /* Package 1 Argument 3: Start a new subpackage */
1289 PackageArgument = ACPI_METHOD_NEXT_ARGUMENT(PackageArgument);
1290 PackageArgument->Type = ACPI_METHOD_ARGUMENT_PACKAGE;
1291 PackageArgument->DataLength = MY_DSM_SUB_PACKAGE_ENTRY_SIZE;
1292
1293 /* Package 2 Argument 1: Some test data */
1294 PackageArgument2 = (PACPI_METHOD_ARGUMENT)PackageArgument->Data;
1295 ACPI_METHOD_SET_ARGUMENT_STRING(PackageArgument2, "1_TESTDATATESTDATA_2");
1296
1298 {
1299 PackageArgument2->DataLength = 32768;
1300 }
1301 else
1302 {
1303 /* Package 1 Argument 4: Some test data */
1304 PackageArgument = ACPI_METHOD_NEXT_ARGUMENT(PackageArgument);
1306 }
1307 }
1308
1309 /* Evaluate the _DSM method */
1311 Status = DrvCallAcpiDriver(InputBuffer, InputSize, NULL, 0);
1312
1314}
1315
1316static
1317VOID
1319{
1320 ULONG i;
1321
1322 for (i = 0; i < RTL_NUMBER_OF(DrvpDsmTests); ++i)
1323 {
1325 }
1326}
1327
1328static
1329VOID
1331{
1334
1335 InputBuffer.MethodNameAsUlong = 'FFF_'; // _FFF
1337
1338 /* Try to evaluate some unsupported control method */
1340
1342}
1343
1345{
1353
1354 ok(DrvpBlocksAllocated == 0, "Leaking memory %ld blocks\n", DrvpBlocksAllocated);
1355}
#define DSM_TEST_FLAG_LARGE_SUB_PACKAGE_BUFFER
#define FAKE_INTB_ACPI_HANDLE
#define STM_TEST_FLAG_SET_IRP_BUFFER
#define GTM_TEST_FLAG_BUFFER_HAS_LENGTH
#define GTM_TEST_FLAG_BAD_SIGNARUTE
#define GTM_TEST_FLAG_BUFFER_HAS_SIGNARUTE
struct _GTM_OBJECT_BUFFER * PGTM_OBJECT_BUFFER
static VOID DrvEvaluatePrtObject(_In_ const EVAL_TEST_ENTRY *TestEntry, _In_ PACPI_EVAL_OUTPUT_BUFFER OutputBuffer)
#define GTM_TEST_FLAG_ARG_HAS_BUFFER_TYPE
#define ok_eq_uint_ex(entry, value, expected)
#define FAKE_INTC_ACPI_HANDLE
struct _IO_STACK_LOCATION * PIO_STACK_LOCATION
static VOID DrvEvaluateGtmObject(_In_ const EVAL_TEST_ENTRY *TestEntry, _In_ PACPI_EVAL_OUTPUT_BUFFER OutputBuffer)
#define STM_MAX_BUFFER_SIZE
#define STM_TEST_FLAG_CHANGE_ARG_COUNT
#define ok_eq_str_ex(entry, value, expected)
#define GTM_TEST_FLAG_IS_TODO
#define STM_TEST_FLAG_IS_TODO
static VOID DrvTestPackageReturnValueAndStringData(VOID)
struct _PRT_OBJECT_BUFFER PRT_OBJECT_BUFFER
struct _PRT_OBJECT_BUFFER * PPRT_OBJECT_BUFFER
#define STM_TEST_FLAG_LARGE_ARG_BUFFER
struct _PCL_OBJECT_BUFFER PCL_OBJECT_BUFFER
static const EVAL_TEST_ENTRY DrvpPrtTests[]
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
struct _IDE_ACPI_TIMING_MODE_BLOCK * PIDE_ACPI_TIMING_MODE_BLOCK
#define ok_eq_ulong_ex(entry, value, expected)
#define GTM_TEST_FLAG_SET_OUT_BUFFER
void * AcpiOsAllocate(ACPI_SIZE Size)
#define ok_eq_int_ex(entry, value, expected)
struct _IRP * PIRP
static const EVAL_TEST_ENTRY DrvpPclTests[]
#define ok_eq_ulonglong_ex(entry, value, expected)
static VOID DrvTestNestedPackageReturnValue(VOID)
static const EVAL_TEST_ENTRY DrvpGtmTests[]
ACPI_STATUS AcpiEvaluateObject(ACPI_HANDLE Object, ACPI_STRING Pathname, ACPI_OBJECT_LIST *ParameterObjects, ACPI_BUFFER *ReturnObjectBuffer)
#define GTM_TEST_FLAG_ARG_HAS_DATA_LENGTH
#define DSM_TEST_FLAG_EMPTY_PACKAGE
static VOID DrvTestInputBuffer(VOID)
#define STM_TEST_FLAG_BAD_ARG_TYPE
#define MY_DSM_BUFFER_SIZE
struct _BIF_OBJECT_BUFFER * PBIF_OBJECT_BUFFER
static const ULONG DrvpMyDsmIntegerFields[3]
ACPI_STATUS AcpiGetName(ACPI_HANDLE Handle, UINT32 NameType, ACPI_BUFFER *Buffer)
#define STM_TEST_FLAG_SUB_IRP_BUFFER
#define STM_TEST_FLAG_SET_IN_BUFFER
#define STM_TEST_FLAG_SUB_IN_BUFFER
#define ok_eq_pointer_ex(entry, value, expected)
struct _IDE_ACPI_TIMING_MODE_BLOCK IDE_ACPI_TIMING_MODE_BLOCK
static const EVAL_TEST_ENTRY DrvpDsmTests[]
#define STM_TEST_FLAG_INVALID_ARG_3_5
#define MY_DSM_PACKAGE_ENTRY_SIZE
static const EVAL_TEST_ENTRY * DrvpEvalTestEntry
static VOID DrvEvaluateDsmObject(_In_ const EVAL_TEST_ENTRY *TestEntry)
struct _BIF_OBJECT_BUFFER BIF_OBJECT_BUFFER
static VOID DrvEvaluatePclObject(_In_ const EVAL_TEST_ENTRY *TestEntry, _In_ PACPI_EVAL_OUTPUT_BUFFER OutputBuffer)
static NTSTATUS DrvCallAcpiDriver(_In_ PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_opt_ PACPI_EVAL_OUTPUT_BUFFER OutputBuffer, _In_ ULONG OutputBufferLength)
struct _GTM_OBJECT_BUFFER GTM_OBJECT_BUFFER
struct _IO_STACK_LOCATION IO_STACK_LOCATION
void AcpiOsFree(void *Memory)
#define ok_eq_hex_ex(entry, value, expected)
struct _PCL_OBJECT_BUFFER * PPCL_OBJECT_BUFFER
#define STM_TEST_FLAG_INVALID_ARG_3_1
static VOID DrvEvaluateStmObject(_In_ const EVAL_TEST_ENTRY *TestEntry, _In_ PIDE_ACPI_TIMING_MODE_BLOCK TimingMode, _In_ PUCHAR IdBlock, _In_ PACPI_EVAL_INPUT_BUFFER_COMPLEX InputBuffer)
#define FAKE_SB_NAMESPACE_ACPI_HANDLE
#define PRT_PACKAGE_ENTRY_SIZE
static const EVAL_TEST_ENTRY DrvpSmtTests[]
static VOID DrvTestComplexBuffer(VOID)
struct _PDO_DEVICE_DATA PDO_DEVICE_DATA
#define NonPagedPool
static VOID DrvTestPackageInputValue(VOID)
#define STM_TEST_FLAG_INVALID_ARG_3_4
static VOID DrvTestUnknownMethod(VOID)
#define MY_DSM_SUB_PACKAGE_ENTRY_SIZE
struct _IRP IRP
static LONG DrvpBlocksAllocated
#define GTM_TEST_FLAG_BUFFER_HAS_COUNT
struct _EVAL_TEST_ENTRY EVAL_TEST_ENTRY
#define GTM_TEST_FLAG_METHOD_SUCCESS
#define GTM_MAX_BUFFER_SIZE
#define GTM_TEST_FLAG_DEC_OUT_BUFFER
#define STM_TEST_FLAG_INVALID_ARG_3_2
#define ok_not_pointer_ex(entry, value, expected)
#define GTM_TEST_FLAG_INC_OUT_BUFFER
#define STM_ID_BLOCK_SIZE
#define STM_TEST_FLAG_INVALID_SIZE_1
static const EVAL_TEST_ENTRY DrvpBifTests[]
static VOID DrvTestReferenceReturnValue(VOID)
static const ULONG DrvpBifIntegerFields[9]
struct _PDO_DEVICE_DATA * PPDO_DEVICE_DATA
static VOID DrvEvaluateBifObject(_In_ const EVAL_TEST_ENTRY *TestEntry, _In_ PACPI_EVAL_OUTPUT_BUFFER OutputBuffer)
unsigned int UINT32
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
Type
Definition: Type.h:7
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
#define AE_BUFFER_OVERFLOW
Definition: acexcep.h:119
#define AE_NOT_FOUND
Definition: acexcep.h:113
#define AE_AML_UNINITIALIZED_ARG
Definition: acexcep.h:185
#define AE_NO_MEMORY
Definition: acexcep.h:112
#define AE_OK
Definition: acexcep.h:97
struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX * PACPI_EVAL_INPUT_BUFFER_COMPLEX
struct _ACPI_EVAL_INPUT_BUFFER ACPI_EVAL_INPUT_BUFFER
#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE
Definition: acpiioct.h:10
ACPI_METHOD_ARGUMENT UNALIGNED * PACPI_METHOD_ARGUMENT
Definition: acpiioct.h:71
struct _ACPI_EVAL_OUTPUT_BUFFER ACPI_EVAL_OUTPUT_BUFFER
#define ACPI_METHOD_NEXT_ARGUMENT(Argument)
Definition: acpiioct.h:150
#define ACPI_METHOD_ARGUMENT_STRING
Definition: acpiioct.h:22
#define ACPI_METHOD_ARGUMENT_INTEGER
Definition: acpiioct.h:21
#define ACPI_METHOD_ARGUMENT_LENGTH(DataLength)
Definition: acpiioct.h:144
#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:7
#define ACPI_METHOD_SET_ARGUMENT_INTEGER(MethodArgument, IntData)
Definition: acpiioct.h:155
#define ACPI_METHOD_SET_ARGUMENT_STRING(Argument, StrData)
Definition: acpiioct.h:160
#define ACPI_METHOD_ARGUMENT_BUFFER
Definition: acpiioct.h:23
#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:11
#define ACPI_METHOD_SET_ARGUMENT_BUFFER(Argument, BuffData, BuffLength)
Definition: acpiioct.h:165
#define ACPI_METHOD_ARGUMENT_PACKAGE
Definition: acpiioct.h:24
ACPI_EVAL_OUTPUT_BUFFER UNALIGNED * PACPI_EVAL_OUTPUT_BUFFER
Definition: acpiioct.h:90
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST * ParameterObjects
Definition: acpixf.h:705
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 NameType
Definition: acpixf.h:658
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING Pathname
Definition: acpixf.h:704
#define ACPI_TYPE_LOCAL_REFERENCE
Definition: actypes.h:719
#define ACPI_SINGLE_NAME
Definition: actypes.h:1063
#define ACPI_TYPE_STRING
Definition: actypes.h:689
#define ACPI_ALLOCATE_BUFFER
Definition: actypes.h:1046
#define ACPI_TYPE_BUFFER
Definition: actypes.h:690
char * ACPI_STRING
Definition: actypes.h:462
#define ACPI_TYPE_INTEGER
Definition: actypes.h:688
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_TYPE_DEVICE
Definition: actypes.h:693
void * ACPI_HANDLE
Definition: actypes.h:463
#define ACPI_TYPE_PACKAGE
Definition: actypes.h:691
#define ok_eq_hex(value, expected)
Definition: apitest.h:134
#define ok_eq_uint(value, expected)
Definition: apitest.h:118
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
#define U(x)
Definition: wordpad.c:45
@ BatteryInformation
Definition: batclass.h:97
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
Definition: cdrom.h:1444
Definition: bufpool.h:45
_In_ PVOID Argument2
Definition: classpnp.h:721
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static const WCHAR Signature[]
Definition: parser.c:141
NTSTATUS NTAPI Bus_PDO_EvalMethod(_In_ PPDO_DEVICE_DATA DeviceData, _Inout_ PIRP Irp)
Definition: eval.c:765
#define __FUNCTION__
Definition: types.h:116
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define todo_if(is_todo)
Definition: minitest.h:70
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define for
Definition: utility.h:88
unsigned __int64 ULONG64
Definition: imports.h:198
static void TestEntry(const ENTRY *pEntry)
#define _Out_opt_
Definition: no_sal2.h:214
#define _In_
Definition: no_sal2.h:158
int Count
Definition: noreturn.cpp:7
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_ACPI_INVALID_ARGTYPE
Definition: ntstatus.h:1655
#define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT
Definition: ntstatus.h:1658
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:569
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define is_reactos()
Definition: test.h:1041
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
ACPI_OBJECT BatteryInformation[13]
ULONG Line
ULONG Flags
NTSTATUS Status
ULONG Value
IDE_ACPI_TIMING_MODE_BLOCK TimingMode
struct _IDE_ACPI_TIMING_MODE_BLOCK::@1697 Drive[2]
struct _IO_STACK_LOCATION::@1694::@1695 DeviceIoControl
union _IO_STACK_LOCATION::@1694 Parameters
PVOID SystemBuffer
PVOID OutputBuffer
IO_STATUS_BLOCK IoStatus
IO_STACK_LOCATION MyStack
union _IRP::@1696 AssociatedIrp
ACPI_OBJECT Package1[4]
ACPI_OBJECT PackageContainer[2]
ACPI_OBJECT Package2[4]
void * Pointer
Definition: actypes.h:1054
ACPI_SIZE Length
Definition: actypes.h:1053
uint32_t * PULONG_PTR
Definition: typedefs.h:65
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const char * PCSTR
Definition: typedefs.h:52
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
struct acpi_object::@682 Package
struct acpi_object::@681 Buffer
struct acpi_object::@679 Integer
ACPI_OBJECT_TYPE Type
Definition: actypes.h:970
struct acpi_object::@680 String
struct acpi_object::@683 Reference
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4071
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3821
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
_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
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036
unsigned char UCHAR
Definition: xmlstorage.h:181
char CHAR
Definition: xmlstorage.h:175