ReactOS  0.4.15-dev-2985-g54406bf
marea.c File Reference
#include <ntoskrnl.h>
#include <cache/section/newmm.h>
#include <debug.h>
#include "ARM3/miarm.h"
Include dependency graph for marea.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

PMEMORY_AREA NTAPI MmLocateMemoryAreaByAddress (PMMSUPPORT AddressSpace, PVOID Address_)
 
PMEMORY_AREA NTAPI MmLocateMemoryAreaByRegion (PMMSUPPORT AddressSpace, PVOID Address_, ULONG_PTR Length)
 
VOID NTAPI MiInsertVad (IN PMMVAD Vad, IN PMM_AVL_TABLE VadRoot)
 
ULONG NTAPI MiMakeProtectionMask (IN ULONG Protect)
 
static VOID MmInsertMemoryArea (PMMSUPPORT AddressSpace, PMEMORY_AREA marea, ULONG Protect)
 
PVOID NTAPI MmFindGap (PMMSUPPORT AddressSpace, ULONG_PTR Length, ULONG_PTR Granularity, BOOLEAN TopDown)
 
VOID NTAPI MiRemoveNode (IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
 
MmFreeMemoryArea

Free an existing memory area.

Parameters
AddressSpaceAddress space to free the area from.
MemoryAreaMemory area we're about to free.
FreePageCallback function for each freed page.
FreePageContextContext passed to the callback function.
Returns
Status
Remarks
Lock the address space before calling this function.
NTSTATUS NTAPI MmFreeMemoryArea (PMMSUPPORT AddressSpace, PMEMORY_AREA MemoryArea, PMM_FREE_PAGE_FUNC FreePage, PVOID FreePageContext)
 
MmCreateMemoryArea

Create a memory area.

Parameters
AddressSpaceAddress space to create the area in.
TypeType of the memory area.
BaseAddressBase address for the memory area we're about the create. On input it contains either 0 (auto-assign address) or preferred address. On output it contains the starting address of the newly created area.
LengthLength of the area to allocate.
AttributesProtection attributes for the memory area.
ResultReceives a pointer to the memory area on successful exit.
Returns
Status
Remarks
Lock the address space before calling this function.
NTSTATUS NTAPI MmCreateMemoryArea (PMMSUPPORT AddressSpace, ULONG Type, PVOID *BaseAddress, ULONG_PTR Length, ULONG Protect, PMEMORY_AREA *Result, ULONG AllocationFlags, ULONG Granularity)
 
VOID NTAPI MiRosCleanupMemoryArea (PEPROCESS Process, PMMVAD Vad)
 

Variables

MEMORY_AREA MiStaticMemoryAreas [MI_STATIC_MEMORY_AREAS]
 
ULONG MiStaticMemoryAreaCount
 
MM_AVL_TABLE MiRosKernelVadRoot
 
BOOLEAN MiRosKernelVadRootInitialized
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 45 of file marea.c.

Function Documentation

◆ MiInsertVad()

VOID NTAPI MiInsertVad ( IN PMMVAD  Vad,
IN PMM_AVL_TABLE  VadRoot 
)

Definition at line 183 of file vadnode.c.

185 {
188 
189  /* Validate the VAD and set it as the current hint */
190  ASSERT(Vad->EndingVpn >= Vad->StartingVpn);
191  VadRoot->NodeHint = Vad;
192 
193  /* Find the parent VAD and where this child should be inserted */
194  Result = RtlpFindAvlTableNodeOrParent(VadRoot, (PVOID)Vad->StartingVpn, &Parent);
196  ASSERT((Parent != NULL) || (Result == TableEmptyTree));
197 
198  /* Do the actual insert operation */
199  MiInsertNode(VadRoot, (PVOID)Vad, Parent, Result);
200 }
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:728
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define ASSERT(a)
Definition: mode.c:44
FORCEINLINE TABLE_SEARCH_RESULT RtlpFindAvlTableNodeOrParent(IN PRTL_AVL_TABLE Table, IN PVOID Buffer, OUT PRTL_BALANCED_LINKS *NodeOrParent)
Definition: avlsupp.c:32
VOID NTAPI MiInsertNode(IN PMM_AVL_TABLE Table, IN PMMADDRESS_NODE NewNode, IN PMMADDRESS_NODE Parent, IN TABLE_SEARCH_RESULT Result)
Definition: vadnode.c:128
#define NULL
Definition: types.h:112

Referenced by MmInsertMemoryArea().

◆ MiMakeProtectionMask()

ULONG NTAPI MiMakeProtectionMask ( IN ULONG  Protect)

Definition at line 158 of file section.c.

159 {
160  ULONG Mask1, Mask2, ProtectMask;
161 
162  /* PAGE_EXECUTE_WRITECOMBINE is theoretically the maximum */
163  if (Protect >= (PAGE_WRITECOMBINE * 2)) return MM_INVALID_PROTECTION;
164 
165  /*
166  * Windows API protection mask can be understood as two bitfields, differing
167  * by whether or not execute rights are being requested
168  */
169  Mask1 = Protect & 0xF;
170  Mask2 = (Protect >> 4) & 0xF;
171 
172  /* Check which field is there */
173  if (!Mask1)
174  {
175  /* Mask2 must be there, use it to determine the PTE protection */
176  if (!Mask2) return MM_INVALID_PROTECTION;
177  ProtectMask = MmUserProtectionToMask2[Mask2];
178  }
179  else
180  {
181  /* Mask2 should not be there, use Mask1 to determine the PTE mask */
182  if (Mask2) return MM_INVALID_PROTECTION;
183  ProtectMask = MmUserProtectionToMask1[Mask1];
184  }
185 
186  /* Make sure the final mask is a valid one */
187  if (ProtectMask == MM_INVALID_PROTECTION) return MM_INVALID_PROTECTION;
188 
189  /* Check for PAGE_GUARD option */
190  if (Protect & PAGE_GUARD)
191  {
192  /* It's not valid on no-access, nocache, or writecombine pages */
193  if ((ProtectMask == MM_NOACCESS) ||
195  {
196  /* Fail such requests */
197  return MM_INVALID_PROTECTION;
198  }
199 
200  /* This actually turns on guard page in this scenario! */
201  ProtectMask |= MM_GUARDPAGE;
202  }
203 
204  /* Check for nocache option */
205  if (Protect & PAGE_NOCACHE)
206  {
207  /* The earlier check should've eliminated this possibility */
208  ASSERT((Protect & PAGE_GUARD) == 0);
209 
210  /* Check for no-access page or write combine page */
211  if ((ProtectMask == MM_NOACCESS) || (Protect & PAGE_WRITECOMBINE))
212  {
213  /* Such a request is invalid */
214  return MM_INVALID_PROTECTION;
215  }
216 
217  /* Add the PTE flag */
218  ProtectMask |= MM_NOCACHE;
219  }
220 
221  /* Check for write combine option */
223  {
224  /* The two earlier scenarios should've caught this */
225  ASSERT((Protect & (PAGE_GUARD | PAGE_NOACCESS)) == 0);
226 
227  /* Don't allow on no-access pages */
228  if (ProtectMask == MM_NOACCESS) return MM_INVALID_PROTECTION;
229 
230  /* This actually turns on write-combine in this scenario! */
231  ProtectMask |= MM_NOACCESS;
232  }
233 
234  /* Return the final MM PTE protection mask */
235  return ProtectMask;
236 }
#define PAGE_NOCACHE
Definition: nt_native.h:1311
#define MM_INVALID_PROTECTION
Definition: miarm.h:67
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:214
CHAR MmUserProtectionToMask1[16]
Definition: section.c:44
#define PAGE_GUARD
Definition: nt_native.h:1310
#define MM_NOACCESS
Definition: miarm.h:65
#define MM_NOCACHE
Definition: miarm.h:56
ASSERT(Segment->Locked)
#define PAGE_NOACCESS
Definition: nt_native.h:1302
CHAR MmUserProtectionToMask2[16]
Definition: section.c:64
#define MM_GUARDPAGE
Definition: miarm.h:57
#define PAGE_WRITECOMBINE
Definition: mmtypes.h:78
unsigned int ULONG
Definition: retypes.h:1

Referenced by MiArm3GetCorrectFileAccessMask(), MiIsProtectionCompatible(), MiSetProtectionOnSection(), MmCreateArm3Section(), MmCreateSection(), MmInsertMemoryArea(), MmMapViewOfArm3Section(), and NtMapViewOfSection().

◆ MiRemoveNode()

VOID NTAPI MiRemoveNode ( IN PMMADDRESS_NODE  Node,
IN PMM_AVL_TABLE  Table 
)

Definition at line 360 of file vadnode.c.

362 {
363  PMMVAD_LONG Vad;
364 
365  /* Call the AVL code */
367 
368  /* Decrease element count */
369  Table->NumberGenericTableElements--;
370 
371  /* Check if this node was the hint */
372  if (Table->NodeHint == Node)
373  {
374  /* Get a new hint, unless we're empty now, in which case nothing */
375  if (!Table->NumberGenericTableElements) Table->NodeHint = NULL;
376  else Table->NodeHint = Table->BalancedRoot.RightChild;
377  }
378 
379  /* Free the node from ReactOS view as well */
380  Vad = (PMMVAD_LONG)Node;
381  if ((Table != &MmSectionBasedRoot) && (Vad->u.VadFlags.Spare == 0))
382  {
385 
386  /* Check if this is VM VAD */
387  if (Vad->ControlArea == NULL)
388  {
389  /* We store the ReactOS MEMORY_AREA here */
391  }
392  else
393  {
394  /* This is a section VAD. We store the ReactOS MEMORY_AREA here */
396  }
397 
398  /* Make sure one actually still exists */
399  if (MemoryArea)
400  {
401  /* Make sure we have not already freed it */
402  ASSERT(MemoryArea != (PVOID)(ULONG_PTR)0xDEADBAB1DEADBAB1ULL);
403 
404  /* Get the process */
406 
407  /* We only create fake memory-areas for ARM3 VADs */
409  ASSERT(MemoryArea->Vad == NULL);
410 
411  /* Free it */
413 
414  /* Check if this is VM VAD */
415  if (Vad->ControlArea == NULL)
416  {
417  /* Delete the pointer to it */
418  Vad->FirstPrototypePte = (PVOID)(ULONG_PTR)0xDEADBAB1DEADBAB1ULL;
419  }
420  else
421  {
422  /* Delete the pointer to it */
423  Vad->u4.Banked = (PVOID)(ULONG_PTR)0xDEADBAB1DEADBAB1ULL;
424  }
425  }
426  }
427 }
FORCEINLINE VOID RtlpDeleteAvlTreeNode(IN PRTL_AVL_TABLE Table, IN PRTL_BALANCED_LINKS Node)
Definition: avlsupp.c:295
ASMGENDATA Table[]
Definition: genincdata.c:61
MM_AVL_TABLE MmSectionBasedRoot
Definition: section.c:109
ULONG Type
Definition: mm.h:240
struct _MEMORY_AREA * PMEMORY_AREA
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
PCONTROL_AREA ControlArea
Definition: mmtypes.h:762
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:86
PVOID Banked
Definition: mmtypes.h:777
void * PVOID
Definition: retypes.h:9
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define ULL(a, b)
Definition: format_msg.c:27
#define ASSERT(a)
Definition: mode.c:44
struct _MMVAD_LONG * PMMVAD_LONG
NTSTATUS NTAPI MmFreeMemoryArea(PMMSUPPORT AddressSpace, PMEMORY_AREA MemoryArea, PMM_FREE_PAGE_FUNC FreePage, PVOID FreePageContext)
Definition: marea.c:283
union _MMVAD_LONG::@2553 u4
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG_PTR Spare
Definition: mmtypes.h:694
PMMPTE FirstPrototypePte
Definition: mmtypes.h:763
union _MMVAD_LONG::@2550 u
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
PVOID Vad
Definition: mm.h:244
Definition: dlist.c:348

Referenced by MmFreeMemoryArea().

◆ MiRosCleanupMemoryArea()

VOID NTAPI MiRosCleanupMemoryArea ( PEPROCESS  Process,
PMMVAD  Vad 
)

Definition at line 512 of file marea.c.

515 {
519 
520  /* We must be called from MmCleanupAddressSpace and nowhere else!
521  Make sure things are as expected... */
523  ASSERT(Process->VmDeleted == TRUE);
524  ASSERT(((PsGetCurrentThread()->ThreadsProcess == Process) &&
525  (Process->ActiveThreads == 1)) ||
526  (Process->ActiveThreads == 0));
527 
528  MemoryArea = (PMEMORY_AREA)Vad;
530 
532  {
534  }
535 #ifdef NEWCC
536  else if (MemoryArea->Type == MEMORY_AREA_CACHE)
537  {
539  }
540 #endif
541  else
542  {
543  /* There shouldn't be anything else! */
544  ASSERT(FALSE);
545  }
546 
547  /* Make sure this worked! */
549 }
ULONG Type
Definition: mm.h:240
struct _MEMORY_AREA * PMEMORY_AREA
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
#define PsGetCurrentProcess
Definition: psfuncs.h:17
void * PVOID
Definition: retypes.h:9
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:82
Status
Definition: gdiplustypes.h:24
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MA_GetStartingAddress(_MemoryArea)
Definition: mm.h:233
NTSTATUS NTAPI MmUnmapViewOfCacheSegment(PMMSUPPORT AddressSpace, PVOID BaseAddress)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
NTSTATUS NTAPI MiRosUnmapViewOfSection(IN PEPROCESS Process, IN PVOID BaseAddress, IN BOOLEAN SkipDebuggerNotify)
Definition: section.c:3548
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37

Referenced by MmCleanProcessAddressSpace().

◆ MmCreateMemoryArea()

NTSTATUS NTAPI MmCreateMemoryArea ( PMMSUPPORT  AddressSpace,
ULONG  Type,
PVOID BaseAddress,
ULONG_PTR  Length,
ULONG  Protect,
PMEMORY_AREA Result,
ULONG  AllocationFlags,
ULONG  Granularity 
)

Definition at line 401 of file marea.c.

409 {
410  ULONG_PTR tmpLength;
412  ULONG_PTR EndingAddress;
413 
414  DPRINT("MmCreateMemoryArea(Type 0x%lx, BaseAddress %p, "
415  "*BaseAddress %p, Length %p, AllocationFlags %x, "
416  "Result %p)\n",
417  Type, BaseAddress, *BaseAddress, Length, AllocationFlags,
418  Result);
419 
420  /* Is this a static memory area? */
421  if (Type & MEMORY_AREA_STATIC)
422  {
423  /* Use the static array instead of the pool */
426  }
427  else
428  {
429  /* Allocate the memory area from nonpaged pool */
431  sizeof(MEMORY_AREA),
432  TAG_MAREA);
433  }
434 
435  if (!MemoryArea)
436  {
437  DPRINT1("Not enough memory.\n");
438  return STATUS_NO_MEMORY;
439  }
440 
443  MemoryArea->Flags = AllocationFlags;
444  MemoryArea->Magic = 'erAM';
446 
447  if (*BaseAddress == 0)
448  {
449  tmpLength = (ULONG_PTR)MM_ROUND_UP(Length, PAGE_SIZE);
451  tmpLength,
452  Granularity,
453  (AllocationFlags & MEM_TOP_DOWN) == MEM_TOP_DOWN);
454  if ((*BaseAddress) == 0)
455  {
456  DPRINT("No suitable gap\n");
458  return STATUS_NO_MEMORY;
459  }
460 
462  MemoryArea->VadNode.EndingVpn = ((ULONG_PTR)*BaseAddress + tmpLength - 1) >> PAGE_SHIFT;
464  }
465  else
466  {
467  EndingAddress = ((ULONG_PTR)*BaseAddress + Length - 1) | (PAGE_SIZE - 1);
469  tmpLength = EndingAddress + 1 - (ULONG_PTR)*BaseAddress;
470 
472  {
473  ASSERT(FALSE);
476  }
477 
480  {
481  DPRINT("Memory area for user mode address space exceeds MmSystemRangeStart\n");
484  }
485 
486  /* No need to check ARM3 owned memory areas, the range MUST be free */
488  {
490  *BaseAddress,
491  tmpLength) != NULL)
492  {
493  DPRINT("Memory area already occupied\n");
496  }
497  }
498 
500  MemoryArea->VadNode.EndingVpn = ((ULONG_PTR)*BaseAddress + tmpLength - 1) >> PAGE_SHIFT;
502  }
503 
504  *Result = MemoryArea;
505 
506  DPRINT("MmCreateMemoryArea() succeeded (%p)\n", *BaseAddress);
507  return STATUS_SUCCESS;
508 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ULONG Type
Definition: mm.h:240
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:214
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
#define MEMORY_AREA_STATIC
Definition: mm.h:87
uint32_t ULONG_PTR
Definition: typedefs.h:65
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
ULONG Magic
Definition: mm.h:243
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:86
#define FALSE
Definition: types.h:117
#define TAG_MAREA
Definition: tag.h:120
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
ULONG_PTR StartingVpn
Definition: mmtypes.h:726
#define MM_ROUND_UP(x, s)
Definition: mm.h:117
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define ASSERT(a)
Definition: mode.c:44
BOOLEAN DeleteInProgress
Definition: mm.h:242
Type
Definition: Type.h:6
MMVAD VadNode
Definition: mm.h:238
MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS]
Definition: marea.c:51
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
static VOID MmInsertMemoryArea(PMMSUPPORT AddressSpace, PMEMORY_AREA marea, ULONG Protect)
Definition: marea.c:166
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
ULONG MiStaticMemoryAreaCount
Definition: marea.c:52
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
#define MI_STATIC_MEMORY_AREAS
Definition: mm.h:79
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ULONG_PTR
Definition: config.h:101
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
PVOID NTAPI MmFindGap(PMMSUPPORT AddressSpace, ULONG_PTR Length, ULONG_PTR Granularity, BOOLEAN TopDown)
Definition: marea.c:215
PMEMORY_AREA NTAPI MmLocateMemoryAreaByRegion(PMMSUPPORT AddressSpace, PVOID Address_, ULONG_PTR Length)
Definition: marea.c:106
#define MEM_TOP_DOWN
Definition: nt_native.h:1321
#define STATUS_CONFLICTING_ADDRESSES
Definition: ntstatus.h:261
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define ALIGN_DOWN_POINTER_BY(ptr, align)
Definition: umtypes.h:82
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
#define MmSystemRangeStart
Definition: mm.h:32
ULONG Flags
Definition: mm.h:241

