Hi,
This code changes Windows behavior.
Best regards,
Alex Ionescu
On Sat, Oct 4, 2014 at 1:25 PM, <jgardou(a)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/…
==============================================================================
--- 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;