- 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