diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index 6782fc1ab39..2548fc66ef9 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -269,6 +269,9 @@ typedef struct _MEMORY_AREA } SectionData; } MEMORY_AREA, *PMEMORY_AREA; +#define MI_SET_MEMORY_AREA_VAD(Vad) do { (Vad)->u.VadFlags.Spare |= 1; } while (0) +#define MI_IS_MEMORY_AREA_VAD(Vad) (((Vad)->u.VadFlags.Spare & 1) != 0) + typedef struct _MM_RMAP_ENTRY { struct _MM_RMAP_ENTRY* Next; diff --git a/ntoskrnl/mm/ARM3/procsup.c b/ntoskrnl/mm/ARM3/procsup.c index 6c11bb4cf7d..397b3b71862 100644 --- a/ntoskrnl/mm/ARM3/procsup.c +++ b/ntoskrnl/mm/ARM3/procsup.c @@ -1293,7 +1293,7 @@ MmCleanProcessAddressSpace(IN PEPROCESS Process) Vad = (PMMVAD)VadTree->BalancedRoot.RightChild; /* Check for old-style memory areas */ - if (Vad->u.VadFlags.Spare == 1) + if (MI_IS_MEMORY_AREA_VAD(Vad)) { /* Let RosMm handle this */ MiRosCleanupMemoryArea(Process, Vad); diff --git a/ntoskrnl/mm/ARM3/section.c b/ntoskrnl/mm/ARM3/section.c index 8be6b0aab3e..73f95adb750 100644 --- a/ntoskrnl/mm/ARM3/section.c +++ b/ntoskrnl/mm/ARM3/section.c @@ -778,6 +778,7 @@ MiRemoveMappedView(IN PEPROCESS CurrentProcess, ASSERT(Vad->u2.VadFlags2.ExtendableFile == FALSE); ASSERT(ControlArea); ASSERT(ControlArea->FilePointer == NULL); + ASSERT(!MI_IS_MEMORY_AREA_VAD(Vad)); /* Delete the actual virtual memory pages */ MiDeleteVirtualAddresses(Vad->StartingVpn << PAGE_SHIFT, @@ -1564,7 +1565,7 @@ MiGetFileObjectForVad( PFILE_OBJECT FileObject; /* Check if this is a RosMm memory area */ - if (Vad->u.VadFlags.Spare != 0) + if (MI_IS_MEMORY_AREA_VAD(Vad)) { PMEMORY_AREA MemoryArea = (PMEMORY_AREA)Vad; diff --git a/ntoskrnl/mm/ARM3/vadnode.c b/ntoskrnl/mm/ARM3/vadnode.c index 53b8fa83dbd..a4820dac5c8 100644 --- a/ntoskrnl/mm/ARM3/vadnode.c +++ b/ntoskrnl/mm/ARM3/vadnode.c @@ -213,7 +213,7 @@ MiInsertNode(IN PMM_AVL_TABLE Table, /* Now insert an ARM3 MEMORY_AREA for this node, unless the insert was already from the MEMORY_AREA code */ Vad = (PMMVAD_LONG)NewNode; - if (Vad->u.VadFlags.Spare == 0) + if (!MI_IS_MEMORY_AREA_VAD(Vad)) { NTSTATUS Status; PMEMORY_AREA MemoryArea; @@ -460,7 +460,7 @@ MiRemoveNode(IN PMMADDRESS_NODE Node, /* Free the node from ReactOS view as well */ Vad = (PMMVAD_LONG)Node; - if ((Table != &MmSectionBasedRoot) && (Vad->u.VadFlags.Spare == 0)) + if ((Table != &MmSectionBasedRoot) && !MI_IS_MEMORY_AREA_VAD(Vad)) { PMEMORY_AREA MemoryArea; PEPROCESS Process; diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c index 3b7f0f722f0..cb38b4a1502 100644 --- a/ntoskrnl/mm/ARM3/virtual.c +++ b/ntoskrnl/mm/ARM3/virtual.c @@ -546,7 +546,7 @@ MiDeleteVirtualAddresses(IN ULONG_PTR Va, PSUBSECTION Subsection; /* Get out if this is a fake VAD, RosMm will free the marea pages */ - if ((Vad) && (Vad->u.VadFlags.Spare == 1)) return; + if ((Vad) && MI_IS_MEMORY_AREA_VAD(Vad)) return; /* Get the current process */ CurrentProcess = PsGetCurrentProcess(); diff --git a/ntoskrnl/mm/marea.c b/ntoskrnl/mm/marea.c index 22c2369448c..c1c11490c23 100644 --- a/ntoskrnl/mm/marea.c +++ b/ntoskrnl/mm/marea.c @@ -92,7 +92,7 @@ MmLocateMemoryAreaByRegion( } Vad = (PMMVAD_LONG)Node; - if (Vad->u.VadFlags.Spare == 0) + if (!MI_IS_MEMORY_AREA_VAD(Vad)) { /* Check if this is VM VAD */ if (Vad->ControlArea == NULL) @@ -157,7 +157,6 @@ MmInsertMemoryArea( { PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - marea->VadNode.u.VadFlags.Spare = 1; marea->VadNode.u.VadFlags.Protection = MiMakeProtectionMask(Protect); /* Build a lame VAD if this is a user-space allocation */ @@ -334,9 +333,10 @@ MmFreeMemoryArea( #endif /* MmCleanProcessAddressSpace might have removed it (and this would be MmDeleteProcessAddressSpace) */ - ASSERT(MemoryArea->VadNode.u.VadFlags.Spare != 0); - if (((PMMVAD)MemoryArea->Vad)->u.VadFlags.Spare == 1) + ASSERT(MI_IS_MEMORY_AREA_VAD(&MemoryArea->VadNode)); + if (MI_IS_MEMORY_AREA_VAD((PMMVAD)MemoryArea->Vad)) { + ASSERT((PMMVAD)MemoryArea->Vad == &MemoryArea->VadNode); MiLockProcessWorkingSet(PsGetCurrentProcess(), PsGetCurrentThread()); MiRemoveNode((PMMADDRESS_NODE)&MemoryArea->VadNode, &Process->VadRoot); MiUnlockProcessWorkingSet(PsGetCurrentProcess(), PsGetCurrentThread()); @@ -439,6 +439,7 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace, MemoryArea->Flags = AllocationFlags; MemoryArea->Magic = 'erAM'; MemoryArea->DeleteInProgress = FALSE; + MI_SET_MEMORY_AREA_VAD(&MemoryArea->VadNode); if (*BaseAddress == 0) {