- Implement (although non-optimally) MmGrowKernelStack for future use. Modified: trunk/reactos/ntoskrnl/mm/process.c _____
Modified: trunk/reactos/ntoskrnl/mm/process.c --- trunk/reactos/ntoskrnl/mm/process.c 2006-01-11 06:01:54 UTC (rev 20781) +++ trunk/reactos/ntoskrnl/mm/process.c 2006-01-11 06:40:41 UTC (rev 20782) @@ -166,7 +166,11 @@
KEBUGCHECK(0); }
- /* Mark the Stack in use */ + /* + * Mark the Stack in use. + * Note: Currently we mark all 60KB in use for a GUI Thread. + * We should only do this inside MmGrowKernelStack. TODO! + */ for (i = 0; i < (StackSize / PAGE_SIZE); i++) { Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Page[i]); @@ -197,9 +201,24 @@ STDCALL MmGrowKernelStack(PVOID StackPointer) { - DPRINT1("We don't support expansion yet :(\n"); - KEBUGCHECK(0); - return STATUS_NOT_IMPLEMENTED; + PETHREAD Thread = PsGetCurrentThread(); + + /* Make sure we have reserved space for our grow */ + ASSERT(((PCHAR)Thread->Tcb.StackBase - (PCHAR)Thread->Tcb.StackLimit) <= + (KERNEL_LARGE_STACK_SIZE + PAGE_SIZE)); + + /* + * We'll give you three more pages. + * NOTE: See note in MmCreateKernelStack. These pages are already being reserved. + * It would be more efficient to only grow them (commit them) here. + */ + Thread->Tcb.StackLimit -= KERNEL_STACK_SIZE; + + /* Return success */ + DPRINT1("Thread, Thread Limit, Stack %p %p %p\n", KeGetCurrentThread(), + KeGetCurrentThread()->StackLimit, + StackPointer); + return STATUS_SUCCESS; }
NTSTATUS