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/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;