Hi,

This code changes Windows behavior.

Best regards,
Alex Ionescu

On Sat, Oct 4, 2014 at 1:25 PM, <jgardou@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;