ReactOS  0.4.15-dev-2487-g7b27e7c
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)
 
VOID NTAPI MmDeleteProcessAddressSpace2 (IN PEPROCESS Process)
 
NTSTATUS NTAPI MmDeleteProcessAddressSpace (PEPROCESS Process)
 

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:45
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:223
struct _MEMORY_AREA * PMEMORY_AREA
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
union _MMVAD_LONG::@2567 u
PCONTROL_AREA ControlArea
Definition: mmtypes.h:762
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:79
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:45
struct _MMVAD_LONG * PMMVAD_LONG
NTSTATUS NTAPI MmFreeMemoryArea(PMMSUPPORT AddressSpace, PMEMORY_AREA MemoryArea, PMM_FREE_PAGE_FUNC FreePage, PVOID FreePageContext)
Definition: marea.c:283
#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
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
PVOID Vad
Definition: mm.h:227
Definition: dlist.c:348
union _MMVAD_LONG::@2570 u4

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:223
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:75
Status
Definition: gdiplustypes.h:24
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define ASSERT(a)
Definition: mode.c:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MA_GetStartingAddress(_MemoryArea)
Definition: mm.h:216
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:3502
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:223
_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:2268
#define MEMORY_AREA_STATIC
Definition: mm.h:80
uint32_t ULONG_PTR
Definition: typedefs.h:65
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
ULONG Magic
Definition: mm.h:226
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:79
#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:110
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define ASSERT(a)
Definition: mode.c:45
BOOLEAN DeleteInProgress
Definition: mm.h:225
Type
Definition: Type.h:6
MMVAD VadNode
Definition: mm.h:221
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:1552
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
#define MI_STATIC_MEMORY_AREAS
Definition: mm.h:72
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ULONG_PTR
Definition: config.h:101
#define STATUS_SUCCESS
Definition: shellext.h:65
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#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 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:224

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

◆ MmDeleteProcessAddressSpace()

NTSTATUS NTAPI MmDeleteProcessAddressSpace ( PEPROCESS  Process)

Definition at line 557 of file marea.c.

