Finally...
Best regards,
Alex Ionescu
On Mon, Feb 16, 2015 at 1:12 PM, <jgardou(a)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/…
==============================================================================
--- 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;