Referenced by MiCreateArm3StaticMemoryArea(), MiInsertNode(), and MmMapViewOfSegment().

◆ MmFindGap()

PVOID NTAPI MmFindGap ( PMMSUPPORT  AddressSpace,
ULONG_PTR  Length,
ULONG_PTR  Granularity,
BOOLEAN  TopDown 
)

Definition at line 215 of file marea.c.

220 {
222  PMM_AVL_TABLE VadRoot;
225  ULONG_PTR StartingAddress, HighestAddress;
226 
228  VadRoot = Process ? &Process->VadRoot : &MiRosKernelVadRoot;
229  if (TopDown)
230  {
231  /* Find an address top-down */
232  HighestAddress = Process ? (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS : (LONG_PTR)-1;
234  HighestAddress,
235  Granularity,
236  VadRoot,
237  &StartingAddress,
238  &Parent);
239  }
240  else
241  {
243  Granularity,
244  VadRoot,
245  &Parent,
246  &StartingAddress);
247  }
248 
249  if (Result == TableFoundNode)
250  {
251  return NULL;
252  }
253 
254  return (PVOID)StartingAddress;
255 }
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeDownTree(IN SIZE_T Length, IN ULONG_PTR BoundaryAddress, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PULONG_PTR Base, OUT PMMADDRESS_NODE *Parent)
Definition: vadnode.c:597
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:728
uint32_t ULONG_PTR
Definition: typedefs.h:65
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeInTree(IN SIZE_T Length, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *PreviousVad, OUT PULONG_PTR Base)
Definition: vadnode.c:502
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define NULL
Definition: types.h:112
#define MM_HIGHEST_VAD_ADDRESS
Definition: mm.h:46
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define ULONG_PTR
Definition: config.h:101