558 {
559 #ifndef _M_AMD64
560  KIRQL OldIrql;
561 #endif
562 
563  DPRINT("MmDeleteProcessAddressSpace(Process %p (%s))\n", Process,
564  Process->ImageFileName);
565 
566 #ifndef _M_AMD64
568  RemoveEntryList(&Process->MmProcessLinks);
570 #endif
572 
573 #if (_MI_PAGING_LEVELS == 2)
574  {
575  KIRQL OldIrql;
576  PVOID Address;
577  PMMPDE pointerPde;
578 
579  /* Attach to Process */
580  KeAttachProcess(&Process->Pcb);
581 
582  /* Acquire PFN lock */
584 
588  {
589  /* At this point all references should be dead */
591  {
592  DPRINT1("Process %p, Address %p, UsedPageTableEntries %lu\n",
593  Process,
594  Address,
597  }
598 
599  pointerPde = MiAddressToPde(Address);
600  /* Unlike in ARM3, we don't necesarrily free the PDE page as soon as reference reaches 0,
601  * so we must clean up a bit when process closes */
602  if (pointerPde->u.Hard.Valid)
603  MiDeletePte(pointerPde, MiPdeToPte(pointerPde), Process, NULL);
604  ASSERT(pointerPde->u.Hard.Valid == 0);
605  }
606 
607  /* Release lock */
609 
610  /* Detach */
611  KeDetachProcess();
612  }
613 #endif
614 
616 
617  DPRINT("Finished MmDeleteProcessAddressSpace()\n");
619  return(STATUS_SUCCESS);
620 }
#define MiAddressToPde(x)
Definition: mmx86.c:20
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
Definition: miarm.h:1514
union _MMPTE::@2304 u
#define MI_LOWEST_VAD_ADDRESS
Definition: miarm.h:15
FORCEINLINE VOID MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
Definition: mm.h:1545
FORCEINLINE KIRQL MiAcquirePfnLock(VOID)
Definition: mm.h:923
FORCEINLINE USHORT MiQueryPageTableReferences(IN PVOID Address)
Definition: miarm.h:1825
FORCEINLINE VOID MiReleasePfnLock(_In_ KIRQL OldIrql)
Definition: mm.h:930
VOID NTAPI MiDeletePte(IN PMMPTE PointerPte, IN PVOID VirtualAddress, IN PEPROCESS CurrentProcess, IN PMMPTE PrototypePte)
Definition: virtual.c:391
uint32_t ULONG_PTR
Definition: typedefs.h:65
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
UCHAR KIRQL
Definition: env_spec_w32.h:591
static WCHAR Address[46]
Definition: ping.c:68
VOID NTAPI MmDeleteProcessAddressSpace2(IN PEPROCESS Process)
Definition: procsup.c:1336
void * PVOID
Definition: retypes.h:9
#define ASSERT(a)
Definition: mode.c:45
ULONG64 Valid
Definition: mmtypes.h:150
#define PTE_PER_PAGE
Definition: mm.h:20
VOID NTAPI KeDetachProcess(VOID)
Definition: procobj.c:618
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
#define PAGE_SIZE
Definition: env_spec_w32.h:49
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
#define MiPdeToPte(_Pde)
Definition: mm.h:235
VOID NTAPI KeAttachProcess(IN PKPROCESS Process)
Definition: procobj.c:579
#define NULL
Definition: types.h:112
FORCEINLINE VOID MiReleaseExpansionLock(KIRQL OldIrql)
Definition: miarm.h:1527
#define DPRINT1
Definition: precomp.h:8
#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 STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
FORCEINLINE VOID MmLockAddressSpace(PMMSUPPORT AddressSpace)
Definition: mm.h:1538

◆ MmDeleteProcessAddressSpace2()

VOID NTAPI MmDeleteProcessAddressSpace2 ( IN PEPROCESS  Process)

Definition at line 1336 of file procsup.c.

1337 {
1338  PMMPFN Pfn1, Pfn2;
1339  KIRQL OldIrql;
1340  PFN_NUMBER PageFrameIndex;
1341 
1342  //ASSERT(Process->CommitCharge == 0);
1343 
1344  /* Remove us from the list */
1346  RemoveEntryList(&Process->Vm.WorkingSetExpansionLinks);
1348 
1349  /* Acquire the PFN lock */
1351 
1352  /* Check for fully initialized process */
1353  if (Process->AddressSpaceInitialized == 2)
1354  {
1355  /* Map the working set page and its page table */
1356  Pfn1 = MiGetPfnEntry(Process->WorkingSetPage);
1357  Pfn2 = MiGetPfnEntry(Pfn1->u4.PteFrame);
1358 
1359  /* Nuke it */
1360  MI_SET_PFN_DELETED(Pfn1);
1361  MiDecrementShareCount(Pfn2, Pfn1->u4.PteFrame);
1362  MiDecrementShareCount(Pfn1, Process->WorkingSetPage);
1363  ASSERT((Pfn1->u3.e2.ReferenceCount == 0) || (Pfn1->u3.e1.WriteInProgress));
1364  MiReleaseSystemPtes(MiAddressToPte(Process->Vm.VmWorkingSetList), 1, SystemPteSpace);
1365 
1366  /* Now map hyperspace and its page table */
1367  PageFrameIndex = Process->Pcb.DirectoryTableBase[1] >> PAGE_SHIFT;
1368  Pfn1 = MiGetPfnEntry(PageFrameIndex);
1369  Pfn2 = MiGetPfnEntry(Pfn1->u4.PteFrame);
1370 
1371  /* Nuke it */
1372  MI_SET_PFN_DELETED(Pfn1);
1373  MiDecrementShareCount(Pfn2, Pfn1->u4.PteFrame);
1374  MiDecrementShareCount(Pfn1, PageFrameIndex);
1375  ASSERT((Pfn1->u3.e2.ReferenceCount == 0) || (Pfn1->u3.e1.WriteInProgress));
1376 
1377  /* Finally, nuke the PDE itself */
1378  PageFrameIndex = Process->Pcb.DirectoryTableBase[0] >> PAGE_SHIFT;
1379  Pfn1 = MiGetPfnEntry(PageFrameIndex);
1380  MI_SET_PFN_DELETED(Pfn1);
1381  MiDecrementShareCount(Pfn1, PageFrameIndex);
1382  MiDecrementShareCount(Pfn1, PageFrameIndex);
1383 
1384  /* Page table is now dead. Bye bye... */
1385  ASSERT((Pfn1->u3.e2.ReferenceCount == 0) || (Pfn1->u3.e1.WriteInProgress));
1386  }
1387  else
1388  {
1389  /* A partly-initialized process should never exit through here */
1390  ASSERT(FALSE);
1391  }
1392 
1393  /* Release the PFN lock */
1395 
1396  /* Drop a reference on the session */
1398 
1399  /* Clear out the PDE pages */
1400  Process->Pcb.DirectoryTableBase[0] = 0;
1401  Process->Pcb.DirectoryTableBase[1] = 0;
1402 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
Definition: miarm.h:1514
VOID NTAPI MiReleaseProcessReferenceToSessionDataPage(IN PMM_SESSION_SPACE SessionGlobal)
Definition: session.c:209
struct _MMPFN::@1778::@1784 e2
FORCEINLINE KIRQL MiAcquirePfnLock(VOID)
Definition: mm.h:923
union _MMPFN::@1781 u4
FORCEINLINE VOID MiReleasePfnLock(_In_ KIRQL OldIrql)
Definition: mm.h:930
union _MMPFN::@1778 u3
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
UCHAR KIRQL
Definition: env_spec_w32.h:591
MMPFNENTRY e1
Definition: mm.h:369
#define MiAddressToPte(x)
Definition: mmx86.c:19
ULONG PFN_NUMBER
Definition: ke.h:9
#define FALSE
Definition: types.h:117
VOID NTAPI MiDecrementShareCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:1132
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
Definition: syspte.c:264
USHORT WriteInProgress
Definition: mm.h:334
#define ASSERT(a)
Definition: mode.c:45
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
Definition: mm.h:345
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
Definition: mm.h:962
#define MI_SET_PFN_DELETED(x)
Definition: miarm.h:194
ULONG_PTR PteFrame
Definition: mm.h:390
FORCEINLINE VOID MiReleaseExpansionLock(KIRQL OldIrql)
Definition: miarm.h:1527
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

Referenced by MmDeleteProcessAddressSpace().

◆ 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:2268
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:1552
__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:223
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2268
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
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
ULONG Magic
Definition: mm.h:226
ULONG PFN_NUMBER
Definition: ke.h:9
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:79
#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:4756
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:75
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:110
ULONG CurrentProcess
Definition: shell.c:125
#define ASSERT(a)
Definition: mode.c:45
#define MA_GetEndingAddress(_MemoryArea)
Definition: mm.h:217
BOOLEAN NTAPI MmIsPageSwapEntry(struct _EPROCESS *Process, PVOID Address)
MMVAD VadNode
Definition: mm.h:221
VOID NTAPI KeDetachProcess(VOID)
Definition: procobj.c:618
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define MA_GetStartingAddress(_MemoryArea)
Definition: mm.h:216
VOID NTAPI KeAttachProcess(IN PKPROCESS Process)
Definition: procobj.c:579
union _MMVAD::@2564 u
ULONG_PTR SWAPENTRY
Definition: mm.h:51
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1552
#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 ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define DPRINT
Definition: sndvol32.h:71
#define KeGetCurrentThread
Definition: hal.h:49
PVOID Vad
Definition: mm.h:227
#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:223
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1222
#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
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2268
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
ULONG_PTR EndingVpn
Definition: mmtypes.h:727
#define MEMORY_AREA_OWNED_BY_ARM3
Definition: mm.h:79
#define PsGetCurrentProcess
Definition: psfuncs.h:17
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1334
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:75
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1152
#define ASSERT(a)
Definition: mode.c:45
union _MMADDRESS_NODE::@2562 u1
MMVAD VadNode
Definition: mm.h:221
BOOLEAN MiRosKernelVadRootInitialized
Definition: marea.c:55
union _MMVAD::@2564 u
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1552
#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:1248
PVOID Vad
Definition: mm.h:227
#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:2268
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
union _MMVAD_LONG::@2567 u
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
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1552
#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
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
Definition: dlist.c:348
union _MMVAD_LONG::@2570 u4

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:2268
MMVAD_FLAGS VadFlags
Definition: mmtypes.h:760
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
union _MMVAD_LONG::@2567 u
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:45
struct _MMVAD_LONG * PMMVAD_LONG
#define PAGE_SIZE
Definition: env_spec_w32.h:49
FORCEINLINE PEPROCESS MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
Definition: mm.h:1552
#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
struct _MEMORY_AREA * MemoryArea
Definition: newmm.h:37
Definition: dlist.c:348
union _MMVAD_LONG::@2570 u4

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().