/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
+#ifdef NEWCC
+#include "../cache/section/newmm.h"
+#endif
#define NDEBUG
#include <debug.h>
/* TYPES ********************************************************************/
-typedef struct _MM_RMAP_ENTRY
-{
- struct _MM_RMAP_ENTRY* Next;
- PEPROCESS Process;
- PVOID Address;
-#if DBG
- PVOID Caller;
-#endif
-}
-MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
-
/* GLOBALS ******************************************************************/
-static FAST_MUTEX RmapListLock;
static NPAGED_LOOKASIDE_LIST RmapLookasideList;
+FAST_MUTEX RmapListLock;
/* FUNCTIONS ****************************************************************/
Process = entry->Process;
Address = entry->Address;
+
if ((((ULONG_PTR)Address) & 0xFFF) != 0)
{
KeBugCheck(MEMORY_MANAGEMENT);
}
while (current_entry != NULL)
{
- MmSetCleanPage(current_entry->Process, current_entry->Address);
- current_entry = current_entry->Next;
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(current_entry->Address))
+#endif
+ MmSetCleanPage(current_entry->Process, current_entry->Address);
+ current_entry = current_entry->Next;
}
ExReleaseFastMutex(&RmapListLock);
}
}
while (current_entry != NULL)
{
- MmSetDirtyPage(current_entry->Process, current_entry->Address);
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(current_entry->Address))
+#endif
+ MmSetDirtyPage(current_entry->Process, current_entry->Address);
current_entry = current_entry->Next;
}
ExReleaseFastMutex(&RmapListLock);
}
while (current_entry != NULL)
{
- if (MmIsDirtyPage(current_entry->Process, current_entry->Address))
+ if (
+#ifdef NEWCC
+ !RMAP_IS_SEGMENT(current_entry->Address) &&
+#endif
+ MmIsDirtyPage(current_entry->Process, current_entry->Address))
{
ExReleaseFastMutex(&RmapListLock);
return(TRUE);
PMM_RMAP_ENTRY current_entry;
PMM_RMAP_ENTRY new_entry;
ULONG PrevSize;
-
- Address = (PVOID)PAGE_ROUND_DOWN(Address);
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(Address))
+#endif
+ Address = (PVOID)PAGE_ROUND_DOWN(Address);
new_entry = ExAllocateFromNPagedLookasideList(&RmapLookasideList);
if (new_entry == NULL)
#endif
#endif
- if (MmGetPfnForProcess(Process, Address) != Page)
+ if (
+#ifdef NEWCC
+ !RMAP_IS_SEGMENT(Address) &&
+#endif
+ MmGetPfnForProcess(Process, Address) != Page)
{
DPRINT1("Insert rmap (%d, 0x%.8X) 0x%.8X which doesn't match physical "
"address 0x%.8X\n", Process->UniqueProcessId, Address,
#endif
MmSetRmapListHeadPage(Page, new_entry);
ExReleaseFastMutex(&RmapListLock);
- if (Process == NULL)
- {
- Process = PsInitialSystemProcess;
- }
- if (Process)
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(Address))
+#endif
{
- PrevSize = InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, PAGE_SIZE);
- if (PrevSize >= Process->Vm.PeakWorkingSetSize)
- {
- Process->Vm.PeakWorkingSetSize = PrevSize + PAGE_SIZE;
- }
+ if (Process == NULL)
+ {
+ Process = PsInitialSystemProcess;
+ }
+ if (Process)
+ {
+ PrevSize = InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, PAGE_SIZE);
+ if (PrevSize >= Process->Vm.PeakWorkingSetSize)
+ {
+ Process->Vm.PeakWorkingSetSize = PrevSize + PAGE_SIZE;
+ }
+ }
}
}
{
previous_entry = current_entry;
current_entry = current_entry->Next;
- if (DeleteMapping)
- {
- DeleteMapping(Context, previous_entry->Process,
- previous_entry->Address);
- }
- Process = previous_entry->Process;
- ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
- if (Process == NULL)
- {
- Process = PsInitialSystemProcess;
- }
- if (Process)
- {
- (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
- }
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(current_entry->Address))
+#endif
+ {
+ if (DeleteMapping)
+ {
+ DeleteMapping(Context, previous_entry->Process,
+ previous_entry->Address);
+ }
+ Process = previous_entry->Process;
+ ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
+ if (Process == NULL)
+ {
+ Process = PsInitialSystemProcess;
+ }
+ if (Process)
+ {
+ (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+ }
+ }
+#ifdef NEWCC
+ else
+ {
+ ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
+ }
+#endif
}
}
}
ExReleaseFastMutex(&RmapListLock);
ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry);
- if (Process == NULL)
+#ifdef NEWCC
+ if (!RMAP_IS_SEGMENT(Address))
+#endif
+ {
+ if (Process == NULL)
+ {
+ Process = PsInitialSystemProcess;
+ }
+ if (Process)
+ {
+ (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+ }
+ }
+ return;
+ }
+ previous_entry = current_entry;
+ current_entry = current_entry->Next;
+ }
+ KeBugCheck(MEMORY_MANAGEMENT);
+}
+
+#ifdef NEWCC
+PVOID
+NTAPI
+MmGetSegmentRmap(PFN_NUMBER Page, PULONG RawOffset)
+{
+ PCACHE_SECTION_PAGE_TABLE Result = NULL;
+ PMM_RMAP_ENTRY current_entry, previous_entry;
+
+ ExAcquireFastMutex(&RmapListLock);
+ previous_entry = NULL;
+ current_entry = MmGetRmapListHeadPage(Page);
+ while (current_entry != NULL)
+ {
+ if (RMAP_IS_SEGMENT(current_entry->Address))
+ {
+ Result = (PCACHE_SECTION_PAGE_TABLE)current_entry->Process;
+ *RawOffset = (ULONG_PTR)current_entry->Address & ~RMAP_SEGMENT_MASK;
+ InterlockedIncrementUL(&Result->Segment->ReferenceCount);
+ ExReleaseFastMutex(&RmapListLock);
+ return Result;
+ }
+ previous_entry = current_entry;
+ current_entry = current_entry->Next;
+ }
+ ExReleaseFastMutex(&RmapListLock);
+ return NULL;
+}
+
+VOID
+NTAPI
+MmDeleteSectionAssociation(PFN_NUMBER Page)
+{
+ PMM_RMAP_ENTRY current_entry, previous_entry;
+
+ ExAcquireFastMutex(&RmapListLock);
+ previous_entry = NULL;
+ current_entry = MmGetRmapListHeadPage(Page);
+ while (current_entry != NULL)
+ {
+ if (RMAP_IS_SEGMENT(current_entry->Address))
+ {
+ if (previous_entry == NULL)
{
- Process = PsInitialSystemProcess;
+ MmSetRmapListHeadPage(Page, current_entry->Next);
}
- if (Process)
+ else
{
- (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+ previous_entry->Next = current_entry->Next;
}
+ ExReleaseFastMutex(&RmapListLock);
+ ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry);
return;
}
previous_entry = current_entry;
current_entry = current_entry->Next;
}
- KeBugCheck(MEMORY_MANAGEMENT);
+ ExReleaseFastMutex(&RmapListLock);
}
+#endif