1 /*
2  * PROJECT:         ReactOS kernel-mode tests
3  * LICENSE:         LGPLv2+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Kernel-Mode Test Suite Io Regressions KM-Test (Irp)
5  * PROGRAMMER:      Aleksey Bragin <aleksey@reactos.org>
6  */
7 /* Based on code Copyright 2008 Etersoft (Alexander Morozov) */
8 
9 #include <kmt_test.h>
10 
11 #define NDEBUG
12 #include <debug.h>
13 
START_TEST(IoIrp)14 START_TEST(IoIrp)
15 {
16     USHORT size;
17     IRP *iorp;
18 
19     // 1st test
20     size = sizeof(IRP) + 5 * sizeof(IO_STACK_LOCATION);
21     iorp = ExAllocatePool(NonPagedPool, size);
22 
23     if (NULL != iorp)
24     {
25         IoInitializeIrp(iorp, size, 5);
26 
27         ok(6 == iorp->Type, "Irp type should be 6, but got %d\n", iorp->Type);
28         ok(iorp->Size == size, "Irp size should be %d, but got %d\n",
29             iorp->Size, size);
30         ok(5 == iorp->StackCount, "Irp StackCount should be 5, but got %d\n",
31             iorp->StackCount);
32         ok(6 == iorp->CurrentLocation, "Irp CurrentLocation should be 6, but got %d\n",
33             iorp->CurrentLocation);
34         ok(IsListEmpty(&iorp->ThreadListEntry), "IRP thread list is not empty\n");
35         ok ((PIO_STACK_LOCATION)(iorp + 1) + 5 ==
36             iorp->Tail.Overlay.CurrentStackLocation,
37             "CurrentStackLocation mismatch\n");
38 
39         ExFreePool(iorp);
40     }
41 
42     // 2nd test
43     size = sizeof(IRP) + 2 * sizeof(IO_STACK_LOCATION);
44     iorp = IoAllocateIrp(2, FALSE);
45 
46     if (NULL != iorp)
47     {
48         ok(6 == iorp->Type, "Irp type should be 6, but got %d\n", iorp->Type);
49         ok(iorp->Size >= size,
50             "Irp size should be more or equal to %d, but got %d\n",
51             iorp->Size, size);
52         ok(2 == iorp->StackCount, "Irp StackCount should be 2, but got %d\n",
53             iorp->StackCount);
54         ok(3 == iorp->CurrentLocation, "Irp CurrentLocation should be 3, but got %d\n",
55             iorp->CurrentLocation);
56         ok(IsListEmpty(&iorp->ThreadListEntry), "IRP thread list is not empty\n");
57         ok ((PIO_STACK_LOCATION)(iorp + 1) + 2 ==
58             iorp->Tail.Overlay.CurrentStackLocation,
59             "CurrentStackLocation mismatch\n");
60         ok((IRP_ALLOCATED_FIXED_SIZE & iorp->AllocationFlags),
61             "IRP Allocation flags lack fixed size attribute\n");
62         ok(!(IRP_LOOKASIDE_ALLOCATION & iorp->AllocationFlags),
63             "IRP Allocation flags should not have lookaside allocation\n");
64 
65         IoFreeIrp(iorp);
66     }
67 
68     // 3rd test
69     size = sizeof(IRP) + 2 * sizeof(IO_STACK_LOCATION);
70     iorp = IoAllocateIrp(2, TRUE);
71 
72     if (NULL != iorp)
73     {
74         ok(6 == iorp->Type, "Irp type should be 6, but got %d\n", iorp->Type);
75         ok(iorp->Size >= size,
76             "Irp size should be more or equal to %d, but got %d\n",
77             iorp->Size, size);
78         ok(2 == iorp->StackCount, "Irp StackCount should be 2, but got %d\n",
79             iorp->StackCount);
80         ok(3 == iorp->CurrentLocation, "Irp CurrentLocation should be 3, but got %d\n",
81             iorp->CurrentLocation);
82         ok(IsListEmpty(&iorp->ThreadListEntry), "IRP thread list is not empty\n");
83         ok ((PIO_STACK_LOCATION)(iorp + 1) + 2 ==
84             iorp->Tail.Overlay.CurrentStackLocation,
85             "CurrentStackLocation mismatch\n");
86         ok((IRP_ALLOCATED_FIXED_SIZE & iorp->AllocationFlags),
87             "IRP Allocation flags lack fixed size attribute\n");
88         ok((IRP_LOOKASIDE_ALLOCATION & iorp->AllocationFlags),
89             "IRP Allocation flags lack lookaside allocation\n");
90 
91         IoFreeIrp(iorp);
92     }
93 }
94