Referenced by MmCreateMemoryArea(), and MmMapViewOfSection().

◆ MmFreeMemoryArea()

NTSTATUS NTAPI MmFreeMemoryArea ( PMMSUPPORT  AddressSpace,
PMEMORY_AREA  MemoryArea,
PMM_FREE_PAGE_FUNC  FreePage,
PVOID  FreePageContext 
)

Definition at line 283 of file marea.c.

288 {
290  PVOID EndAddress;
291 
292  /* Make sure we own the address space lock! */
293  ASSERT(CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock.Owner == KeGetCurrentThread());
294 
295  /* Check magic */
296  ASSERT(MemoryArea->Magic == 'erAM');
297 
299  {
302 
303  if (Process != NULL &&
305  {
306  KeAttachProcess(&Process->Pcb);
307  }
308 
311  Address < (ULONG_PTR)EndAddress;
312  Address += PAGE_SIZE)
313  {
314  BOOLEAN Dirty = FALSE;
315  SWAPENTRY SwapEntry = 0;
316  PFN_NUMBER Page = 0;
317 
319  {
321  }
322  else
323  {
325  }
326  if (FreePage != NULL)
327  {
328  FreePage(FreePageContext, MemoryArea, (PVOID)Address,
329  Page, SwapEntry, (BOOLEAN)Dirty);
330  }
331  }
332 
333  if (Process != NULL &&
335  {
336  KeDetachProcess();
337  }
338 
339  //if (MemoryArea->VadNode.StartingVpn < (ULONG_PTR)MmSystemRangeStart >> PAGE_SHIFT
340  if (MemoryArea->Vad)
341  {
343 #ifdef NEWCC
344  ASSERT(MemoryArea->Type == MEMORY_AREA_SECTION_VIEW || MemoryArea->Type == MEMORY_AREA_CACHE);
345 #else
347 #endif
348 
349  /* MmCleanProcessAddressSpace might have removed it (and this would be MmDeleteProcessAdressSpace) */
351  if (((PMMVAD)MemoryArea->Vad)->u.VadFlags.Spare == 1)
352  {
354  }
355 
356  MemoryArea->Vad = NULL;
357  }
358  else
359  {
361  }
362  }
363 
364 #if DBG
365  MemoryArea->Magic = 'daeD';
366 #endif
368 
369  DPRINT("MmFreeMemoryArea() succeeded\n");
370 
371  return STATUS_SUCCESS;
372 }
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
VOID NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
Definition: vadnode.c:360
ULONG Type
Definition: mm.h:240
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
VOID NTAPI MmDeletePageFileMapping(struct _EPROCESS *Process, PVOID Address, SWAPENTRY *SwapEntry)
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:731
uint32_t ULONG_PTR
Definition: typedefs.h:65
union _MMVAD::@2547 u
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
ULONG Magic
Definition: mm.h:243
ULONG PFN_NUMBER
Definition: ke.h:9
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:86
#define FALSE
Definition: types.h:117
#define TAG_MAREA
Definition: tag.h:120
#define PsGetCurrentProcess
Definition: psfuncs.h:17
unsigned char BOOLEAN
static WCHAR Address[46]
Definition: ping.c:68
VOID NTAPI MmDeleteVirtualMapping(struct _EPROCESS *Process, PVOID Address, BOOLEAN *WasDirty, PPFN_NUMBER Page)
PFN_NUMBER Page
Definition: section.c:4888
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:82
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define MM_ROUND_UP(x, s)
Definition: mm.h:117
ULONG CurrentProcess
Definition: shell.c:125
#define ASSERT(a)
Definition: mode.c:44
#define MA_GetEndingAddress(_MemoryArea)
Definition: mm.h:234
BOOLEAN NTAPI MmIsPageSwapEntry(struct _EPROCESS *Process, PVOID Address)
MMVAD VadNode
Definition: mm.h:238
VOID NTAPI KeDetachProcess(VOID)
Definition: procobj.c:621
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define MA_GetStartingAddress(_MemoryArea)
Definition: mm.h:233
VOID NTAPI KeAttachProcess(IN PKPROCESS Process)
Definition: procobj.c:582
ULONG_PTR SWAPENTRY
Definition: mm.h:53
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG_PTR Spare
Definition: mmtypes.h:694
#define ULONG_PTR
Definition: config.h:101
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
#define KeGetCurrentThread
Definition: hal.h:55
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
PVOID Vad
Definition: mm.h:244
#define MmSystemRangeStart
Definition: mm.h:32

Referenced by MiRemoveNode(), and MmUnmapViewOfSegment().

◆ MmInsertMemoryArea()

static VOID MmInsertMemoryArea ( PMMSUPPORT  AddressSpace,
PMEMORY_AREA  marea,
ULONG  Protect 
)
static

Definition at line 166 of file marea.c.

170 {
172 
173  marea->VadNode.u.VadFlags.Spare = 1;
175 
176  /* Build a lame VAD if this is a user-space allocation */
178  {
179  ASSERT(Process != NULL);
180  if (marea->Type != MEMORY_AREA_OWNED_BY_ARM3)
181  {
182 #ifdef NEWCC
183  ASSERT(marea->Type == MEMORY_AREA_SECTION_VIEW || marea->Type == MEMORY_AREA_CACHE);
184 #else
186 #endif
187 
188  /* Insert the VAD */
190  MiInsertVad(&marea->VadNode, &Process->VadRoot);
192  marea->Vad = &marea->VadNode;
193  }
194  }
195  else
196  {
197  ASSERT(Process == NULL);
198 
200  {
204  }
205 
206  /* Insert the VAD */
210  marea->Vad = NULL;
211  }
212 }
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
ULONG NTAPI MiMakeProtectionMask(IN ULONG Protect)
Definition: section.c:158
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
ULONG Type
Definition: mm.h:240
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1244
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:214
#define TRUE
Definition: types.h:120
union _MMADDRESS_NODE::@2545 u1
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
ULONG_PTR Unused
Definition: mmtypes.h:661
ULONG_PTR Protection
Definition: mmtypes.h:693
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:731
MMADDRESS_NODE BalancedRoot
Definition: mmtypes.h:659
uint32_t ULONG_PTR
Definition: typedefs.h:65
union _MMVAD::@2547 u
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:86
#define PsGetCurrentProcess
Definition: psfuncs.h:17
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1356
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:82
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1174
#define ASSERT(a)
Definition: mode.c:44
MMVAD VadNode
Definition: mm.h:238
BOOLEAN MiRosKernelVadRootInitialized
Definition: marea.c:55
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG_PTR Spare
Definition: mmtypes.h:694
VOID NTAPI MiInsertVad(IN PMMVAD Vad, IN PMM_AVL_TABLE VadRoot)
Definition: vadnode.c:183
FORCEINLINE VOID MiLockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1270
PVOID Vad
Definition: mm.h:244
#define MmSystemRangeStart
Definition: mm.h:32
struct _MMADDRESS_NODE * Parent
Definition: mmtypes.h:646

Referenced by MmCreateMemoryArea().

◆ MmLocateMemoryAreaByAddress()

PMEMORY_AREA NTAPI MmLocateMemoryAreaByAddress ( PMMSUPPORT  AddressSpace,
PVOID  Address_ 
)

Definition at line 60 of file marea.c.

63 {
64  ULONG_PTR StartVpn = (ULONG_PTR)Address_ / PAGE_SIZE;
70  PMMVAD_LONG Vad;
71 
73  Table = (Process != NULL) ? &Process->VadRoot : &MiRosKernelVadRoot;
74 
75  Result = MiCheckForConflictingNode(StartVpn, StartVpn, Table, &Node);
76  if (Result != TableFoundNode)
77  {
78  return NULL;
79  }
80 
81  Vad = (PMMVAD_LONG)Node;
82  if (Vad->u.VadFlags.Spare == 0)
83  {
84  /* Check if this is VM VAD */
85  if (Vad->ControlArea == NULL)
86  {
87  /* We store the reactos MEMORY_AREA here */
89  }
90  else
91  {
92  /* This is a section VAD. Store the MAREA here for now */
94  }
95  }
96  else
97  {
99  }
100 
101  return MemoryArea;
102 }
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
ASMGENDATA Table[]
Definition: genincdata.c:61
struct _MEMORY_AREA * PMEMORY_AREA
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
PCONTROL_AREA ControlArea
Definition: mmtypes.h:762
uint32_t ULONG_PTR
Definition: typedefs.h:65
union node Node
Definition: types.h:1255
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
PVOID Banked
Definition: mmtypes.h:777
TABLE_SEARCH_RESULT NTAPI MiCheckForConflictingNode(IN ULONG_PTR StartVpn, IN ULONG_PTR EndVpn, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *NodeOrParent)
Definition: vadnode.c:78
struct _MMVAD_LONG * PMMVAD_LONG
#define PAGE_SIZE
Definition: env_spec_w32.h:49
union _MMVAD_LONG::@2553 u4
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG_PTR Spare
Definition: mmtypes.h:694
PMMPTE FirstPrototypePte
Definition: mmtypes.h:763
#define ULONG_PTR
Definition: config.h:101
union _MMVAD_LONG::@2550 u
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
Definition: dlist.c:348

Referenced by MiProtectVirtualMemory(), MiQueryMemoryBasicInformation(), MiRosProtectVirtualMemory(), MiRosUnmapViewOfSection(), MiUnmapViewOfSection(), MmAccessFault(), MmAlterViewAttributes(), MmArePagesResident(), MmMakePagesDirty(), MmNotPresentFault(), MmpAccessFault(), MmPageOutPhysicalAddress(), MmpPageOutPhysicalAddress(), MmUnmapViewInSystemSpace(), MmUnmapViewOfSegment(), NtAllocateVirtualMemory(), and NtFreeVirtualMemory().

◆ MmLocateMemoryAreaByRegion()

PMEMORY_AREA NTAPI MmLocateMemoryAreaByRegion ( PMMSUPPORT  AddressSpace,
PVOID  Address_,
ULONG_PTR  Length 
)

Definition at line 106 of file marea.c.

110 {
111  ULONG_PTR StartVpn = (ULONG_PTR)Address_ / PAGE_SIZE;
112  ULONG_PTR EndVpn = ((ULONG_PTR)Address_ + Length - 1) / PAGE_SIZE;
118  PMMVAD_LONG Vad;
119 
121  Table = (Process != NULL) ? &Process->VadRoot : &MiRosKernelVadRoot;
122 
123  Result = MiCheckForConflictingNode(StartVpn, EndVpn, Table, &Node);
124  if (Result != TableFoundNode)
125  {
126  return NULL;
127  }
128 
129  Vad = (PMMVAD_LONG)Node;
130  if (Vad->u.VadFlags.Spare == 0)
131  {
132  /* Check if this is VM VAD */
133  if (Vad->ControlArea == NULL)
134  {
135  /* We store the reactos MEMORY_AREA here */
137  }
138  else
139  {
140  /* This is a section VAD. Store the MAREA here for now */
142  }
143  }
144  else
145  {
147  }
148 
149  ASSERT(MemoryArea != NULL);
150  return MemoryArea;
151 }
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
ASMGENDATA Table[]
Definition: genincdata.c:61
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
struct _MEMORY_AREA * PMEMORY_AREA
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2272
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
PCONTROL_AREA ControlArea
Definition: mmtypes.h:762
uint32_t ULONG_PTR
Definition: typedefs.h:65
union node Node
Definition: types.h:1255
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
PVOID Banked
Definition: mmtypes.h:777
TABLE_SEARCH_RESULT NTAPI MiCheckForConflictingNode(IN ULONG_PTR StartVpn, IN ULONG_PTR EndVpn, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *NodeOrParent)
Definition: vadnode.c:78
#define ASSERT(a)
Definition: mode.c:44
struct _MMVAD_LONG * PMMVAD_LONG
#define PAGE_SIZE
Definition: env_spec_w32.h:49
union _MMVAD_LONG::@2553 u4
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1625
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG_PTR Spare
Definition: mmtypes.h:694
PMMPTE FirstPrototypePte
Definition: mmtypes.h:763
#define ULONG_PTR
Definition: config.h:101
union _MMVAD_LONG::@2550 u
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
Definition: dlist.c:348

Referenced by MmCreateMemoryArea(), and MmMapViewOfSection().

Variable Documentation

◆ MiRosKernelVadRoot

◆ MiRosKernelVadRootInitialized

BOOLEAN MiRosKernelVadRootInitialized

Definition at line 55 of file marea.c.

Referenced by MmInsertMemoryArea().

◆ MiStaticMemoryAreaCount

ULONG MiStaticMemoryAreaCount

Definition at line 52 of file marea.c.

Referenced by MmCreateMemoryArea().

◆ MiStaticMemoryAreas

MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS]

Definition at line 51 of file marea.c.

Referenced by MmCreateMemoryArea().