- Fix MiSyncThreadProcessViews. Should fix bug 3658. Based on Stefan Ginsberg's patch.
authorAleksey Bragin <aleksey@reactos.org>
Fri, 15 Aug 2008 12:17:08 +0000 (12:17 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Fri, 15 Aug 2008 12:17:08 +0000 (12:17 +0000)
See issue #3658 for more details.

svn path=/trunk/; revision=35352

reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/ke/i386/ctxswitch.S
reactos/ntoskrnl/ke/procobj.c
reactos/ntoskrnl/ke/thrdobj.c
reactos/ntoskrnl/ke/thrdschd.c
reactos/ntoskrnl/mm/mm.c

index 5021351..fd9854b 100644 (file)
@@ -1556,7 +1556,8 @@ MmCheckSystemImage(
 VOID
 FASTCALL
 MiSyncThreadProcessViews(
-    IN PKTHREAD NextThread
+    IN PKTHREAD NextThread,
+    IN PEPROCESS Process
 );
 
 extern PMM_AVL_TABLE MmKernelAddressSpace;
index 3cff2d2..dbbebd6 100644 (file)
@@ -738,7 +738,8 @@ CheckNext:
 SwapContext:
     /* ReactOS Mm Hack */
     mov ecx, esi
-    call @MiSyncThreadProcessViews@4
+    mov edx, [edi+KTHREAD_APCSTATE_PROCESS]
+    call @MiSyncThreadProcessViews@8
 
     /* Swap context at APC_LEVEL */
     mov ecx, APC_LEVEL
index e456824..242dc28 100644 (file)
@@ -448,7 +448,7 @@ KeAttachProcess(IN PKPROCESS Process)
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
-    MiSyncThreadProcessViews(Thread);
+    MiSyncThreadProcessViews(Thread, (PEPROCESS)Process);
 
     /* Check if we're already in that process */
     if (Thread->ApcState.Process == Process) return;
@@ -574,7 +574,7 @@ KeStackAttachProcess(IN PKPROCESS Process,
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
-    MiSyncThreadProcessViews(Thread);
+    MiSyncThreadProcessViews(Thread, (PEPROCESS)Process);
 
     /* Crash system if DPC is being executed! */
     if (KeIsExecutingDpc())
index dccfe9c..14520eb 100644 (file)
@@ -811,7 +811,7 @@ KeInitThread(IN OUT PKTHREAD Thread,
     Thread->KernelStackResident = TRUE;
 
     /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
-    MiSyncThreadProcessViews(Thread);
+    MiSyncThreadProcessViews(Thread, (PEPROCESS)Process);
 
     /* Enter SEH to avoid crashes due to user mode */
     Status = STATUS_SUCCESS;
index 15a2d9f..04db88d 100644 (file)
@@ -344,7 +344,7 @@ KiSwapThread(IN PKTHREAD CurrentThread,
     WaitIrql = CurrentThread->WaitIrql;
 
     /* REACTOS Mm Hack of Doom */
-    MiSyncThreadProcessViews(NextThread);
+    MiSyncThreadProcessViews(NextThread, PsGetCurrentProcess());
 
     /* Swap contexts */
     ApcState = KiSwapContext(CurrentThread, NextThread);
@@ -714,7 +714,7 @@ NtYieldExecution(VOID)
             ASSERT(OldIrql <= DISPATCH_LEVEL);
 
             /* REACTOS Mm Hack of Doom */
-            MiSyncThreadProcessViews(NextThread);
+            MiSyncThreadProcessViews(NextThread, PsGetCurrentProcess());
 
             /* Swap to new thread */
             KiSwapContext(Thread, NextThread);
index 82e9d0d..0b98534 100644 (file)
@@ -26,12 +26,12 @@ MM_STATS MmStats;
 
 VOID
 FASTCALL
-MiSyncThreadProcessViews(IN PKTHREAD NextThread)
+MiSyncThreadProcessViews(IN PKTHREAD NextThread,
+                         IN PEPROCESS Process)
 {
-    PVOID Process = PsGetCurrentProcess();
     PETHREAD Thread = CONTAINING_RECORD(NextThread, ETHREAD, Tcb);
 
-    /* Hack Sync because Mm is broken  */
+    /* Hack Sync because Mm is broken */
     MmUpdatePageDir(Process, Thread, sizeof(ETHREAD));
     MmUpdatePageDir(Process, Thread->ThreadsProcess, sizeof(EPROCESS));
     MmUpdatePageDir(Process,