Already explained in the other mail.

Am 11.10.2014 18:38, schrieb Alex Ionescu:
> Why do you think PEB creation cannot fail in the first place?
>
> Best regards,
> Alex Ionescu
>
> On Tue, Oct 7, 2014 at 5:31 PM, <tkreu...@svn.reactos.org
> <mailto:tkreu...@svn.reactos.org>> wrote:
>
>     Author: tkreuzer
>     Date: Wed Oct  8 00:31:49 2014
>     New Revision: 64593
>
>     URL: http://svn.reactos.org/svn/reactos?rev=64593&view=rev
>     Log:
>     [NTOSKRNL]
>     Modify MiCreatePebOrTeb to use MiInsertVadEx instead of doing
>     everything "by hand". No, this does not "change Windows behavior".
>     The TEB creation works exactly as before, and the only difference
>     in the PEB creation is that if the first attempt fails, we will no
>     longer try again from the top of the address space. But since this
>     cannot fail in the first place, at least not due to the VA range
>     not being free, another attempt would be pointless anyway!
>
>     Modified:
>         trunk/reactos/ntoskrnl/mm/ARM3/procsup.c
>
>     Modified: trunk/reactos/ntoskrnl/mm/ARM3/procsup.c
>     URL:
>     
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/procsup.c?rev=64593&r1=64592&r2=64593&view=diff
>     
> ==============================================================================
>     --- trunk/reactos/ntoskrnl/mm/ARM3/procsup.c    [iso-8859-1]
>     (original)
>     +++ trunk/reactos/ntoskrnl/mm/ARM3/procsup.c    [iso-8859-1] Wed
>     Oct  8 00:31:49 2014
>     @@ -50,14 +50,11 @@
>                       IN ULONG Size,
>                       OUT PULONG_PTR BaseAddress)
>      {
>     -    PETHREAD Thread = PsGetCurrentThread();
>          PMMVAD_LONG Vad;
>          NTSTATUS Status;
>          ULONG_PTR HighestAddress, RandomBase;
>          ULONG AlignedSize;
>          LARGE_INTEGER CurrentTime;
>     -    TABLE_SEARCH_RESULT Result = TableFoundNode;
>     -    PMMADDRESS_NODE Parent;
>
>          /* Allocate a VAD */
>          Vad = ExAllocatePoolWithTag(NonPagedPool, sizeof(MMVAD_LONG),
>     'ldaV');
>     @@ -70,6 +67,7 @@
>          Vad->u.VadFlags.PrivateMemory = TRUE;
>          Vad->u.VadFlags.Protection = MM_READWRITE;
>          Vad->u.VadFlags.NoChange = TRUE;
>     +    Vad->u1.Parent = NULL;
>
>          /* Setup the secondary flags to make it a secured, writable,
>     long VAD */
>          Vad->u2.LongFlags2 = 0;
>     @@ -77,10 +75,11 @@
>          Vad->u2.VadFlags2.LongVad = TRUE;
>          Vad->u2.VadFlags2.ReadOnly = FALSE;
>
>     -    /* Lock the process address space */
>     -    KeAcquireGuardedMutex(&Process->AddressCreationLock);
>     +    Vad->ControlArea = NULL; // For Memory-Area hack
>     +    Vad->FirstPrototypePte = NULL;
>
>          /* Check if this is a PEB creation */
>     +    ASSERT(sizeof(TEB) != sizeof(PEB));
>          if (Size == sizeof(PEB))
>          {
>              /* Create a random value to select one page in a 64k
>     region */
>     @@ -100,68 +99,27 @@
>
>              /* Calculate the highest allowed address */
>              HighestAddress = RandomBase + AlignedSize - 1;
>     -
>     -        /* Try to find something below the random upper margin */
>     -        Result =
>     MiFindEmptyAddressRangeDownTree(ROUND_TO_PAGES(Size),
>     -                                                 HighestAddress,
>     -                                                 PAGE_SIZE,
>     -                                                 &Process->VadRoot,
>     -                                                 BaseAddress,
>     -                                                 &Parent);
>     -    }
>     -
>     -    /* Check for success. TableFoundNode means nothing free. */
>     -    if (Result == TableFoundNode)
>     -    {
>     -        /* For TEBs, or if a PEB location couldn't be found, scan
>     the VAD root */
>     -        Result =
>     MiFindEmptyAddressRangeDownTree(ROUND_TO_PAGES(Size),
>     -                                               
>      (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS,
>     -                                                 PAGE_SIZE,
>     -                                                 &Process->VadRoot,
>     -                                                 BaseAddress,
>     -                                                 &Parent);
>     -        /* Bail out, if still nothing free was found */
>     -        if (Result == TableFoundNode)
>     -        {
>     -            KeReleaseGuardedMutex(&Process->AddressCreationLock);
>     -            ExFreePoolWithTag(Vad, 'ldaV');
>     -            return STATUS_NO_MEMORY;
>     -        }
>     -    }
>     -
>     -    /* Validate that it came from the VAD ranges */
>     -    ASSERT(*BaseAddress >= (ULONG_PTR)MI_LOWEST_VAD_ADDRESS);
>     -
>     -    /* Build the rest of the VAD now */
>     -    Vad->StartingVpn = (*BaseAddress) >> PAGE_SHIFT;
>     -    Vad->EndingVpn = ((*BaseAddress) + Size - 1) >> PAGE_SHIFT;
>     -    Vad->u3.Secured.StartVpn = *BaseAddress;
>     -    Vad->u3.Secured.EndVpn = (Vad->EndingVpn << PAGE_SHIFT) |
>     (PAGE_SIZE - 1);
>     -    Vad->u1.Parent = NULL;
>     -
>     -    /* FIXME: Should setup VAD bitmap */
>     -    Status = STATUS_SUCCESS;
>     -
>     -    /* Pretend as if we own the working set */
>     -    MiLockProcessWorkingSetUnsafe(Process, Thread);
>     -
>     -    /* Insert the VAD */
>     -    ASSERT(Vad->EndingVpn >= Vad->StartingVpn);
>     -    Process->VadRoot.NodeHint = Vad;
>     -    Vad->ControlArea = NULL; // For Memory-Area hack
>     -    Vad->FirstPrototypePte = NULL;
>     -    DPRINT("VAD: %p\n", Vad);
>     -    DPRINT("Allocated PEB/TEB at: 0x%p for %16s\n", *BaseAddress,
>     Process->ImageFileName);
>     -    MiInsertNode(&Process->VadRoot, (PVOID)Vad, Parent, Result);
>     -
>     -    /* Release the working set */
>     -    MiUnlockProcessWorkingSetUnsafe(Process, Thread);
>     -
>     -    /* Release the address space lock */
>     -    KeReleaseGuardedMutex(&Process->AddressCreationLock);
>     -
>     -    /* Return the status */
>     -    return Status;
>     +    }
>     +    else
>     +    {
>     +        HighestAddress = (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS;
>     +    }
>     +
>     +    *BaseAddress = 0;
>     +    Status = MiInsertVadEx((PMMVAD)Vad,
>     +                           BaseAddress,
>     +                           BYTES_TO_PAGES(Size),
>     +                           HighestAddress,
>     +                           PAGE_SIZE,
>     +                           MEM_TOP_DOWN);
>     +    if (!NT_SUCCESS(Status))
>     +    {
>     +        ExFreePoolWithTag(Vad, 'ldaV');
>     +        return STATUS_NO_MEMORY;
>     +    }
>     +
>     +    /* Success */
>     +    return STATUS_SUCCESS;
>      }
>
>      VOID
>
>
>
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev@reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to