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/u... ============================================================================== --- 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;