- PMEMORY_AREA Node;
- PMEMORY_AREA PreviousNode;
- ULONG Depth = 0;
- PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
-
- /* Build a lame VAD if this is a user-space allocation */
- if ((marea->EndingAddress < MmSystemRangeStart) && (marea->Type != MEMORY_AREA_OWNED_BY_ARM3))
- {
- PMMVAD Vad;
-
- ASSERT(marea->Type == MEMORY_AREA_SECTION_VIEW || marea->Type == MEMORY_AREA_CACHE);
- Vad = ExAllocatePoolWithTag(NonPagedPool, sizeof(MMVAD), TAG_MVAD);
- ASSERT(Vad);
- RtlZeroMemory(Vad, sizeof(MMVAD));
- Vad->StartingVpn = PAGE_ROUND_DOWN(marea->StartingAddress) >> PAGE_SHIFT;
- /*
- * For some strange reason, it is perfectly valid to create a MAREA from 0x1000 to... 0x1000.
- * In a normal OS/Memory Manager, this would be retarded, but ReactOS allows this (how it works
- * I don't even want to know).
- */
- if (marea->EndingAddress != marea->StartingAddress)
- {
- Vad->EndingVpn = PAGE_ROUND_DOWN((ULONG_PTR)marea->EndingAddress - 1) >> PAGE_SHIFT;
- }
- else
- {
- Vad->EndingVpn = Vad->StartingVpn;
- }
- Vad->u.VadFlags.Spare = 1;
- Vad->u.VadFlags.PrivateMemory = 1;
- Vad->u.VadFlags.Protection = MiMakeProtectionMask(marea->Protect);
-
- /* Insert the VAD */
- MiInsertVad(Vad, Process);
- marea->Vad = Vad;
- }
- else
- {
- marea->Vad = NULL;
- }
-
- if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL)
- {
- AddressSpace->WorkingSetExpansionLinks.Flink = (PVOID)marea;
- marea->LeftChild = marea->RightChild = marea->Parent = NULL;
- return;
- }
-
- Node = (PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink;
- do
- {
- DPRINT("marea->EndingAddress: %p Node->StartingAddress: %p\n",
- marea->EndingAddress, Node->StartingAddress);
- DPRINT("marea->StartingAddress: %p Node->EndingAddress: %p\n",
- marea->StartingAddress, Node->EndingAddress);
- ASSERT(marea->EndingAddress <= Node->StartingAddress ||
- marea->StartingAddress >= Node->EndingAddress);
- ASSERT(marea->StartingAddress != Node->StartingAddress);
-
- PreviousNode = Node;
-
- if (marea->StartingAddress < Node->StartingAddress)
- Node = Node->LeftChild;
- else
- Node = Node->RightChild;
-
- if (Node)
- {
- Depth++;
- if (Depth == 22)
- {
- MmRebalanceTree(AddressSpace);
- PreviousNode = Node->Parent;
- }
- }
- }
- while (Node != NULL);
-
- marea->LeftChild = marea->RightChild = NULL;
- marea->Parent = PreviousNode;
- if (marea->StartingAddress < PreviousNode->StartingAddress)
- PreviousNode->LeftChild = marea;
- else
- PreviousNode->RightChild = marea;
-}