1 /* 2 * PROJECT: ReactOS kernel-mode tests 3 * LICENSE: GPLv2+ - See COPYING in the top level directory 4 * PURPOSE: Kernel-Mode Test Suite NtCreateSection test user-mode part 5 * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org> 6 */ 7 8 #include <kmt_test.h> 9 10 START_TEST(NtCreateSection) 11 { 12 PVOID Buffer; 13 SIZE_T FileSize; 14 NTSTATUS Status; 15 LARGE_INTEGER MaxFileSize; 16 HANDLE Handle, SectionHandle; 17 IO_STATUS_BLOCK IoStatusBlock; 18 OBJECT_ATTRIBUTES ObjectAttributes; 19 UNICODE_STRING InitOnCreate = RTL_CONSTANT_STRING(L"\\Device\\Kmtest-NtCreateSection\\InitOnCreate"); 20 UNICODE_STRING InitOnRW = RTL_CONSTANT_STRING(L"\\Device\\Kmtest-NtCreateSection\\InitOnRW"); 21 UNICODE_STRING InvalidInit = RTL_CONSTANT_STRING(L"\\Device\\Kmtest-NtCreateSection\\InvalidInit"); 22 DWORD Error; 23 24 Error = KmtLoadAndOpenDriver(L"NtCreateSection", FALSE); 25 ok_eq_int(Error, ERROR_SUCCESS); 26 if (Error) 27 return; 28 29 /* Test 0 */ 30 InitializeObjectAttributes(&ObjectAttributes, &InvalidInit, OBJ_CASE_INSENSITIVE, NULL, NULL); 31 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 32 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 33 ok_eq_hex(Status, STATUS_SUCCESS); 34 35 MaxFileSize.QuadPart = 512; 36 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 37 PAGE_READWRITE, SEC_COMMIT, Handle); 38 ok_eq_hex(Status, STATUS_INVALID_FILE_FOR_SECTION); 39 if (NT_SUCCESS(Status)) NtClose(SectionHandle); 40 Status = NtClose(Handle); 41 ok_eq_hex(Status, STATUS_SUCCESS); 42 43 /* Test 1 */ 44 InitializeObjectAttributes(&ObjectAttributes, &InitOnCreate, OBJ_CASE_INSENSITIVE, NULL, NULL); 45 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 46 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 47 ok_eq_hex(Status, STATUS_SUCCESS); 48 49 MaxFileSize.QuadPart = 512; 50 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 51 PAGE_READWRITE, SEC_COMMIT, Handle); 52 ok_eq_hex(Status, STATUS_SUCCESS); 53 54 Buffer = NULL; 55 FileSize = 0; 56 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 57 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 58 ok_eq_hex(Status, STATUS_SUCCESS); 59 60 KmtStartSeh(); 61 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 62 memset(Buffer, 0xBA, 512); 63 KmtEndSeh(STATUS_SUCCESS); 64 65 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 66 ok_eq_hex(Status, STATUS_SUCCESS); 67 Status = NtClose(SectionHandle); 68 ok_eq_hex(Status, STATUS_SUCCESS); 69 Status = NtClose(Handle); 70 ok_eq_hex(Status, STATUS_SUCCESS); 71 72 /* Test 2 */ 73 InitializeObjectAttributes(&ObjectAttributes, &InitOnCreate, OBJ_CASE_INSENSITIVE, NULL, NULL); 74 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 75 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 76 ok_eq_hex(Status, STATUS_SUCCESS); 77 78 MaxFileSize.QuadPart = 4096; 79 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 80 PAGE_READWRITE, SEC_COMMIT, Handle); 81 ok_eq_hex(Status, STATUS_SUCCESS); 82 83 Buffer = NULL; 84 FileSize = 0; 85 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 86 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 87 ok_eq_hex(Status, STATUS_SUCCESS); 88 89 KmtStartSeh(); 90 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 91 memset(Buffer, 0xBA, 4096); 92 KmtEndSeh(STATUS_SUCCESS); 93 94 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 95 ok_eq_hex(Status, STATUS_SUCCESS); 96 Status = NtClose(SectionHandle); 97 ok_eq_hex(Status, STATUS_SUCCESS); 98 Status = NtClose(Handle); 99 ok_eq_hex(Status, STATUS_SUCCESS); 100 101 /* Test 3 */ 102 InitializeObjectAttributes(&ObjectAttributes, &InitOnRW, OBJ_CASE_INSENSITIVE, NULL, NULL); 103 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 104 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 105 ok_eq_hex(Status, STATUS_SUCCESS); 106 107 MaxFileSize.QuadPart = 512; 108 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 109 PAGE_READWRITE, SEC_COMMIT, Handle); 110 ok_eq_hex(Status, STATUS_SUCCESS); 111 112 Buffer = NULL; 113 FileSize = 0; 114 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 115 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 116 ok_eq_hex(Status, STATUS_SUCCESS); 117 118 KmtStartSeh(); 119 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 120 memset(Buffer, 0xBA, 512); 121 KmtEndSeh(STATUS_SUCCESS); 122 123 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 124 ok_eq_hex(Status, STATUS_SUCCESS); 125 Status = NtClose(SectionHandle); 126 ok_eq_hex(Status, STATUS_SUCCESS); 127 Status = NtClose(Handle); 128 ok_eq_hex(Status, STATUS_SUCCESS); 129 130 /* Test 4 */ 131 InitializeObjectAttributes(&ObjectAttributes, &InitOnRW, OBJ_CASE_INSENSITIVE, NULL, NULL); 132 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 133 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 134 ok_eq_hex(Status, STATUS_SUCCESS); 135 136 MaxFileSize.QuadPart = 4096; 137 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 138 PAGE_READWRITE, SEC_COMMIT, Handle); 139 ok_eq_hex(Status, STATUS_SUCCESS); 140 141 Buffer = NULL; 142 FileSize = 0; 143 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 144 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 145 ok_eq_hex(Status, STATUS_SUCCESS); 146 147 KmtStartSeh(); 148 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 149 memset(Buffer, 0xBA, 4096); 150 KmtEndSeh(STATUS_SUCCESS); 151 152 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 153 ok_eq_hex(Status, STATUS_SUCCESS); 154 Status = NtClose(SectionHandle); 155 ok_eq_hex(Status, STATUS_SUCCESS); 156 Status = NtClose(Handle); 157 ok_eq_hex(Status, STATUS_SUCCESS); 158 159 /* Test 10 */ 160 InitializeObjectAttributes(&ObjectAttributes, &InvalidInit, OBJ_CASE_INSENSITIVE, NULL, NULL); 161 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 162 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 163 ok_eq_hex(Status, STATUS_SUCCESS); 164 165 MaxFileSize.QuadPart = 512; 166 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 167 PAGE_READWRITE, SEC_COMMIT, Handle); 168 ok_eq_hex(Status, STATUS_INVALID_FILE_FOR_SECTION); 169 if (NT_SUCCESS(Status)) NtClose(SectionHandle); 170 Status = NtClose(Handle); 171 ok_eq_hex(Status, STATUS_SUCCESS); 172 173 /* Test 11 */ 174 InitializeObjectAttributes(&ObjectAttributes, &InitOnCreate, OBJ_CASE_INSENSITIVE, NULL, NULL); 175 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 176 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 177 ok_eq_hex(Status, STATUS_SUCCESS); 178 179 MaxFileSize.QuadPart = 512; 180 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 181 PAGE_READWRITE, SEC_COMMIT, Handle); 182 ok_eq_hex(Status, STATUS_SUCCESS); 183 184 Buffer = NULL; 185 FileSize = 0; 186 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 187 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 188 ok_eq_hex(Status, STATUS_SUCCESS); 189 190 KmtStartSeh(); 191 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 192 memset(Buffer, 0xBA, 512); 193 KmtEndSeh(STATUS_SUCCESS); 194 195 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 196 ok_eq_hex(Status, STATUS_SUCCESS); 197 Status = NtClose(SectionHandle); 198 ok_eq_hex(Status, STATUS_SUCCESS); 199 Status = NtClose(Handle); 200 ok_eq_hex(Status, STATUS_SUCCESS); 201 202 /* Test 12 */ 203 InitializeObjectAttributes(&ObjectAttributes, &InitOnCreate, OBJ_CASE_INSENSITIVE, NULL, NULL); 204 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 205 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 206 ok_eq_hex(Status, STATUS_SUCCESS); 207 208 MaxFileSize.QuadPart = 4096; 209 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 210 PAGE_READWRITE, SEC_COMMIT, Handle); 211 ok_eq_hex(Status, STATUS_SUCCESS); 212 213 Buffer = NULL; 214 FileSize = 0; 215 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 216 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 217 ok_eq_hex(Status, STATUS_SUCCESS); 218 219 KmtStartSeh(); 220 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 221 memset(Buffer, 0xBA, 4096); 222 KmtEndSeh(STATUS_SUCCESS); 223 224 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 225 ok_eq_hex(Status, STATUS_SUCCESS); 226 Status = NtClose(SectionHandle); 227 ok_eq_hex(Status, STATUS_SUCCESS); 228 Status = NtClose(Handle); 229 ok_eq_hex(Status, STATUS_SUCCESS); 230 231 /* Test 13 */ 232 InitializeObjectAttributes(&ObjectAttributes, &InitOnRW, OBJ_CASE_INSENSITIVE, NULL, NULL); 233 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 234 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 235 ok_eq_hex(Status, STATUS_SUCCESS); 236 237 MaxFileSize.QuadPart = 512; 238 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 239 PAGE_READWRITE, SEC_COMMIT, Handle); 240 ok_eq_hex(Status, STATUS_SUCCESS); 241 242 Buffer = NULL; 243 FileSize = 0; 244 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 245 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 246 ok_eq_hex(Status, STATUS_SUCCESS); 247 248 KmtStartSeh(); 249 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 250 memset(Buffer, 0xBA, 512); 251 KmtEndSeh(STATUS_SUCCESS); 252 253 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 254 ok_eq_hex(Status, STATUS_SUCCESS); 255 Status = NtClose(SectionHandle); 256 ok_eq_hex(Status, STATUS_SUCCESS); 257 Status = NtClose(Handle); 258 ok_eq_hex(Status, STATUS_SUCCESS); 259 260 /* Test 14 */ 261 InitializeObjectAttributes(&ObjectAttributes, &InitOnRW, OBJ_CASE_INSENSITIVE, NULL, NULL); 262 Status = NtCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 263 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); 264 ok_eq_hex(Status, STATUS_SUCCESS); 265 266 MaxFileSize.QuadPart = 4096; 267 Status = NtCreateSection(&SectionHandle, SECTION_ALL_ACCESS, 0, &MaxFileSize, 268 PAGE_READWRITE, SEC_COMMIT, Handle); 269 ok_eq_hex(Status, STATUS_SUCCESS); 270 271 Buffer = NULL; 272 FileSize = 0; 273 Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &Buffer, 0, 0, 0, 274 &FileSize, ViewUnmap, 0, PAGE_READWRITE); 275 ok_eq_hex(Status, STATUS_SUCCESS); 276 277 KmtStartSeh(); 278 ok(((PCHAR)Buffer)[0] == 0, "First byte is not null! %x\n", ((PCHAR)Buffer)[0]); 279 memset(Buffer, 0xBA, 4096); 280 KmtEndSeh(STATUS_SUCCESS); 281 282 Status = NtUnmapViewOfSection(NtCurrentProcess(), Buffer); 283 ok_eq_hex(Status, STATUS_SUCCESS); 284 Status = NtClose(SectionHandle); 285 ok_eq_hex(Status, STATUS_SUCCESS); 286 Status = NtClose(Handle); 287 ok_eq_hex(Status, STATUS_SUCCESS); 288 289 KmtCloseDriver(); 290 KmtUnloadDriver(); 291 } 292