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