ReactOS 0.4.15-dev-7958-gcd0bb1a
MmSection.c
Go to the documentation of this file.
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 <thomas.faber@reactos.org>
6 */
7
8#include <kmt_test.h>
9
10#define CheckObject(Handle, Pointers, Handles) do \
11{ \
12 PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \
13 Status = ZwQueryObject(Handle, ObjectBasicInformation, \
14 &ObjectInfo, sizeof ObjectInfo, NULL); \
15 ok_eq_hex(Status, STATUS_SUCCESS); \
16 ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \
17 ok_eq_ulong(ObjectInfo.HandleCount, Handles); \
18} while (0)
19
20#define CheckSection(SectionObject, SectionFlag) do \
21{ \
22 SECTION_BASIC_INFORMATION Sbi; \
23 HANDLE SectionHandle = NULL; \
24 NTSTATUS Status; \
25 if (skip(SectionObject != NULL && \
26 SectionObject != (PVOID)0x5555555555555555ULL, \
27 "No section object\n")) \
28 break; \
29 Status = ObOpenObjectByPointer(SectionObject, OBJ_KERNEL_HANDLE, \
30 NULL, 0, MmSectionObjectType, \
31 KernelMode, &SectionHandle); \
32 ok_eq_hex(Status, STATUS_SUCCESS); \
33 ok(SectionHandle != NULL, "Section handle null\n"); \
34 if (!skip(NT_SUCCESS(Status) && SectionHandle, \
35 "No section handle\n")) \
36 { \
37 Status = ZwQuerySection(SectionHandle, SectionBasicInformation, \
38 &Sbi, sizeof Sbi, NULL); \
39 ok_eq_hex(Status, STATUS_SUCCESS); \
40 ok_eq_pointer(Sbi.BaseAddress, NULL); \
41 ok_eq_longlong(Sbi.Size.QuadPart, 1LL); \
42 ok_eq_hex(Sbi.Attributes, SectionFlag | SEC_FILE); \
43 ZwClose(SectionHandle); \
44 } \
45} while (0)
46
47#define TestMapView(SectionObject, ExpectAtBase, ExpectM) do \
48{ \
49 NTSTATUS Status; \
50 PVOID BaseAddress = NULL; \
51 SIZE_T ViewSize = 0; \
52 LARGE_INTEGER SectionOffset; \
53 if (skip(SectionObject != NULL && \
54 SectionObject != (PVOID)0x5555555555555555ULL, \
55 "No section object\n")) \
56 break; \
57 \
58 SectionOffset.QuadPart = 0; \
59 Status = MmMapViewOfSection(SectionObject, PsGetCurrentProcess(), \
60 &BaseAddress, 0, 1, &SectionOffset, \
61 &ViewSize, ViewUnmap, 0, PAGE_READONLY); \
62 ok_eq_hex(Status, ExpectAtBase ? STATUS_SUCCESS : STATUS_IMAGE_NOT_AT_BASE);\
63 if (!skip(NT_SUCCESS(Status), "Section not mapped\n")) \
64 { \
65 ok((LONG_PTR)BaseAddress > 0, "BaseAddress = %p\n", BaseAddress); \
66 ok_eq_uint(*(PUCHAR)BaseAddress, ExpectM ? 'M' : 0); \
67 Status = MmUnmapViewOfSection(PsGetCurrentProcess(), BaseAddress); \
68 ok_eq_hex(Status, STATUS_SUCCESS); \
69 } \
70 BaseAddress = NULL; \
71 ViewSize = 0; \
72 Status = MmMapViewOfSection(SectionObject, PsGetCurrentProcess(), \
73 &BaseAddress, 0, 1, &SectionOffset, \
74 &ViewSize, ViewUnmap, 0, \
75 PAGE_READONLY | PAGE_NOCACHE); \
76 ok_eq_hex(Status, ExpectAtBase ? STATUS_SUCCESS : STATUS_IMAGE_NOT_AT_BASE);\
77 if (!skip(NT_SUCCESS(Status), "Section not mapped\n")) \
78 { \
79 ok((LONG_PTR)BaseAddress > 0, "BaseAddress = %p\n", BaseAddress); \
80 ok_eq_uint(*(PUCHAR)BaseAddress, ExpectM ? 'M' : 0); \
81 Status = MmUnmapViewOfSection(PsGetCurrentProcess(), BaseAddress); \
82 ok_eq_hex(Status, STATUS_SUCCESS); \
83 } \
84} while (0)
85
86static
87VOID
89 IN HANDLE FileHandle1,
90 IN PFILE_OBJECT FileObject1,
91 IN HANDLE FileHandle2,
92 IN PFILE_OBJECT FileObject2)
93{
97 ULONG PointerCount1, PointerCount2;
98
103
105 {
106 /* PAGE_NOACCESS and missing SEC_RESERVE/SEC_COMMIT/SEC_IMAGE assert */
110
114 }
115
122
125
129
135
138
140 MaximumSize.QuadPart = 0;
145 ok_eq_longlong(MaximumSize.QuadPart, 0LL);
147
150
151 MaximumSize.QuadPart = 0;
156 ok_eq_longlong(MaximumSize.QuadPart, 0LL);
157
160
161 MaximumSize.QuadPart = 1;
165 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
166
169
171 MaximumSize.QuadPart = 0;
176 ok_eq_longlong(MaximumSize.QuadPart, 0LL);
178
181
182 /* page file section */
184 MaximumSize.QuadPart = 1;
189 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
190 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
191 ok(SectionObject != NULL, "Section object pointer NULL\n");
192
195
196 if (!skip(FileHandle1 != NULL && FileObject1 != NULL &&
197 FileHandle2 != NULL && FileObject2 != NULL, "No file handle or object\n"))
198 {
199 PointerCount1 = 3;
200 PointerCount2 = 3;
201 /* image section */
202 CheckObject(FileHandle2, PointerCount2, 1L);
204 MaximumSize.QuadPart = 1;
209 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
210 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
211 ok(SectionObject != NULL, "Section object pointer NULL\n");
212 CheckObject(FileHandle2, PointerCount2, 1L);
215
218
219 CheckObject(FileHandle2, PointerCount2, 1L);
221 MaximumSize.QuadPart = 1;
226 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
227 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
228 ok(SectionObject != NULL, "Section object pointer NULL\n");
229 ++PointerCount2;
230 CheckObject(FileHandle2, PointerCount2, 1L);
233
236 //--PointerCount2; // ????
237
238 CheckObject(FileHandle2, PointerCount2, 1L);
240 MaximumSize.QuadPart = 1;
242 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle2, FileObject2);
245 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
246 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
247 ok(SectionObject != NULL, "Section object pointer NULL\n");
248 CheckObject(FileHandle2, PointerCount2, 1L);
251
254
255 /* image section with inappropriate file */
256 CheckObject(FileHandle1, PointerCount1, 1L);
258 MaximumSize.QuadPart = 1;
263 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
265 CheckObject(FileHandle1, PointerCount1, 1L);
266
269
270 CheckObject(FileHandle1, PointerCount1, 1L);
272 MaximumSize.QuadPart = 1;
277 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
278 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
279 ok(SectionObject != NULL, "Section object pointer NULL\n");
280 ++PointerCount1;
281 CheckObject(FileHandle1, PointerCount1, 1L);
284
287 //--PointerCount1; // ????
288
289 CheckObject(FileHandle1, PointerCount1, 1L);
291 MaximumSize.QuadPart = 1;
293 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle1, FileObject1);
296 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
297 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
298 ok(SectionObject != NULL, "Section object pointer NULL\n");
299 CheckObject(FileHandle1, PointerCount1, 1L);
302
305
306 /* image section with two different files */
307 CheckObject(FileHandle1, PointerCount1, 1L);
309 MaximumSize.QuadPart = 1;
311 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle1, FileObject2);
314 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
315 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
316 ok(SectionObject != NULL, "Section object pointer NULL\n");
317 CheckObject(FileHandle1, PointerCount1, 1L);
318 CheckObject(FileHandle2, PointerCount2, 1L);
321
324
325 CheckObject(FileHandle1, PointerCount1, 1L);
327 MaximumSize.QuadPart = 1;
329 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle2, FileObject1);
332 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
333 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
334 ok(SectionObject != NULL, "Section object pointer NULL\n");
335 CheckObject(FileHandle1, PointerCount1, 1L);
336 CheckObject(FileHandle2, PointerCount2, 1L);
339
342
343 /* data file section */
344 CheckObject(FileHandle1, PointerCount1, 1L);
346 MaximumSize.QuadPart = 1;
351 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
352 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
353 ok(SectionObject != NULL, "Section object pointer NULL\n");
354 CheckObject(FileHandle1, PointerCount1, 1L);
357
360
361 CheckObject(FileHandle1, PointerCount1, 1L);
363 MaximumSize.QuadPart = 1;
368 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
369 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
370 ok(SectionObject != NULL, "Section object pointer NULL\n");
371 CheckObject(FileHandle1, PointerCount1, 1L);
374
377
378 CheckObject(FileHandle1, PointerCount1, 1L);
380 MaximumSize.QuadPart = 1;
382 Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_RESERVE, FileHandle1, FileObject1);
385 ok_eq_longlong(MaximumSize.QuadPart, 1LL);
386 ok(SectionObject != KmtInvalidPointer, "Section object pointer untouched\n");
387 ok(SectionObject != NULL, "Section object pointer NULL\n");
388 CheckObject(FileHandle1, PointerCount1, 1L);
391
394
395 CheckObject(FileHandle1, PointerCount1, 1L);
396 }
397}
398
399static
400VOID
402{
404 UNICODE_STRING SectionName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
406 HANDLE SectionHandle;
408 PUCHAR MyPage;
409 PHYSICAL_ADDRESS MyPagePhysical;
410 PUCHAR ZeroPageContents;
411 PHYSICAL_ADDRESS ZeroPagePhysical;
414 SYSTEM_BASIC_INFORMATION BasicInfo;
415 PUCHAR MappingBytes;
417 SIZE_T EqualBytes;
418 struct
419 {
423 } *UserStruct;
424 PVOID UserMem;
425 SIZE_T UserSize;
426
428 if (skip(MyPage != NULL, "Out of memory\n"))
429 return;
430 MyPagePhysical = MmGetPhysicalAddress(MyPage);
431 RtlFillMemory(MyPage + 0 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0x23);
432 RtlFillMemory(MyPage + 1 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0x67);
433 RtlFillMemory(MyPage + 2 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0xab);
434 RtlFillMemory(MyPage + 3 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0xef);
435
436 ZeroPageContents = ExAllocatePoolWithTag(PagedPool, PAGE_SIZE, 'ZPmK');
437 if (skip(ZeroPageContents != NULL, "Out of memory\n"))
438 {
439 ExFreePoolWithTag(MyPage, 'MPmK');
440 return;
441 }
442 ZeroPagePhysical.QuadPart = 0;
443
444 Mapping = MmMapIoSpace(ZeroPagePhysical, PAGE_SIZE, MmCached);
445 if (skip(Mapping != NULL, "Failed to map zero page\n"))
446 {
447 ExFreePoolWithTag(ZeroPageContents, 'ZPmK');
448 ExFreePoolWithTag(MyPage, 'MPmK');
449 return;
450 }
451
452 RtlCopyMemory(ZeroPageContents, Mapping, PAGE_SIZE);
454
456 &SectionName,
457 0,
458 NULL,
459 NULL);
462 if (!skip(NT_SUCCESS(Status), "No section\n"))
463 {
464 /* Map zero page and compare */
465 Mapping = NULL;
467 Status = ZwMapViewOfSection(SectionHandle,
469 &Mapping,
470 0,
471 0,
472 &ZeroPagePhysical,
473 &ViewSize,
474 ViewUnmap,
475 0,
478 if (!skip(NT_SUCCESS(Status), "No view\n"))
479 {
480 ok((LONG_PTR)Mapping > 0, "Mapping = %p\n", Mapping);
481 EqualBytes = RtlCompareMemory(Mapping,
482 ZeroPageContents,
483 PAGE_SIZE);
484 ok_eq_size(EqualBytes, PAGE_SIZE);
485 Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
487 }
488
489 /* Map the zero page non-cached */
490 Mapping = NULL;
492 Status = ZwMapViewOfSection(SectionHandle,
494 &Mapping,
495 0,
496 0,
497 &ZeroPagePhysical,
498 &ViewSize,
499 ViewUnmap,
500 0,
503 if (!skip(NT_SUCCESS(Status), "No view\n"))
504 {
505 ok((LONG_PTR)Mapping > 0, "Mapping = %p\n", Mapping);
506 EqualBytes = RtlCompareMemory(Mapping,
507 ZeroPageContents,
508 PAGE_SIZE);
509 ok_eq_size(EqualBytes, PAGE_SIZE);
510 Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
512 }
513
514 /* Map our NP page, compare, and check that modifications are reflected */
515 Mapping = NULL;
517 Status = ZwMapViewOfSection(SectionHandle,
519 &Mapping,
520 0,
521 0,
522 &MyPagePhysical,
523 &ViewSize,
524 ViewUnmap,
525 0,
528 if (!skip(NT_SUCCESS(Status), "No view\n"))
529 {
530 ok((LONG_PTR)Mapping > 0, "Mapping = %p\n", Mapping);
531 EqualBytes = RtlCompareMemory(Mapping,
532 MyPage,
533 PAGE_SIZE);
534 ok_eq_size(EqualBytes, PAGE_SIZE);
535
536 MappingBytes = Mapping;
537 ok(MappingBytes[5] == 0x23, "Mapping[5] = 0x%x\n", MappingBytes[5]);
538 ok(MyPage[5] == 0x23, "MyPage[5] = 0x%x\n", MyPage[5]);
539
540 MyPage[5] = 0x44;
541 ok(MappingBytes[5] == 0x44, "Mapping[5] = 0x%x\n", MappingBytes[5]);
542 ok(MyPage[5] == 0x44, "MyPage[5] = 0x%x\n", MyPage[5]);
543
544 MappingBytes[5] = 0x88;
545 ok(MappingBytes[5] == 0x88, "Mapping[5] = 0x%x\n", MappingBytes[5]);
546 ok(MyPage[5] == 0x88, "MyPage[5] = 0x%x\n", MyPage[5]);
547
548 Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
550 }
551
552 /* Unaligned mapping will get aligned automatically */
553 Mapping = NULL;
554 ViewSize = PAGE_SIZE - 4;
555 PhysicalAddress.QuadPart = MyPagePhysical.QuadPart + 4;
556 Status = ZwMapViewOfSection(SectionHandle,
558 &Mapping,
559 0,
560 0,
562 &ViewSize,
563 ViewUnmap,
564 0,
567 if (!skip(NT_SUCCESS(Status), "No view\n"))
568 {
569 ok((LONG_PTR)Mapping > 0, "Mapping = %p\n", Mapping);
570 ok(((ULONG_PTR)Mapping % PAGE_SIZE) == 0, "Mapping = %p\n", Mapping);
572
573 EqualBytes = RtlCompareMemory(Mapping,
574 MyPage,
575 PAGE_SIZE);
576 ok_eq_size(EqualBytes, PAGE_SIZE);
577
578 Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
580 }
581
582 /* The following tests need to pass parameters in user mode */
583 UserStruct = NULL;
584 UserMem = NULL;
585 UserSize = PAGE_SIZE;
586 Status = ZwAllocateVirtualMemory(ZwCurrentProcess(),
587 &UserMem,
588 0,
589 &UserSize,
593 if (NT_SUCCESS(Status))
594 UserStruct = UserMem;
595
596 /* Find highest physical page -- only kernel can map beyond this */
598 &BasicInfo,
599 sizeof(BasicInfo),
600 NULL);
602 trace("HighestPhysicalPageNumber: %lx\n", BasicInfo.HighestPhysicalPageNumber);
603
604 /* Start one page before highest physical -- succeeds for user/kernel */
605 Mapping = NULL;
608 Status = ZwMapViewOfSection(SectionHandle,
610 &Mapping,
611 0,
612 0,
614 &ViewSize,
615 ViewUnmap,
616 0,
619 if (NT_SUCCESS(Status))
620 ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
621
622 /* Repeat from user mode */
623 if (!skip(UserStruct != NULL, "No user memory\n"))
624 {
626 UserStruct->Mapping = NULL;
627 UserStruct->PhysicalAddress.QuadPart = PhysicalAddress.QuadPart;
628 UserStruct->ViewSize = PAGE_SIZE;
630
631 Status = NtMapViewOfSection(SectionHandle,
633 &UserStruct->Mapping,
634 0,
635 0,
636 &UserStruct->PhysicalAddress,
637 &UserStruct->ViewSize,
638 ViewUnmap,
639 0,
642 if (NT_SUCCESS(Status))
643 {
645 ZwUnmapViewOfSection(ZwCurrentProcess(), UserStruct->Mapping);
647 }
648 }
649
650 /* Now start at highest physical -- fails for user */
651 Mapping = NULL;
654 Status = ZwMapViewOfSection(SectionHandle,
656 &Mapping,
657 0,
658 0,
660 &ViewSize,
661 ViewUnmap,
662 0,
665 if (NT_SUCCESS(Status))
666 ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
667
668 /* Repeat from user mode */
669 if (!skip(UserStruct != NULL, "No user memory\n"))
670 {
672 UserStruct->Mapping = NULL;
673 UserStruct->PhysicalAddress.QuadPart = PhysicalAddress.QuadPart;
674 UserStruct->ViewSize = PAGE_SIZE;
676
677 Status = NtMapViewOfSection(SectionHandle,
679 &UserStruct->Mapping,
680 0,
681 0,
682 &UserStruct->PhysicalAddress,
683 &UserStruct->ViewSize,
684 ViewUnmap,
685 0,
688 if (NT_SUCCESS(Status))
689 {
691 ZwUnmapViewOfSection(ZwCurrentProcess(), UserStruct->Mapping);
693 }
694 }
695
696 /* End of view crosses highest physical -- fails for user */
697 Mapping = NULL;
698 ViewSize = 2 * PAGE_SIZE;
700 Status = ZwMapViewOfSection(SectionHandle,
702 &Mapping,
703 0,
704 0,
706 &ViewSize,
707 ViewUnmap,
708 0,
711 if (NT_SUCCESS(Status))
712 ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
713
714 /* Repeat from user mode */
715 if (!skip(UserStruct != NULL, "No user memory\n"))
716 {
718 UserStruct->Mapping = NULL;
719 UserStruct->PhysicalAddress.QuadPart = PhysicalAddress.QuadPart;
720 UserStruct->ViewSize = 2 * PAGE_SIZE;
722
723 Status = NtMapViewOfSection(SectionHandle,
725 &UserStruct->Mapping,
726 0,
727 0,
728 &UserStruct->PhysicalAddress,
729 &UserStruct->ViewSize,
730 ViewUnmap,
731 0,
734 if (NT_SUCCESS(Status))
735 {
737 ZwUnmapViewOfSection(ZwCurrentProcess(), UserStruct->Mapping);
739 }
740 }
741
742 /* Free user memory and close section */
743 if (!skip(UserStruct != NULL, "No user memory\n"))
744 {
745 UserSize = 0;
746 Status = ZwFreeVirtualMemory(ZwCurrentProcess(),
747 &UserMem,
748 &UserSize,
751 }
752
753 Status = ObCloseHandle(SectionHandle, UserMode);
755 }
756
757 /* Try flag 0x80000000, which ROS calls SEC_PHYSICALMEMORY */
759 NULL,
761 NULL,
762 NULL);
763 Status = ZwCreateSection(&SectionHandle,
766 NULL,
768 0x80000000,
769 NULL);
771 if (NT_SUCCESS(Status))
772 ZwClose(SectionHandle);
773
774 /* Assertion failure: AllocationAttributes & SEC_IMAGE | SEC_RESERVE | SEC_COMMIT */
776 {
778 NULL,
780 NULL,
781 NULL);
785 NULL,
787 0x80000000,
788 NULL,
789 NULL);
791 if (NT_SUCCESS(Status))
793 }
794
796 NULL,
798 NULL,
799 NULL);
803 NULL,
805 SEC_RESERVE | 0x80000000,
806 NULL,
807 NULL);
809 if (NT_SUCCESS(Status))
811
812 ExFreePoolWithTag(ZeroPageContents, 'ZPmK');
813 ExFreePoolWithTag(MyPage, 'MPmK');
814}
815
816START_TEST(MmSection)
817{
819 HANDLE FileHandle1 = NULL, FileHandle2 = NULL;
820 PFILE_OBJECT FileObject1 = NULL, FileObject2 = NULL;
823 UNICODE_STRING FileName1 = RTL_CONSTANT_STRING(L"\\SystemRoot\\kmtest-MmSection.txt");
824 UNICODE_STRING FileName2 = RTL_CONSTANT_STRING(L"\\SystemRoot\\system32\\ntdll.dll");
826 UCHAR FileData = 0;
827
828 ok(ExGetPreviousMode() == UserMode, "Previous mode is kernel mode\n");
829 /* create a one-byte file that we can use */
834 ok(FileHandle1 != NULL, "FileHandle1 is NULL\n");
835 if (FileHandle1)
836 {
837 FileOffset.QuadPart = 0;
838 Status = ZwWriteFile(FileHandle1, NULL, NULL, NULL, &IoStatusBlock, &FileData, sizeof FileData, &FileOffset, NULL);
839 ok(Status == STATUS_SUCCESS || Status == STATUS_PENDING, "Status = 0x%08lx\n", Status);
840 Status = ZwWaitForSingleObject(FileHandle1, FALSE, NULL);
843 Status = ZwClose(FileHandle1);
845 FileHandle1 = NULL;
846 }
847
852 ok(FileHandle1 != NULL, "FileHandle1 is NULL\n");
853 CheckObject(FileHandle1, 2L, 1L);
854
859 ok(FileHandle2 != NULL, "FileHandle2 is NULL\n");
860
861 if (!skip(Status == STATUS_SUCCESS && FileHandle1 != NULL, "Failed to open file 1\n"))
862 {
865 ok(FileObject1 != NULL, "FileObject1 is NULL\n");
866 CheckObject(FileHandle1, 3L, 1L);
867 }
868
869 if (!skip(Status == STATUS_SUCCESS && FileHandle2 != NULL, "Failed to open file 2\n"))
870 {
873 ok(FileObject2 != NULL, "FileObject2 is NULL\n");
874 }
875
876 trace("FileHandle1=%p, FileObject1=%p\n", FileHandle1, FileObject1);
877 trace("FileHandle2=%p, FileObject2=%p\n", FileHandle2, FileObject2);
878 TestCreateSection(FileHandle1, FileObject1, FileHandle2, FileObject2);
879
880 if (FileObject2)
881 ObDereferenceObject(FileObject2);
882 if (FileObject1)
883 ObDereferenceObject(FileObject1);
884 if (FileHandle2)
885 ZwClose(FileHandle2);
886 if (FileHandle1)
887 ZwClose(FileHandle1);
888
890}
NTSTATUS NTAPI NtMapViewOfSection(IN HANDLE SectionHandle, IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG_PTR ZeroBits, IN SIZE_T CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect)
Definition: section.c:3622
static VOID TestCreateSection(IN HANDLE FileHandle1, IN PFILE_OBJECT FileObject1, IN HANDLE FileHandle2, IN PFILE_OBJECT FileObject2)
Definition: MmSection.c:88
#define TestMapView(SectionObject, ExpectAtBase, ExpectM)
Definition: MmSection.c:47
static VOID TestPhysicalMemorySection(VOID)
Definition: MmSection.c:401
#define CheckObject(Handle, Pointers, Handles)
Definition: MmSection.c:10
#define CheckSection(SectionObject, SectionFlag)
Definition: MmSection.c:20
static const WCHAR FileName2[]
#define ok_eq_pointer(value, expected)
Definition: apitest.h:59
#define ok_eq_hex(value, expected)
Definition: apitest.h:77
#define ok_eq_ulong(value, expected)
Definition: apitest.h:63
#define ok_eq_longlong(value, expected)
Definition: apitest.h:64
#define ok_eq_size(value, expected)
Definition: apitest.h:69
#define ok_eq_ulongptr(value, expected)
Definition: apitest.h:71
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
#define FILE_DELETE_ON_CLOSE
Definition: constants.h:494
static FILEDATA FileData[MAX_FDS]
Definition: fs.c:51
_In_ PFCB _In_ LONGLONG FileOffset
Definition: cdprocs.h:160
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define PAGE_READONLY
Definition: compat.h:138
#define GENERIC_READ
Definition: compat.h:135
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
#define ExGetPreviousMode
Definition: ex.h:140
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
@ SystemBasicInformation
Definition: ntddk_ex.h:11
#define FILE_OPEN
Definition: from_kernel.h:54
#define FILE_SUPERSEDE
Definition: from_kernel.h:53
_Must_inspect_result_ _Outptr_ PVOID * SectionObject
Definition: fsrtlfuncs.h:860
Status
Definition: gdiplustypes.h:25
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:599
POBJECT_TYPE IoFileObjectType
Definition: iomgr.c:36
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
Definition: iosup.c:193
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
Definition: iosup.c:47
#define KmtStartSeh()
Definition: kmt_test.h:282
#define KmtInvalidPointer
Definition: kmt_test.h:280
#define KmtEndSeh(ExpectedStatus)
Definition: kmt_test.h:288
BOOLEAN KmtIsCheckedBuild
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define KernelMode
Definition: asm.h:34
#define UserMode
Definition: asm.h:35
NTSYSAPI NTSTATUS NTAPI ZwOpenSection(_Out_ PHANDLE SectionHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_opt_ PLARGE_INTEGER MaximumSize
Definition: mmfuncs.h:362
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
Definition: mmfuncs.h:408
#define SEC_IMAGE
Definition: mmtypes.h:97
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define SYNCHRONIZE
Definition: nt_native.h:61
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_READ_DATA
Definition: nt_native.h:628
#define PAGE_NOCACHE
Definition: nt_native.h:1311
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define SECTION_ALL_ACCESS
Definition: nt_native.h:1293
#define SEC_RESERVE
Definition: nt_native.h:1323
#define FILE_CREATED
Definition: nt_native.h:770
#define NtCurrentProcess()
Definition: nt_native.h:1657
@ ViewUnmap
Definition: nt_native.h:1279
#define GENERIC_ALL
Definition: nt_native.h:92
#define FILE_OPENED
Definition: nt_native.h:769
#define MEM_RELEASE
Definition: nt_native.h:1316
#define GENERIC_WRITE
Definition: nt_native.h:90
#define MEM_COMMIT
Definition: nt_native.h:1313
#define PAGE_NOACCESS
Definition: nt_native.h:1302
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
Definition: stubs.c:685
#define STATUS_INVALID_PARAMETER_4
Definition: ntstatus.h:478
#define STATUS_INVALID_IMAGE_NOT_MZ
Definition: ntstatus.h:539
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_INVALID_FILE_FOR_SECTION
Definition: ntstatus.h:269
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define STATUS_INVALID_PARAMETER_6
Definition: ntstatus.h:480
#define STATUS_INVALID_PAGE_PROTECTION
Definition: ntstatus.h:305
#define L(x)
Definition: ntvdm.h:50
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
NTSTATUS NTAPI MmCreateSection(OUT PVOID *Section, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize, IN ULONG SectionPageProtection, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL, IN PFILE_OBJECT FileObject OPTIONAL)
Definition: section.c:4620
#define STATUS_SUCCESS
Definition: shellext.h:65
#define LL
Definition: tui.h:167
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
LONGLONG QuadPart
Definition: typedefs.h:114
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1098
* PFILE_OBJECT
Definition: iotypes.h:1998
@ MmCached
Definition: mmtypes.h:130
#define ObDereferenceObject
Definition: obfuncs.h:203
unsigned char UCHAR
Definition: xmlstorage.h:181
#define ZwCurrentProcess()