https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3e43aa1305fa2865c3e61…
commit 3e43aa1305fa2865c3e61647e5c51857c9a1c9fd
Author: Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Wed Jan 27 16:20:08 2021 +0100
Commit: Jérôme Gardou <jerome.gardou(a)reactos.org>
CommitDate: Wed Feb 3 09:41:23 2021 +0100
[NTOS:MM] Use 64-bit integer to count references on segments
---
ntoskrnl/include/internal/mm.h | 8 +++++---
ntoskrnl/mm/rmap.c | 2 +-
ntoskrnl/mm/section.c | 25 +++----------------------
3 files changed, 9 insertions(+), 26 deletions(-)
diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h
index dad1a08bf33..86ed4dfb23a 100644
--- a/ntoskrnl/include/internal/mm.h
+++ b/ntoskrnl/include/internal/mm.h
@@ -168,7 +168,7 @@ typedef struct _MM_SECTION_SEGMENT
FAST_MUTEX Lock; /* lock which protects the page directory */
LARGE_INTEGER RawLength; /* length of the segment which is part of the mapped file
*/
LARGE_INTEGER Length; /* absolute length of the segment */
- PULONG ReferenceCount;
+ PLONG64 ReferenceCount;
ULONG SectionCount;
ULONG Protection;
PULONG Flags;
@@ -182,9 +182,11 @@ typedef struct _MM_SECTION_SEGMENT
ULONG Characteristics;
} Image;
- ULONG RefCount;
+ LONG64 RefCount;
ULONG SegFlags;
+ ULONGLONG LastPage;
+
RTL_GENERIC_TABLE PageTable;
} MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
@@ -192,7 +194,7 @@ typedef struct _MM_IMAGE_SECTION_OBJECT
{
PFILE_OBJECT FileObject;
- ULONG RefCount;
+ LONG64 RefCount;
ULONG SegFlags;
SECTION_IMAGE_INFORMATION ImageInformation;
diff --git a/ntoskrnl/mm/rmap.c b/ntoskrnl/mm/rmap.c
index f50e680e401..5b7ffe3a3da 100644
--- a/ntoskrnl/mm/rmap.c
+++ b/ntoskrnl/mm/rmap.c
@@ -525,7 +525,7 @@ MmGetSegmentRmap(PFN_NUMBER Page, PULONG RawOffset)
return NULL;
}
- InterlockedIncrementUL(Result->Segment->ReferenceCount);
+ InterlockedIncrement64(Result->Segment->ReferenceCount);
MiReleasePfnLock(OldIrql);
return Result;
}
diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c
index a223ba0e302..524b282f606 100644
--- a/ntoskrnl/mm/section.c
+++ b/ntoskrnl/mm/section.c
@@ -107,7 +107,7 @@ MiGrabDataSection(PSECTION_OBJECT_POINTERS SectionObjectPointer)
}
ASSERT(Segment->SegFlags & MM_DATAFILE_SEGMENT);
- InterlockedIncrementUL(&Segment->RefCount);
+ InterlockedIncrement64(&Segment->RefCount);
break;
}
@@ -996,7 +996,7 @@ MmDereferenceSegment(PMM_SECTION_SEGMENT Segment)
/* Lock the PFN lock because we mess around with SectionObjectPointers */
OldIrql = MiAcquirePfnLock();
- if (InterlockedDecrementUL(Segment->ReferenceCount) > 0)
+ if (InterlockedDecrement64(Segment->ReferenceCount) > 0)
{
/* Nothing to do yet */
MiReleasePfnLock(OldIrql);
@@ -2049,25 +2049,6 @@ MmpDeleteSection(PVOID ObjectBody)
ASSERT(ImageSectionObject->RefCount > 0);
MmDereferenceSegment(ImageSectionObject->Segments);
}
-#ifdef NEWCC
- else if (Section->Segment && Section->Segment->Flags &
MM_DATAFILE_SEGMENT)
- {
- ULONG RefCount = 0;
- PMM_SECTION_SEGMENT Segment = Section->Segment;
-
- if (Segment &&
- (RefCount = InterlockedDecrementUL(&Segment->ReferenceCount)) ==
0)
- {
- DPRINT("Freeing section segment\n");
- Section->Segment = NULL;
- MmFinalizeSegment(Segment);
- }
- else
- {
- DPRINT("RefCount %d\n", RefCount);
- }
- }
-#endif
else
{
PMM_SECTION_SEGMENT Segment = (PMM_SECTION_SEGMENT)Section->Segment;
@@ -3339,7 +3320,7 @@ MmMapViewOfSegment(
return(Status);
}
- InterlockedIncrementUL(Segment->ReferenceCount);
+ InterlockedIncrement64(Segment->ReferenceCount);
MArea->SectionData.Segment = Segment;
MArea->SectionData.ViewOffset.QuadPart = ViewOffset;