2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite ZwCreateSection
5 * PROGRAMMER: Nikolay Borisov <nib9@aber.ac.uk>
11 #define NO_HANDLE_CLOSE -998
13 extern const char TestString
[];
14 extern const ULONG TestStringSize
;
15 static UNICODE_STRING FileReadOnlyPath
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\system32\\ntdll.dll");
16 static UNICODE_STRING WritableFilePath
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\kmtest-MmSection.txt");
17 static UNICODE_STRING CalcImgPath
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\system32\\calc.exe");
18 static OBJECT_ATTRIBUTES NtdllObject
;
19 static OBJECT_ATTRIBUTES KmtestFileObject
;
20 static OBJECT_ATTRIBUTES CalcFileObject
;
22 #define CREATE_SECTION(Handle, DesiredAccess, Attributes, Size, SectionPageProtection, AllocationAttributes, FileHandle, RetStatus, CloseRetStatus) do \
24 Status = ZwCreateSection(&Handle, DesiredAccess, Attributes, &Size, SectionPageProtection, AllocationAttributes, FileHandle); \
25 ok_eq_hex(Status, RetStatus); \
26 if (NT_SUCCESS(Status)) \
28 if (CloseRetStatus != NO_HANDLE_CLOSE) \
30 Status = ZwClose(Handle); \
32 if (CloseRetStatus != IGNORE) ok_eq_hex(Status, CloseRetStatus); \
37 #define TestMapView(SectionHandle, ProcessHandle, BaseAddress2, ZeroBits, CommitSize, SectionOffset, ViewSize2, InheritDisposition, AllocationType, Win32Protect, MapStatus, UnmapStatus) do \
39 Status = ZwMapViewOfSection(SectionHandle, ProcessHandle, BaseAddress2, ZeroBits, CommitSize, SectionOffset, ViewSize2, InheritDisposition, AllocationType, Win32Protect); \
40 ok_eq_hex(Status, MapStatus); \
41 if (NT_SUCCESS(Status)) \
43 Status = ZwUnmapViewOfSection(ProcessHandle, BaseAddress); \
44 if (UnmapStatus != IGNORE) ok_eq_hex(Status, UnmapStatus); \
45 *BaseAddress2 = NULL; \
50 #define CheckObject(Handle, Pointers, Handles) do \
52 PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \
53 Status = ZwQueryObject(Handle, ObjectBasicInformation, \
54 &ObjectInfo, sizeof ObjectInfo, NULL); \
55 ok_eq_hex(Status, STATUS_SUCCESS); \
56 ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \
57 ok_eq_ulong(ObjectInfo.HandleCount, Handles); \
61 #define CheckSection(SectionHandle, SectionFlag, SectionSize, RetStatus) do \
63 SECTION_BASIC_INFORMATION Sbi; \
65 Status = ZwQuerySection(SectionHandle, SectionBasicInformation, \
66 &Sbi, sizeof Sbi, NULL); \
67 ok_eq_hex(Status, RetStatus); \
68 if (RetStatus == STATUS_SUCCESS && NT_SUCCESS(Status)) \
70 ok_eq_pointer(Sbi.BaseAddress, NULL); \
71 ok_eq_longlong(Sbi.Size.QuadPart, SectionSize); \
72 ok_eq_hex(Sbi.Attributes, SectionFlag | SEC_FILE); \
78 FileSectionViewPermissionCheck(HANDLE ReadOnlyFile
, HANDLE WriteOnlyFile
, HANDLE ExecutableFile
)
81 HANDLE SectionHandle
= NULL
;
82 PVOID BaseAddress
= NULL
;
84 LARGE_INTEGER MaximumSize
;
86 MaximumSize
.QuadPart
= TestStringSize
;
88 //READ-ONLY FILE COMBINATIONS
89 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
90 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
91 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
92 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
93 ZwClose(SectionHandle
);
95 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
96 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
97 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
98 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
99 ZwClose(SectionHandle
);
101 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
102 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
103 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
104 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
105 ZwClose(SectionHandle
);
107 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
108 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
109 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
110 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
111 ZwClose(SectionHandle
);
113 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
114 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
115 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
116 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
117 ZwClose(SectionHandle
);
119 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
120 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
121 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
122 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
123 ZwClose(SectionHandle
);
125 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
126 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
127 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
128 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
129 ZwClose(SectionHandle
);
131 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
132 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
133 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
134 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
135 ZwClose(SectionHandle
);
137 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
138 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
139 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
140 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
141 ZwClose(SectionHandle
);
143 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
144 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
145 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
146 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
147 ZwClose(SectionHandle
);
149 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
150 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
151 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
152 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
153 ZwClose(SectionHandle
);
155 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ReadOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
156 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
157 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
158 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
159 ZwClose(SectionHandle
);
161 //WRITE-ONLY FILE COMBINATIONS
162 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
163 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
164 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
165 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
166 ZwClose(SectionHandle
);
168 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
169 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
170 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
171 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
172 ZwClose(SectionHandle
);
174 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
175 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
176 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
177 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
178 ZwClose(SectionHandle
);
180 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
181 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
182 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
183 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
184 ZwClose(SectionHandle
);
186 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
187 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
188 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
189 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
190 ZwClose(SectionHandle
);
192 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
193 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
194 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
195 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
196 ZwClose(SectionHandle
);
198 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
199 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
200 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
201 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
202 ZwClose(SectionHandle
);
204 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
205 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
206 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
207 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
208 ZwClose(SectionHandle
);
210 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
211 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
212 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
213 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
214 ZwClose(SectionHandle
);
216 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
217 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
218 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
219 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
220 ZwClose(SectionHandle
);
222 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
223 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
224 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
225 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SUCCESS
, STATUS_SUCCESS
);
226 ZwClose(SectionHandle
);
228 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, WriteOnlyFile
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
229 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READWRITE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
230 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_READONLY
, STATUS_SUCCESS
, STATUS_SUCCESS
);
231 TestMapView(SectionHandle
, ZwCurrentProcess(), &BaseAddress
, 0, 0, NULL
, &ViewSize
, ViewUnmap
, 0, PAGE_EXECUTE
, STATUS_SECTION_PROTECTION
, STATUS_SUCCESS
);
232 ZwClose(SectionHandle
);
235 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
236 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
237 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
238 CREATE_SECTION(SectionHandle
, SECTION_MAP_READ
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
240 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
241 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
242 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
243 CREATE_SECTION(SectionHandle
, SECTION_MAP_WRITE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
245 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
246 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
247 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_EXECUTE
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
248 CREATE_SECTION(SectionHandle
, SECTION_MAP_EXECUTE
, NULL
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, ExecutableFile
, STATUS_SUCCESS
, STATUS_SUCCESS
);
253 KmtInitTestFiles(PHANDLE ReadOnlyFile
, PHANDLE WriteOnlyFile
, PHANDLE ExecutableFile
)
256 LARGE_INTEGER FileOffset
;
257 IO_STATUS_BLOCK IoStatusBlock
;
259 //INIT THE READ-ONLY FILE
260 Status
= ZwCreateFile(ReadOnlyFile
, ( GENERIC_READ
| GENERIC_EXECUTE
), &NtdllObject
, &IoStatusBlock
, NULL
, FILE_ATTRIBUTE_NORMAL
, FILE_SHARE_READ
, FILE_OPEN
, FILE_NON_DIRECTORY_FILE
, NULL
, 0);
261 ok_eq_hex(Status
, STATUS_SUCCESS
);
262 ok(*ReadOnlyFile
!= NULL
, "Couldn't acquire READONLY handle\n");
264 //INIT THE EXECUTABLE FILE
265 Status
= ZwCreateFile(ExecutableFile
, GENERIC_EXECUTE
, &CalcFileObject
, &IoStatusBlock
, NULL
, FILE_ATTRIBUTE_NORMAL
, FILE_SHARE_READ
, FILE_OPEN
, FILE_NON_DIRECTORY_FILE
, NULL
, 0);
266 ok_eq_hex(Status
, STATUS_SUCCESS
);
267 ok(*ExecutableFile
!= NULL
, "Couldn't acquire EXECUTE handle\n");
269 //INIT THE WRITE-ONLY FILE
270 //NB: this file is deleted at the end of basic behavior checks
271 Status
= ZwCreateFile(WriteOnlyFile
, (GENERIC_WRITE
| SYNCHRONIZE
), &KmtestFileObject
, &IoStatusBlock
, NULL
, FILE_ATTRIBUTE_NORMAL
, FILE_SHARE_WRITE
, FILE_SUPERSEDE
, FILE_NON_DIRECTORY_FILE
, NULL
, 0);
272 ok_eq_hex(Status
, STATUS_SUCCESS
);
273 ok_eq_ulongptr(IoStatusBlock
.Information
, FILE_CREATED
);
274 ok(*WriteOnlyFile
!= NULL
, "WriteOnlyFile is NULL\n");
277 FileOffset
.QuadPart
= 0;
278 Status
= ZwWriteFile(*WriteOnlyFile
, NULL
, NULL
, NULL
, &IoStatusBlock
, (PVOID
)TestString
, TestStringSize
, &FileOffset
, NULL
);
279 ok(Status
== STATUS_SUCCESS
|| Status
== STATUS_PENDING
, "Status = 0x%08lx\n", Status
);
280 Status
= ZwWaitForSingleObject(*WriteOnlyFile
, FALSE
, NULL
);
281 ok_eq_hex(Status
, STATUS_SUCCESS
);
282 ok_eq_ulongptr(IoStatusBlock
.Information
, TestStringSize
);
288 SimpleErrorChecks(HANDLE FileHandleReadOnly
, HANDLE FileHandleWriteOnly
, HANDLE FileHandleExecuteOnly
)
291 HANDLE Section
= NULL
;
292 OBJECT_ATTRIBUTES ObjectAttributesReadOnly
;
293 OBJECT_ATTRIBUTES ObjectAttributesWriteOnly
;
294 OBJECT_ATTRIBUTES InvalidObjectAttributes
;
295 IO_STATUS_BLOCK IoStatusBlock
;
296 FILE_STANDARD_INFORMATION FileStandardInfo
;
297 LARGE_INTEGER MaximumSize
;
298 UNICODE_STRING SectReadOnly
= RTL_CONSTANT_STRING(L
"\\BaseNamedObjects\\KmtTestReadSect");
299 UNICODE_STRING SectWriteOnly
= RTL_CONSTANT_STRING(L
"\\BaseNamedObjects\\KmtTestWriteSect");
300 UNICODE_STRING InvalidObjectString
= RTL_CONSTANT_STRING(L
"THIS/IS/INVALID");
302 MaximumSize
.QuadPart
= TestStringSize
;
304 InitializeObjectAttributes(&ObjectAttributesReadOnly
, &SectReadOnly
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
305 InitializeObjectAttributes(&ObjectAttributesWriteOnly
, &SectWriteOnly
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
306 InitializeObjectAttributes(&InvalidObjectAttributes
, &InvalidObjectString
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
308 ///////////////////////////////////////////////////////////////////////////////////////
309 //PAGE FILE BACKED SECTION
310 //DESIRED ACCESS TESTS
311 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
312 CREATE_SECTION(Section
, 0, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
313 CREATE_SECTION(Section
, -1, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
316 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &ObjectAttributesReadOnly
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
317 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &InvalidObjectAttributes
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_OBJECT_PATH_SYNTAX_BAD
, STATUS_SUCCESS
);
320 MaximumSize
.QuadPart
= -1;
321 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SECTION_TOO_BIG
, IGNORE
);
323 MaximumSize
.QuadPart
= 0;
324 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_INVALID_PARAMETER_4
, IGNORE
);
326 //division by zero in ROS
327 if (!skip(SharedUserData
->LargePageMinimum
> 0, "LargePageMinimum is 0"))
329 MaximumSize
.QuadPart
= (_4mb
/ SharedUserData
->LargePageMinimum
) * SharedUserData
->LargePageMinimum
; //4mb
330 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_LARGE_PAGES
| SEC_COMMIT
), NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
333 MaximumSize
.QuadPart
= TestStringSize
;
335 //SECTION PAGE PROTECTION
336 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
337 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READWRITE
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
338 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_WRITECOPY
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
339 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
340 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_EXECUTE_READ
| PAGE_READWRITE
), SEC_COMMIT
, NULL
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
341 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_READONLY
| PAGE_READWRITE
), SEC_COMMIT
, NULL
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
342 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_WRITECOPY
| PAGE_READONLY
), SEC_COMMIT
, NULL
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
343 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, 0, SEC_COMMIT
, NULL
, STATUS_INVALID_PAGE_PROTECTION
, STATUS_SUCCESS
);
344 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, -1, SEC_COMMIT
, NULL
, STATUS_INVALID_PAGE_PROTECTION
, STATUS_SUCCESS
);
346 //ALLOCATION ATTRIBUTES
347 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, 0, NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
348 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_COMMIT
| SEC_RESERVE
), NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
349 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_RESERVE
, NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
350 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_IMAGE
, NULL
, STATUS_INVALID_FILE_FOR_SECTION
, IGNORE
);
351 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_IMAGE
| SEC_COMMIT
), NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
352 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, -1, NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
353 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_LARGE_PAGES
, NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
354 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_LARGE_PAGES
| SEC_COMMIT
), NULL
, STATUS_INVALID_PARAMETER_4
, IGNORE
);
355 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_NOCACHE
, NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
356 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_RESERVE
| SEC_COMMIT
), NULL
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
357 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_COMMIT
), NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
358 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_RESERVE
), NULL
, STATUS_SUCCESS
, STATUS_SUCCESS
);
360 /////////////////////////////////////////////////////////////////////////////////////////////
361 //NORMAL FILE-BACKED SECTION
363 //DESIRED ACCESS TESTS
364 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &ObjectAttributesReadOnly
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleReadOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
365 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
366 CREATE_SECTION(Section
, SECTION_MAP_WRITE
, &ObjectAttributesReadOnly
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleReadOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
367 CREATE_SECTION(Section
, SECTION_MAP_READ
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
370 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleReadOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
371 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &InvalidObjectAttributes
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleReadOnly
, STATUS_OBJECT_PATH_SYNTAX_BAD
, IGNORE
);
374 MaximumSize
.QuadPart
= TestStringSize
- 100;
375 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
377 MaximumSize
.QuadPart
= -1;
378 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SECTION_TOO_BIG
, IGNORE
);
380 MaximumSize
.QuadPart
= TestStringSize
+ 1;
381 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SECTION_TOO_BIG
, IGNORE
);
383 MaximumSize
.QuadPart
= 0;
384 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
386 //SECTION PAGE PROTECTION
387 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
388 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READWRITE
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
389 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_WRITECOPY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
390 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
391 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_EXECUTE_READ
| PAGE_READWRITE
), SEC_COMMIT
, FileHandleWriteOnly
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
392 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_READONLY
| PAGE_READWRITE
), SEC_COMMIT
, FileHandleWriteOnly
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
393 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, (PAGE_WRITECOPY
| PAGE_READONLY
), SEC_COMMIT
, FileHandleWriteOnly
, STATUS_INVALID_PAGE_PROTECTION
, IGNORE
);
394 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, 0, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_INVALID_PAGE_PROTECTION
, STATUS_SUCCESS
);
395 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, -1, SEC_COMMIT
, FileHandleWriteOnly
, STATUS_INVALID_PAGE_PROTECTION
, STATUS_SUCCESS
);
398 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, 0, FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
399 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_COMMIT
| SEC_RESERVE
), FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
400 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_RESERVE
, FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
401 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_IMAGE
| SEC_COMMIT
), FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
402 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, -1, FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
403 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_LARGE_PAGES
, FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
404 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_LARGE_PAGES
| SEC_COMMIT
), FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
405 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_NOCACHE
, FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
406 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_RESERVE
| SEC_COMMIT
), FileHandleWriteOnly
, STATUS_INVALID_PARAMETER_6
, IGNORE
);
407 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_COMMIT
), FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
408 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, (SEC_NOCACHE
| SEC_RESERVE
), FileHandleWriteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
409 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READWRITE
, SEC_IMAGE
, FileHandleWriteOnly
, STATUS_INVALID_IMAGE_NOT_MZ
, IGNORE
);
411 //////////////////////////////////////////////////
413 CREATE_SECTION(Section
, SECTION_MAP_READ
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
414 CREATE_SECTION(Section
, SECTION_MAP_EXECUTE
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
416 //DESIRED ACCESS TESTS
417 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &ObjectAttributesReadOnly
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
418 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
419 CREATE_SECTION(Section
, SECTION_MAP_WRITE
, &ObjectAttributesReadOnly
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
420 CREATE_SECTION(Section
, SECTION_MAP_READ
, &ObjectAttributesWriteOnly
, MaximumSize
, PAGE_WRITECOPY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
423 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
424 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, &InvalidObjectAttributes
, MaximumSize
, PAGE_READONLY
, SEC_COMMIT
, FileHandleExecuteOnly
, STATUS_OBJECT_PATH_SYNTAX_BAD
, IGNORE
);
427 Status
= ZwQueryInformationFile(FileHandleExecuteOnly
, &IoStatusBlock
, &FileStandardInfo
, sizeof(FILE_STANDARD_INFORMATION
), FileStandardInformation
);
428 if (!skip(NT_SUCCESS(Status
), "Cannot query file information"))
431 MaximumSize
= FileStandardInfo
.EndOfFile
;
432 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
435 MaximumSize
.QuadPart
= FileStandardInfo
.EndOfFile
.QuadPart
- 2;
436 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
439 MaximumSize
.QuadPart
= FileStandardInfo
.EndOfFile
.QuadPart
+ 2;
440 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
443 MaximumSize
.QuadPart
= 0;
444 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SUCCESS
, STATUS_SUCCESS
);
446 //-1 (very big number)
447 MaximumSize
.QuadPart
= -1;
448 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, MaximumSize
, PAGE_EXECUTE_READ
, SEC_IMAGE
, FileHandleExecuteOnly
, STATUS_SECTION_TOO_BIG
, IGNORE
);
454 BasicBehaviorChecks(HANDLE FileHandle
)
457 HANDLE Section
= NULL
;
458 #ifdef ROSTESTS_108_FIXED
459 PFILE_OBJECT FileObject
;
460 #endif /* ROSTESTS_108_FIXED */
461 LARGE_INTEGER Length
;
462 Length
.QuadPart
= TestStringSize
;
464 /* FIXME: Null pointer dereference. See ROSTESTS-108 */
465 #ifdef ROSTESTS_108_FIXED
466 //mimic lack of section support for a particular file as well.
467 Status
= ObReferenceObjectByHandle(FileHandle
, STANDARD_RIGHTS_ALL
, *IoFileObjectType
, KernelMode
, (PVOID
*)&FileObject
, NULL
);
468 if (!skip(NT_SUCCESS(Status
), "Cannot reference object by handle\n"))
470 PSECTION_OBJECT_POINTERS Pointers
= FileObject
->SectionObjectPointer
;
472 FileObject
->SectionObjectPointer
= NULL
;
473 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, Length
, PAGE_READONLY
, SEC_COMMIT
, FileHandle
, STATUS_INVALID_FILE_FOR_SECTION
, IGNORE
);
474 FileObject
->SectionObjectPointer
= Pointers
;
475 ObDereferenceObject(FileObject
);
477 #endif /* ROSTESTS_108_FIXED */
478 Length
.QuadPart
= TestStringSize
;
479 CREATE_SECTION(Section
, (SECTION_ALL_ACCESS
), NULL
, Length
, PAGE_READONLY
, SEC_COMMIT
, FileHandle
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
480 CheckObject(Section
, 2, 1);
481 CheckSection(Section
, SEC_FILE
, Length
.QuadPart
, STATUS_SUCCESS
);
482 ZwClose(Section
); //manually close it due to NO_HANDLE_CLOSE in CREATE_SECTION
484 //section length should be set to that of file
486 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, Length
, PAGE_READONLY
, SEC_COMMIT
, FileHandle
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
487 CheckSection(Section
, SEC_FILE
, TestStringSize
, STATUS_SUCCESS
);
490 //create a smaller section than file
491 Length
.QuadPart
= TestStringSize
- 100;
492 CREATE_SECTION(Section
, SECTION_ALL_ACCESS
, NULL
, Length
, PAGE_READONLY
, SEC_COMMIT
, FileHandle
, STATUS_SUCCESS
, NO_HANDLE_CLOSE
);
493 CheckSection(Section
, SEC_FILE
, TestStringSize
- 100, STATUS_SUCCESS
);
498 START_TEST(ZwCreateSection
)
500 HANDLE FileHandleReadOnly
= NULL
;
501 HANDLE FileHandleWriteOnly
= NULL
;
502 HANDLE FileHandleExecuteOnly
= NULL
;
504 InitializeObjectAttributes(&NtdllObject
, &FileReadOnlyPath
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
505 InitializeObjectAttributes(&KmtestFileObject
, &WritableFilePath
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
506 InitializeObjectAttributes(&CalcFileObject
, &CalcImgPath
, OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
, NULL
, NULL
);
508 KmtInitTestFiles(&FileHandleReadOnly
, &FileHandleWriteOnly
, &FileHandleExecuteOnly
);
510 if (FileHandleReadOnly
&& FileHandleWriteOnly
&& FileHandleExecuteOnly
)
512 FileSectionViewPermissionCheck(FileHandleReadOnly
, FileHandleWriteOnly
, FileHandleExecuteOnly
);
513 SimpleErrorChecks(FileHandleReadOnly
, FileHandleWriteOnly
, FileHandleExecuteOnly
);
514 BasicBehaviorChecks(FileHandleWriteOnly
);
517 if (FileHandleReadOnly
)
518 ZwClose(FileHandleReadOnly
);
520 if (FileHandleWriteOnly
)
522 ZwClose(FileHandleWriteOnly
);
523 ZwDeleteFile(&KmtestFileObject
);
526 if (FileHandleExecuteOnly
)
527 ZwClose(FileHandleExecuteOnly
);