Finally... Best regards, Alex Ionescu
On Mon, Feb 16, 2015 at 1:12 PM, <[email protected]> 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/utils.c?rev=66323&r1=66322&r2=66323&view=diff > > ============================================================================== > --- 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; > > >
_______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
