[KMTESTS]
[reactos.git] / rostests / kmtests / ntos_mm / MmSection.c
1 /*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Section Object test
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
6 */
7
8 #include <kmt_test.h>
9
10 #define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
11 #define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok_eq_hex(ExceptionStatus, ExpectedStatus)
12
13 START_TEST(MmSection)
14 {
15 NTSTATUS Status = STATUS_SUCCESS;
16 NTSTATUS ExceptionStatus;
17 const PVOID InvalidPointer = (PVOID)0x5555555555555555LLU;
18 PVOID SectionObject;
19 LARGE_INTEGER MaximumSize;
20
21 StartSeh()
22 Status = MmCreateSection(NULL, 0, NULL, NULL, 0, SEC_RESERVE, NULL, NULL);
23 EndSeh(STATUS_SUCCESS);
24 ok_eq_hex(Status, STATUS_INVALID_PAGE_PROTECTION);
25
26 if (!KmtIsCheckedBuild)
27 {
28 /* PAGE_NOACCESS and missing SEC_RESERVE/SEC_COMMIT/SEC_IMAGE assert */
29 StartSeh()
30 Status = MmCreateSection(NULL, 0, NULL, NULL, PAGE_NOACCESS, SEC_RESERVE, NULL, NULL);
31 EndSeh(STATUS_ACCESS_VIOLATION);
32
33 StartSeh()
34 Status = MmCreateSection(NULL, 0, NULL, NULL, PAGE_NOACCESS, 0, NULL, NULL);
35 EndSeh(STATUS_ACCESS_VIOLATION);
36 }
37
38 SectionObject = InvalidPointer;
39 StartSeh()
40 Status = MmCreateSection(&SectionObject, 0, NULL, NULL, 0, SEC_RESERVE, NULL, NULL);
41 EndSeh(STATUS_SUCCESS);
42 ok_eq_hex(Status, STATUS_INVALID_PAGE_PROTECTION);
43 ok_eq_pointer(SectionObject, InvalidPointer);
44
45 StartSeh()
46 Status = MmCreateSection(NULL, 0, NULL, NULL, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
47 EndSeh(STATUS_ACCESS_VIOLATION);
48
49 SectionObject = InvalidPointer;
50 StartSeh()
51 Status = MmCreateSection(&SectionObject, 0, NULL, NULL, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
52 EndSeh(STATUS_ACCESS_VIOLATION);
53 ok_eq_pointer(SectionObject, InvalidPointer);
54
55 MaximumSize.QuadPart = 0;
56 StartSeh()
57 Status = MmCreateSection(NULL, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
58 EndSeh(STATUS_SUCCESS);
59 ok_eq_hex(Status, STATUS_INVALID_PARAMETER_4);
60 ok_eq_longlong(MaximumSize.QuadPart, 0LL);
61
62 MaximumSize.QuadPart = 1;
63 StartSeh()
64 Status = MmCreateSection(NULL, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
65 EndSeh(STATUS_ACCESS_VIOLATION);
66 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
67
68 SectionObject = InvalidPointer;
69 MaximumSize.QuadPart = 0;
70 StartSeh()
71 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
72 EndSeh(STATUS_SUCCESS);
73 ok_eq_hex(Status, STATUS_INVALID_PARAMETER_4);
74 ok_eq_longlong(MaximumSize.QuadPart, 0LL);
75 ok_eq_pointer(SectionObject, InvalidPointer);
76
77 SectionObject = InvalidPointer;
78 MaximumSize.QuadPart = 1;
79 StartSeh()
80 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_RESERVE, NULL, NULL);
81 EndSeh(STATUS_SUCCESS);
82 ok_eq_hex(Status, STATUS_SUCCESS);
83 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
84 ok(SectionObject != InvalidPointer, "Section object pointer untouched\n");
85 ok(SectionObject != NULL, "Section object pointer NULL\n");
86
87 if (SectionObject && SectionObject != InvalidPointer)
88 ObDereferenceObject(SectionObject);
89
90 SectionObject = InvalidPointer;
91 MaximumSize.QuadPart = 1;
92 StartSeh()
93 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, NULL, NULL);
94 EndSeh(STATUS_SUCCESS);
95 ok_eq_hex(Status, STATUS_INVALID_FILE_FOR_SECTION);
96 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
97 ok_eq_pointer(SectionObject, InvalidPointer);
98 }