[ros-dev] [ros-diffs] [jgardou] 64525: [KERNEL32] - Always allocate a guard page at the bottom of the stack. It doesn't depend on it being reserved or committed, it just has to be here.
Alex Ionescu
ionucu at videotron.ca
Mon Oct 6 15:25:36 UTC 2014
Hi,
This code changes Windows behavior.
Best regards,
Alex Ionescu
On Sat, Oct 4, 2014 at 1:25 PM, <jgardou at svn.reactos.org> wrote:
> Author: jgardou
> Date: Sat Oct 4 20:25:35 2014
> New Revision: 64525
>
> URL: http://svn.reactos.org/svn/reactos?rev=64525&view=rev
> Log:
> [KERNEL32]
> - Always allocate a guard page at the bottom of the stack.
> It doesn't depend on it being reserved or committed, it just has to be
> here.
>
> 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=64525&r1=64524&r2=64525&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] Sat
> Oct 4 20:25:35 2014
> @@ -358,7 +358,6 @@
> 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",
> @@ -426,18 +425,6 @@
> /* 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,
> @@ -457,25 +444,21 @@
> InitialTeb->StackLimit = (PVOID)Stack;
>
> /* Create a guard page */
> - 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);
> - }
> + 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);
>
> /* We are done! */
> return STATUS_SUCCESS;
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20141006/09982e28/attachment.html>
More information about the Ros-dev
mailing list