Index: ntoskrnl/mm/ARM3/vadnode.c =================================================================== --- ntoskrnl/mm/ARM3/vadnode.c (revision 57181) +++ ntoskrnl/mm/ARM3/vadnode.c (working copy) @@ -64,7 +64,7 @@ if (!Table->NumberGenericTableElements) return NULL; /* Start looping from the right */ - CurrentNode = RtlRightChildAvl(&Table->BalancedRoot); + CurrentNode = &Table->BalancedRoot; ASSERT(CurrentNode != NULL); while (CurrentNode) { @@ -81,11 +81,18 @@ } else { + /* This address is part of this node, return it */ break; } } + if (CurrentNode) + { + if ((CurrentNode->StartingVpn==0)&&(CurrentNode->EndingVpn==0)) + CurrentNode=NULL; + } + /* Return either the conflicting node, or no node at all */ return CurrentNode; } Index: ntoskrnl/mm/ARM3/virtual.c =================================================================== --- ntoskrnl/mm/ARM3/virtual.c (revision 57181) +++ ntoskrnl/mm/ARM3/virtual.c (working copy) @@ -3458,6 +3458,14 @@ return Status; } +NTSTATUS NTAPI +MmSplitMemoryArea( + PMMSUPPORT AddressSpace, + PVOID BaseAddress, + ULONG_PTR Length, + ULONG AllocationFlags, + BOOLEAN Set + ); /* * @implemented @@ -3675,9 +3683,51 @@ ASSERT((AllocationType & MEM_PHYSICAL) == 0); ASSERT((AllocationType & MEM_WRITE_WATCH) == 0); ASSERT((AllocationType & MEM_TOP_DOWN) == 0); - ASSERT((AllocationType & MEM_RESET) == 0); ASSERT(Process->VmTopDown == 0); + if (AllocationType & MEM_RESET) + { + + + + StartingAddress = (ULONG_PTR)PAGE_ROUND_DOWN(PBaseAddress);//Increase the address to the next page + EndingAddress = PAGE_ROUND_UP((ULONG_PTR)PBaseAddress + PRegionSize )-PAGE_SIZE ;//Reduce the address to the previous page + if (StartingAddress==0) + return STATUS_INVALID_PARAMETER_2; + if (StartingAddress>EndingAddress) + return STATUS_INVALID_PARAMETER_4; + //Set + /* + ULONG_PTR Address; + while (TRUE) + { + ULONG_PTR End; + Vad = MiLocateAddress((PVOID)StartingAddress); + if (Vad) + { + End=(EndingAddress>>PAGE_SHIFTEndingVpn)?EndingAddress:Vad->EndingVpn*PAGE_SIZE; + for (Address=StartingAddress;Address<=End;Address+=PAGE_SIZE) + { + PointerPte=Vad->FirstPrototypePte + ((Address>>PAGE_SHIFT) - Vad->StartingVpn); + DPRINT1("%x\n", Address); + PointerPte->u.Flush.Dirty=0; + } + + StartingAddress=(Vad->EndingVpn+1)*PAGE_SIZE; + if (StartingAddress>=EndingAddress) + break; + }else + { + + break; + } + } + *URegionSize=(ULONG_PTR)PAGE_ROUND_DOWN(PBaseAddress)-StartingAddress; + */ + *URegionSize=EndingAddress-StartingAddress; + return STATUS_SUCCESS; + } + // // Check if the caller is reserving memory, or committing memory and letting // us pick the base address Index: ntoskrnl/mm/marea.c =================================================================== --- ntoskrnl/mm/marea.c (revision 57181) +++ ntoskrnl/mm/marea.c (working copy) @@ -442,7 +442,8 @@ if (Depth == 22) { MmRebalanceTree(AddressSpace); - PreviousNode = Node->Parent; + Node = (PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink; + PreviousNode = NULL; } } }