https://git.reactos.org/?p=reactos.git;a=commitdiff;h=25722e647e0f105d77ee2…
commit 25722e647e0f105d77ee28fa6d12999afe21cab8
Author: Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Fri Oct 23 14:42:21 2020 +0200
Commit: Jérôme Gardou <jerome.gardou(a)reactos.org>
CommitDate: Wed Feb 3 09:41:21 2021 +0100
[NTOSKRNL] Embed a SECTION struct inside MM_ROS_SECTION_OBJECT
---
ntoskrnl/include/internal/mm.h | 17 +++-------------
ntoskrnl/mm/ARM3/miarm.h | 3 +--
ntoskrnl/mm/section.c | 45 +++++++++++++++++++++++++-----------------
3 files changed, 31 insertions(+), 34 deletions(-)
diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h
index 5700ad8ff65..c118866d5b5 100644
--- a/ntoskrnl/include/internal/mm.h
+++ b/ntoskrnl/include/internal/mm.h
@@ -196,21 +196,10 @@ typedef struct _MM_IMAGE_SECTION_OBJECT
typedef struct _ROS_SECTION_OBJECT
{
- CSHORT Type;
- CSHORT Size;
- LARGE_INTEGER SizeOfSection;
- ULONG InitialPageProtection;
- union
- {
- ULONG LongFlags;
- MMSECTION_FLAGS Flags;
- } u;
+ SECTION;
PFILE_OBJECT FileObject;
- union
- {
- PMM_IMAGE_SECTION_OBJECT ImageSection;
- PMM_SECTION_SEGMENT Segment;
- };
+
+ PMM_IMAGE_SECTION_OBJECT ImageSection;
} ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
#define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->VadNode.StartingVpn
<< PAGE_SHIFT)
diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h
index b374e94ad75..ade2696cf1d 100644
--- a/ntoskrnl/mm/ARM3/miarm.h
+++ b/ntoskrnl/mm/ARM3/miarm.h
@@ -1072,8 +1072,7 @@ BOOLEAN
MiIsRosSectionObject(IN PVOID Section)
{
PROS_SECTION_OBJECT RosSection = Section;
- if ((RosSection->Type == 'SC') && (RosSection->Size ==
'TN')) return TRUE;
- return FALSE;
+ return RosSection->u.Flags.filler;
}
#define MI_IS_ROS_PFN(x) ((x)->u4.AweAllocation == TRUE)
diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c
index 9920f36ddcf..fbf44868d90 100644
--- a/ntoskrnl/mm/section.c
+++ b/ntoskrnl/mm/section.c
@@ -2684,7 +2684,7 @@ MmpDeleteSection(PVOID ObjectBody)
if (Section->Segment == NULL)
return;
- (void)InterlockedDecrementUL(&Section->Segment->ReferenceCount);
+
(void)InterlockedDecrementUL(&((PMM_SECTION_SEGMENT)Section->Segment)->ReferenceCount);
}
if (Section->FileObject != NULL)
{
@@ -2750,8 +2750,9 @@ MmCreatePhysicalMemorySection(VOID)
* Initialize it
*/
RtlZeroMemory(PhysSection, sizeof(ROS_SECTION_OBJECT));
- PhysSection->Type = 'SC';
- PhysSection->Size = 'TN';
+
+ /* Mark this as a "ROS Section" */
+ PhysSection->u.Flags.filler = 1;
PhysSection->InitialPageProtection = PAGE_EXECUTE_READWRITE;
PhysSection->u.Flags.PhysicalMemory = 1;
PhysSection->SizeOfSection = SectionSize;
@@ -2763,7 +2764,7 @@ MmCreatePhysicalMemorySection(VOID)
return(STATUS_NO_MEMORY);
}
RtlZeroMemory(Segment, sizeof(MM_SECTION_SEGMENT));
- PhysSection->Segment = Segment;
+ PhysSection->Segment = (PSEGMENT)Segment;
Segment->ReferenceCount = 1;
ExInitializeFastMutex(&Segment->Lock);
Segment->Image.FileOffset = 0;
@@ -2865,8 +2866,9 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
* Initialize it
*/
RtlZeroMemory(Section, sizeof(ROS_SECTION_OBJECT));
- Section->Type = 'SC';
- Section->Size = 'TN';
+
+ /* Mark this as a "ROS" section */
+ Section->u.Flags.filler = 1;
Section->InitialPageProtection = SectionPageProtection;
Section->u.Flags.File = 1;
if (AllocationAttributes & SEC_NO_CHANGE)
@@ -2958,7 +2960,7 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
ObDereferenceObject(FileObject);
return(STATUS_NO_MEMORY);
}
- Section->Segment = Segment;
+ Section->Segment = (PSEGMENT)Segment;
Segment->ReferenceCount = 1;
ExInitializeFastMutex(&Segment->Lock);
/*
@@ -2994,7 +2996,7 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
Segment =
(PMM_SECTION_SEGMENT)FileObject->SectionObjectPointer->
DataSectionObject;
- Section->Segment = Segment;
+ Section->Segment = (PSEGMENT)Segment;
(void)InterlockedIncrementUL(&Segment->ReferenceCount);
MmLockSectionSegment(Segment);
@@ -3692,8 +3694,10 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject,
* Initialize it
*/
RtlZeroMemory(Section, sizeof(ROS_SECTION_OBJECT));
- Section->Type = 'SC';
- Section->Size = 'TN';
+
+ /* Mark this as a "ROS" Section */
+ Section->u.Flags.filler = 1;
+
Section->InitialPageProtection = SectionPageProtection;
Section->u.Flags.File = 1;
Section->u.Flags.Image = 1;
@@ -4256,8 +4260,8 @@ NtQuerySection(
}
else
{
- Sbi->BaseAddress =
(PVOID)RosSection->Segment->Image.VirtualAddress;
- Sbi->Size.QuadPart =
RosSection->Segment->Length.QuadPart;
+ Sbi->BaseAddress =
(PVOID)((PMM_SECTION_SEGMENT)RosSection->Segment)->Image.VirtualAddress;
+ Sbi->Size.QuadPart =
((PMM_SECTION_SEGMENT)RosSection->Segment)->Length.QuadPart;
}
if (ResultLength != NULL)
@@ -4557,6 +4561,8 @@ MmMapViewOfSection(IN PVOID SectionObject,
}
else
{
+ PMM_SECTION_SEGMENT Segment = (PMM_SECTION_SEGMENT)Section->Segment;
+
/* check for write access */
if ((Protect & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)) &&
!(Section->InitialPageProtection &
(PAGE_READWRITE|PAGE_EXECUTE_READWRITE)))
@@ -4605,16 +4611,16 @@ MmMapViewOfSection(IN PVOID SectionObject,
*ViewSize = PAGE_ROUND_UP(*ViewSize);
- MmLockSectionSegment(Section->Segment);
+ MmLockSectionSegment(Segment);
Status = MmMapViewOfSegment(AddressSpace,
Section,
- Section->Segment,
+ Segment,
BaseAddress,
*ViewSize,
Protect,
ViewOffset,
AllocationType & (MEM_TOP_DOWN|SEC_NO_CHANGE));
- MmUnlockSectionSegment(Section->Segment);
+ MmUnlockSectionSegment(Segment);
if (!NT_SUCCESS(Status))
{
MmUnlockAddressSpace(AddressSpace);
@@ -4765,6 +4771,7 @@ MmMapViewInSystemSpace (IN PVOID SectionObject,
IN OUT PSIZE_T ViewSize)
{
PROS_SECTION_OBJECT Section;
+ PMM_SECTION_SEGMENT Segment;
PMMSUPPORT AddressSpace;
NTSTATUS Status;
PAGED_CODE();
@@ -4780,6 +4787,8 @@ MmMapViewInSystemSpace (IN PVOID SectionObject,
DPRINT("MmMapViewInSystemSpace() called\n");
Section = (PROS_SECTION_OBJECT)SectionObject;
+ Segment = (PMM_SECTION_SEGMENT)Section->Segment;
+
AddressSpace = MmGetKernelAddressSpace();
MmLockAddressSpace(AddressSpace);
@@ -4794,19 +4803,19 @@ MmMapViewInSystemSpace (IN PVOID SectionObject,
(*ViewSize) = Section->SizeOfSection.u.LowPart;
}
- MmLockSectionSegment(Section->Segment);
+ MmLockSectionSegment(Segment);
Status = MmMapViewOfSegment(AddressSpace,
Section,
- Section->Segment,
+ Segment,
MappedBase,
*ViewSize,
PAGE_READWRITE,
0,
0);
- MmUnlockSectionSegment(Section->Segment);
+ MmUnlockSectionSegment(Segment);
MmUnlockAddressSpace(AddressSpace);
return Status;