Finally...

Best regards,
Alex Ionescu

On Mon, Feb 16, 2015 at 1:12 PM, <jgardou@svn.reactos.org> 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;