10#define CheckObject(Handle, Pointers, Handles) do \
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); \
30 "No section object\n"))
37 ok(SectionHandle !=
NULL,
"Line %lu: Section handle null\n",
Line);
39 "No section handle\n"))
42 &Sbi,
sizeof Sbi,
NULL);
50#define CheckSection(SectionObject, SectionFlag) CheckSection_(__LINE__, SectionObject, SectionFlag)
52#define TestMapView(SectionObject, ExpectAtBase, ExpectM) do \
55 PVOID BaseAddress = NULL; \
56 SIZE_T ViewSize = 0; \
57 LARGE_INTEGER SectionOffset; \
58 if (skip(SectionObject != NULL && \
59 SectionObject != (PVOID)0x5555555555555555ULL, \
60 "No section object\n")) \
63 SectionOffset.QuadPart = 0; \
64 Status = MmMapViewOfSection(SectionObject, PsGetCurrentProcess(), \
65 &BaseAddress, 0, 1, &SectionOffset, \
66 &ViewSize, ViewUnmap, 0, PAGE_READONLY); \
67 ok_eq_hex(Status, ExpectAtBase ? STATUS_SUCCESS : STATUS_IMAGE_NOT_AT_BASE);\
68 if (!skip(NT_SUCCESS(Status), "Section not mapped\n")) \
70 ok((LONG_PTR)BaseAddress > 0, "BaseAddress = %p\n", BaseAddress); \
71 ok_eq_uint(*(PUCHAR)BaseAddress, ExpectM ? 'M' : 0); \
72 Status = MmUnmapViewOfSection(PsGetCurrentProcess(), BaseAddress); \
73 ok_eq_hex(Status, STATUS_SUCCESS); \
77 Status = MmMapViewOfSection(SectionObject, PsGetCurrentProcess(), \
78 &BaseAddress, 0, 1, &SectionOffset, \
79 &ViewSize, ViewUnmap, 0, \
80 PAGE_READONLY | PAGE_NOCACHE); \
81 ok_eq_hex(Status, ExpectAtBase ? STATUS_SUCCESS : STATUS_IMAGE_NOT_AT_BASE);\
82 if (!skip(NT_SUCCESS(Status), "Section not mapped\n")) \
84 ok((LONG_PTR)BaseAddress > 0, "BaseAddress = %p\n", BaseAddress); \
85 ok_eq_uint(*(PUCHAR)BaseAddress, ExpectM ? 'M' : 0); \
86 Status = MmUnmapViewOfSection(PsGetCurrentProcess(), BaseAddress); \
87 ok_eq_hex(Status, STATUS_SUCCESS); \
102 ULONG PointerCount1, PointerCount2;
212 FileHandle2 !=
NULL && FileObject2 !=
NULL,
"No file handle or object\n"))
443 if (
skip(MyPage !=
NULL,
"Out of memory\n"))
452 if (
skip(ZeroPageContents !=
NULL,
"Out of memory\n"))
482 Status = ZwMapViewOfSection(SectionHandle,
507 Status = ZwMapViewOfSection(SectionHandle,
532 Status = ZwMapViewOfSection(SectionHandle,
552 ok(MappingBytes[5] == 0x23,
"Mapping[5] = 0x%x\n", MappingBytes[5]);
553 ok(MyPage[5] == 0x23,
"MyPage[5] = 0x%x\n", MyPage[5]);
556 ok(MappingBytes[5] == 0x44,
"Mapping[5] = 0x%x\n", MappingBytes[5]);
557 ok(MyPage[5] == 0x44,
"MyPage[5] = 0x%x\n", MyPage[5]);
559 MappingBytes[5] = 0x88;
560 ok(MappingBytes[5] == 0x88,
"Mapping[5] = 0x%x\n", MappingBytes[5]);
561 ok(MyPage[5] == 0x88,
"MyPage[5] = 0x%x\n", MyPage[5]);
571 Status = ZwMapViewOfSection(SectionHandle,
610 UserStruct = UserMem;
624 Status = ZwMapViewOfSection(SectionHandle,
639 if (!
skip(UserStruct !=
NULL,
"No user memory\n"))
642 UserStruct->Mapping =
NULL;
649 &UserStruct->Mapping,
652 &UserStruct->PhysicalAddress,
653 &UserStruct->ViewSize,
670 Status = ZwMapViewOfSection(SectionHandle,
685 if (!
skip(UserStruct !=
NULL,
"No user memory\n"))
688 UserStruct->Mapping =
NULL;
695 &UserStruct->Mapping,
698 &UserStruct->PhysicalAddress,
699 &UserStruct->ViewSize,
716 Status = ZwMapViewOfSection(SectionHandle,
731 if (!
skip(UserStruct !=
NULL,
"No user memory\n"))
734 UserStruct->Mapping =
NULL;
741 &UserStruct->Mapping,
744 &UserStruct->PhysicalAddress,
745 &UserStruct->ViewSize,
759 if (!
skip(UserStruct !=
NULL,
"No user memory\n"))
779 Status = ZwCreateSection(&SectionHandle,
847 Status = ZwCreateFile(&FileHandle1,
GENERIC_WRITE |
SYNCHRONIZE, &
ObjectAttributes, &
IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_SUPERSEDE,
FILE_NON_DIRECTORY_FILE,
NULL, 0);
850 ok(FileHandle1 !=
NULL,
"FileHandle1 is NULL\n");
865 Status = ZwCreateFile(&FileHandle1,
GENERIC_ALL, &
ObjectAttributes, &
IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE |
FILE_DELETE_ON_CLOSE,
NULL, 0);
868 ok(FileHandle1 !=
NULL,
"FileHandle1 is NULL\n");
872 Status = ZwCreateFile(&FileHandle2,
GENERIC_READ, &
ObjectAttributes, &
IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE,
NULL, 0);
875 ok(FileHandle2 !=
NULL,
"FileHandle2 is NULL\n");
881 ok(FileObject1 !=
NULL,
"FileObject1 is NULL\n");
889 ok(FileObject2 !=
NULL,
"FileObject2 is NULL\n");
892 trace(
"FileHandle1=%p, FileObject1=%p\n", FileHandle1, FileObject1);
893 trace(
"FileHandle2=%p, FileObject2=%p\n", FileHandle2, FileObject2);
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)
static VOID TestCreateSection(IN HANDLE FileHandle1, IN PFILE_OBJECT FileObject1, IN HANDLE FileHandle2, IN PFILE_OBJECT FileObject2)
#define TestMapView(SectionObject, ExpectAtBase, ExpectM)
static VOID TestPhysicalMemorySection(VOID)
#define CheckObject(Handle, Pointers, Handles)
#define CheckSection(SectionObject, SectionFlag)
static void CheckSection_(ULONG Line, PVOID SectionObject, ULONG SectionFlag)
static const WCHAR FileName2[]
#define ok_eq_pointer(value, expected)
#define ok_eq_hex(value, expected)
#define ok_eq_ulong(value, expected)
#define ok_eq_longlong(value, expected)
#define ok_eq_size(value, expected)
#define ok_eq_ulongptr(value, expected)
#define FILE_NON_DIRECTORY_FILE
#define FILE_DELETE_ON_CLOSE
static FILEDATA FileData[MAX_FDS]
_In_ PFCB _In_ LONGLONG FileOffset
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
#define FILE_ATTRIBUTE_NORMAL
static PVOID Mapping[EMS_PHYSICAL_PAGES]
#define ExAllocatePoolWithTag(hernya, size, tag)
#define RtlCompareMemory(s1, s2, l)
#define ExGetPreviousMode
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
_Must_inspect_result_ _Outptr_ PVOID * SectionObject
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define RtlFillMemory(Dest, Length, Fill)
POBJECT_TYPE IoFileObjectType
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
#define KmtInvalidPointer
#define KmtEndSeh(ExpectedStatus)
BOOLEAN KmtIsCheckedBuild
#define ExFreePoolWithTag(_P, _T)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwOpenSection(_Out_ PHANDLE SectionHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
NTSYSAPI NTSTATUS NTAPI ZwQuerySection(_In_ HANDLE SectionHandle, _In_ SECTION_INFORMATION_CLASS SectionInformationClass, _Out_ PVOID SectionInformation, _In_ SIZE_T Length, _Out_opt_ PSIZE_T ResultLength)
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_opt_ PLARGE_INTEGER MaximumSize
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
@ SectionBasicInformation
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define SECTION_ALL_ACCESS
#define NtCurrentProcess()
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
#define STATUS_INVALID_PARAMETER_4
#define STATUS_INVALID_IMAGE_NOT_MZ
#define STATUS_INVALID_FILE_FOR_SECTION
#define STATUS_ACCESS_VIOLATION
#define STATUS_INVALID_PARAMETER_6
#define STATUS_INVALID_PAGE_PROTECTION
#define STATUS_SECTION_TOO_BIG
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
NTSTATUS NTAPI ObOpenObjectByPointer(IN PVOID Object, IN ULONG HandleAttributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PHANDLE Handle)
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)
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)
POBJECT_TYPE MmSectionObjectType
#define RTL_CONSTANT_STRING(s)
#define RtlCopyMemory(Destination, Source, Length)
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
#define ObDereferenceObject
#define ZwCurrentProcess()