Finally...

Best regards,
Alex Ionescu

On Mon, Feb 16, 2015 at 1:12 PM, <[email protected]> wrote:

> Author: jgardou
> Date: Mon Feb 16 21:12:51 2015
> New Revision: 66323
>
> URL: http://svn.reactos.org/svn/reactos?rev=66323&view=rev
> Log:
> [KERNEL32]
>  Revert r64525 - Always allocate a guard page at the bottom of the stack.
>
> Modified:
>     trunk/reactos/dll/win32/kernel32/client/utils.c
>
> Modified: trunk/reactos/dll/win32/kernel32/client/utils.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/utils.c?rev=66323&r1=66322&r2=66323&view=diff
>
> ==============================================================================
> --- trunk/reactos/dll/win32/kernel32/client/utils.c     [iso-8859-1]
> (original)
> +++ trunk/reactos/dll/win32/kernel32/client/utils.c     [iso-8859-1] Mon
> Feb 16 21:12:51 2015
> @@ -358,6 +358,7 @@
>      NTSTATUS Status;
>      PIMAGE_NT_HEADERS Headers;
>      ULONG_PTR Stack;
> +    BOOLEAN UseGuard;
>      ULONG PageSize, Dummy, AllocationGranularity;
>      SIZE_T StackReserveHeader, StackCommitHeader, GuardPageSize,
> GuaranteedStackCommit;
>      DPRINT("BaseCreateStack (hProcess: %p, Max: %lx, Current: %lx)\n",
> @@ -425,6 +426,18 @@
>      /* Update the Stack Position */
>      Stack += StackReserve - StackCommit;
>
> +    /* Check if we will need a guard page */
> +    if (StackReserve > StackCommit)
> +    {
> +        Stack -= PageSize;
> +        StackCommit += PageSize;
> +        UseGuard = TRUE;
> +    }
> +    else
> +    {
> +        UseGuard = FALSE;
> +    }
> +
>      /* Allocate memory for the stack */
>      Status = NtAllocateVirtualMemory(hProcess,
>                                       (PVOID*)&Stack,
> @@ -444,21 +457,25 @@
>      InitialTeb->StackLimit = (PVOID)Stack;
>
>      /* Create a guard page */
> -    GuardPageSize = PageSize;
> -    Status = NtProtectVirtualMemory(hProcess,
> -                                    (PVOID*)&Stack,
> -                                    &GuardPageSize,
> -                                    PAGE_GUARD | PAGE_READWRITE,
> -                                    &Dummy);
> -    if (!NT_SUCCESS(Status))
> -    {
> -        DPRINT1("Failure to set guard page\n");
> -        return Status;
> -    }
> -
> -    /* Update the Stack Limit keeping in mind the Guard Page */
> -    InitialTeb->StackLimit = (PVOID)((ULONG_PTR)InitialTeb->StackLimit +
> -                                     GuardPageSize);
> +    if (UseGuard)
> +    {
> +        /* Set the guard page */
> +        GuardPageSize = PAGE_SIZE;
> +        Status = NtProtectVirtualMemory(hProcess,
> +                                        (PVOID*)&Stack,
> +                                        &GuardPageSize,
> +                                        PAGE_GUARD | PAGE_READWRITE,
> +                                        &Dummy);
> +        if (!NT_SUCCESS(Status))
> +        {
> +            DPRINT1("Failure to set guard page\n");
> +            return Status;
> +        }
> +
> +        /* Update the Stack Limit keeping in mind the Guard Page */
> +        InitialTeb->StackLimit =
> (PVOID)((ULONG_PTR)InitialTeb->StackLimit +
> +                                         GuardPageSize);
> +    }
>
>      /* We are done! */
>      return STATUS_SUCCESS;
>
>
>
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to