<html>
<head>
<style>
<!--
body { background-color:#ffffff }
.file { border:1px solid #eeeeee; margin-top:1em; margin-bottom:1em }
.pathname { font-family:monospace; float:right }
.fileheader { margin-bottom:.5em }
.diff { margin:0 }
.tasklist { padding:4px; border:1px dashed #000000; margin-top:1em }
.tasklist ul { margin-top:0; margin-bottom:0 }
tr.alt { background-color:#eeeeee }
#added { background-color:#ddffdd }
#addedchars { background-color:#99ff99; font-weight:bolder }
tr.alt #added { background-color:#ccf7cc }
#removed { background-color:#ffdddd }
#removedchars { background-color:#ff9999; font-weight:bolder }
tr.alt #removed { background-color:#f7cccc }
#info { color:#888888 }
#context { background-color:#eeeeee }
td {padding-left:.3em; padding-right:.3em }
tr.head { border-bottom-width:1px; border-bottom-style:solid }
tr.head td { padding:0; padding-top:.2em }
.task { background-color:#ffff00 }
.comment { padding:4px; border:1px dashed #000000; background-color:#ffffdd }
.error { color:red }
hr { border-width:0px; height:2px; background:black }
-->
</style>
</head>
<body>
<pre class="comment">- Remove KiServiceCheck and implement PsConvertToGuiThread in its place. Has support for detecting and returning errors in case of invalid cases, currently disabled code for doing the required 4kb->12kb stack conversion, and handling certain failures.</pre><pre class="diff" id="context">Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
Modified: trunk/reactos/ntoskrnl/ps/win32.c
</pre><hr /><div class="file">
<div class="fileheader"><big><b>Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S</b></big></div>
<pre class="diff"><small id="info">--- trunk/reactos/ntoskrnl/ke/i386/syscall.S        2006-01-11 05:24:40 UTC (rev 20778)
+++ trunk/reactos/ntoskrnl/ke/i386/syscall.S        2006-01-11 05:42:32 UTC (rev 20779)
@@ -614,7 +614,7 @@
</small></pre><pre class="diff" id="context"> /* Set up Win32K Table */
push edx
push ebx
</pre><pre class="diff" id="removed">- call _<span id="removedchars">KiServiceCheck</span>@0
</pre><pre class="diff" id="added">+ call _<span id="addedchars">PsConvertToGuiThread</span>@0
</pre><pre class="diff" id="context">
/* FIXME: Handle failure */
pop eax
</pre></div>
<hr /><div class="file">
<div class="fileheader"><big><b>Modified: trunk/reactos/ntoskrnl/ke/kthread.c</b></big></div>
<pre class="diff"><small id="info">--- trunk/reactos/ntoskrnl/ke/kthread.c        2006-01-11 05:24:40 UTC (rev 20778)
+++ trunk/reactos/ntoskrnl/ke/kthread.c        2006-01-11 05:42:32 UTC (rev 20779)
@@ -1466,21 +1466,6 @@
</small></pre><pre class="diff" id="context"> return OldState;
}
</pre><pre class="diff" id="removed">-VOID
-NTAPI
-KiServiceCheck(VOID)
-{
- PKTHREAD Thread = KeGetCurrentThread();
-
- /* Check if we need to inialize Win32 for this Thread */
- if (Thread->ServiceTable != KeServiceDescriptorTableShadow) {
-
- /* We do. Initialize it and save the new table */
- Thread->ServiceTable = KeServiceDescriptorTableShadow;
- PsInitWin32Thread((PETHREAD)Thread);
- }
-}
-
</pre><pre class="diff" id="context"> /*
*
* NOT EXPORTED
</pre></div>
<hr /><div class="file">
<div class="fileheader"><big><b>Modified: trunk/reactos/ntoskrnl/ps/win32.c</b></big></div>
<pre class="diff"><small id="info">--- trunk/reactos/ntoskrnl/ps/win32.c        2006-01-11 05:24:40 UTC (rev 20778)
+++ trunk/reactos/ntoskrnl/ps/win32.c        2006-01-11 05:42:32 UTC (rev 20779)
@@ -41,6 +41,13 @@
</small></pre><pre class="diff" id="context"> } NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE;
#endif
</pre><pre class="diff" id="added">+PVOID
+STDCALL
+KeSwitchKernelStack(
+ IN PVOID StackBase,
+ IN PVOID StackLimit
+);
+
</pre><pre class="diff" id="context"> /* FUNCTIONS ***************************************************************/
/*
@@ -62,33 +69,105 @@
</pre><pre class="diff" id="context">
NTSTATUS
NTAPI
</pre><pre class="diff" id="removed">-Ps<span id="removedchars">InitWin32Thread (PETHREAD Thread</span>)
</pre><pre class="diff" id="added">+Ps<span id="addedchars">ConvertToGuiThread(VOID</span>)
</pre><pre class="diff" id="context"> {
</pre><pre class="diff" id="removed">- PEPROCESS Process;
- <span id="removedchars">NTSTATUS Status = STATUS_SUCCESS</span>;
</pre><pre class="diff" id="added">+ <span id="addedchars">//PVOID NewStack, OldStack</span>;
+ PETHREAD Thread = PsGetCurrentThread();
+ PEPROCESS Process = PsGetCurrentProcess();
+ NTSTATUS Status;
+ PAGED_CODE();
</pre><pre class="diff" id="context">
</pre><pre class="diff" id="removed">- <span id="removedchars">Process = Thread->ThreadsProcess;</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">/* Validate the previous mode */</span>
+ if (KeGetPreviousMode() == KernelMode)
+ {
+ DPRINT1("Danger: win32k call being made in kernel-mode?!\n");
+ return STATUS_INVALID_PARAMETER;
+ }
</pre><pre class="diff" id="context">
</pre><pre class="diff" id="removed">- <span id="removedchars">if (Process->Win32Process == NULL)</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">/* Make sure win32k is here */</span>
+ if (!PspWin32ProcessCallback)
</pre><pre class="diff" id="context"> {
</pre><pre class="diff" id="removed">- <span id="removedchars">if (PspWin32ProcessCallback != NULL)</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">DPRINT1("Danger: Win32K call attempted but Win32k not ready!\n");</span>
+ return STATUS_ACCESS_DENIED;
+ }
+
+ /* Make sure it's not already win32 */
+ if (Thread->Tcb.ServiceTable != KeServiceDescriptorTable)
+ {
+ DPRINT1("Danger: Thread is already a win32 thread. Limit bypassed?\n");
+ return STATUS_ALREADY_WIN32;
+ }
+
+ /* Check if we don't already have a kernel-mode stack */
+#if 0
+ if (!Thread->Tcb.LargeStack)
+ {
+ /* We don't create one */
+ DPRINT1("Creating large stack\n");
+ NewStack = MmCreateKernelStack(TRUE);
+ if (!NewStack)
</pre><pre class="diff" id="context"> {
</pre><pre class="diff" id="removed">- <span id="removedchars">Status = PspWin32ProcessCallback(Process, TRUE);</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">/* Panic in user-mode */</span>
+ NtCurrentTeb()->LastErrorValue = ERROR_NOT_ENOUGH_MEMORY;
+ return STATUS_NO_MEMORY;
</pre><pre class="diff" id="context"> }
</pre><pre class="diff" id="added">+
+ /* We're about to switch stacks. Enter a critical region */
+ KeEnterCriticalRegion();
+
+ /* Switch stacks */
+ DPRINT1("Switching stacks. NS IT, SL, SB, KS %p %p %p %p %p\n",
+ NewStack,
+ Thread->Tcb.InitialStack,
+ Thread->Tcb.StackLimit,
+ Thread->Tcb.StackBase,
+ Thread->Tcb.KernelStack);
+ OldStack = KeSwitchKernelStack((PVOID)((ULONG_PTR)NewStack + 0x3000),
+ NewStack);
+
+ /* Leave the critical region */
+ KeLeaveCriticalRegion();
+ DPRINT1("We made it!\n");
+
+ /* Delete the old stack */
+ //MmDeleteKernelStack(OldStack, FALSE);
+ DPRINT1("Old stack deleted. IT, SL, SB, KS %p %p %p %p\n",
+ Thread->Tcb.InitialStack,
+ Thread->Tcb.StackLimit,
+ Thread->Tcb.StackBase,
+ Thread->Tcb.KernelStack);
</pre><pre class="diff" id="context"> }
</pre><pre class="diff" id="added">+#endif
</pre><pre class="diff" id="context">
</pre><pre class="diff" id="removed">- <span id="removedchars">if (Thread->Tcb.Win32Thread == NULL)</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">/* This check is bizare. Check out win32k later */</span>
+ if (!Process->Win32Process)
</pre><pre class="diff" id="context"> {
</pre><pre class="diff" id="removed">- <span id="removedchars">if (PspWin32ThreadCallback != NULL)</span>
</pre><pre class="diff" id="added">+ <span id="addedchars">/* Now tell win32k about us */</span>
+ Status = PspWin32ProcessCallback(Process, TRUE);
+ if (!NT_SUCCESS(Status))
</pre><pre class="diff" id="context"> {
</pre><pre class="diff" id="removed">- <span id="removedchars">Status = PspWin32ThreadCallback(Thread, TRUE</span>);
</pre><pre class="diff" id="added">+ <span id="addedchars">DPRINT1("Danger: Win32k wasn't happy about us!\n"</span>);
+ return Status;
</pre><pre class="diff" id="context"> }
}
</pre><pre class="diff" id="added">+ /* Set the new service table */
+ Thread->Tcb.ServiceTable = KeServiceDescriptorTableShadow;
+ ASSERT(Thread->Tcb.Win32Thread == 0);
+
+ /* Tell Win32k about our thread */
+ Status = PspWin32ThreadCallback(Thread, TRUE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Revert our table */
+ DPRINT1("Danger: Win32k wasn't happy about us!\n");
+ Thread->Tcb.ServiceTable = KeServiceDescriptorTable;
+ }
+
+ /* Return status */
</pre><pre class="diff" id="context"> return Status;
}
</pre><pre class="diff" id="removed">-
</pre><pre class="diff" id="context"> VOID
NTAPI
PsTerminateWin32Process (PEPROCESS Process)
@@ -122,72 +201,6 @@
</pre><pre class="diff" id="context"> }
}
</pre><pre class="diff" id="removed">-VOID
-STDCALL
-DumpEspData(ULONG Esp, ULONG ThLimit, ULONG ThStack, ULONG PcrLimit, ULONG PcrStack, ULONG Esp0)
-{
- DPRINT1("Current Esp: %p\n Thread Stack Limit: %p\n Thread Stack: %p\n Pcr Limit: %p, Pcr Stack: %p\n Esp0 :%p\n",Esp, ThLimit, ThStack, PcrLimit, PcrStack, Esp0) ;
-}
-
- PVOID
-STDCALL
- PsAllocateCallbackStack(ULONG StackSize)
- {
- PVOID KernelStack = NULL;
- NTSTATUS Status;
- PMEMORY_AREA StackArea;
- ULONG i, j;
- PHYSICAL_ADDRESS BoundaryAddressMultiple;
- PPFN_TYPE Pages = alloca(sizeof(PFN_TYPE) * (StackSize /PAGE_SIZE));
-
- DPRINT1("PsAllocateCallbackStack\n");
- BoundaryAddressMultiple.QuadPart = 0;
- StackSize = PAGE_ROUND_UP(StackSize);
- MmLockAddressSpace(MmGetKernelAddressSpace());
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_KERNEL_STACK,
- &KernelStack,
- StackSize,
- PAGE_READWRITE,
- &StackArea,
- FALSE,
- 0,
- BoundaryAddressMultiple);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to create thread stack\n");
- return(NULL);
- }
- for (i = 0; i < (StackSize / PAGE_SIZE); i++)
- {
- Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Pages[i]);
- if (!NT_SUCCESS(Status))
- {
- for (j = 0; j < i; j++)
- {
- MmReleasePageMemoryConsumer(MC_NPPOOL, Pages[j]);
- }
- return(NULL);
- }
- }
- Status = MmCreateVirtualMapping(NULL,
- KernelStack,
- PAGE_READWRITE,
- Pages,
- StackSize / PAGE_SIZE);
- if (!NT_SUCCESS(Status))
- {
- for (i = 0; i < (StackSize / PAGE_SIZE); i++)
- {
- MmReleasePageMemoryConsumer(MC_NPPOOL, Pages[i]);
- }
- return(NULL);
- }
- DPRINT1("PsAllocateCallbackStack %x\n", KernelStack);
- return(KernelStack);
-}
-
</pre><pre class="diff" id="context"> NTSTATUS
STDCALL
NtW32Call(IN ULONG RoutineIndex,
</pre>
</div>
</body>
</html>