[CMAKE]
[reactos.git] / subsystems / win32 / win32k / ntuser / desktop.c
index 91b5a53..138b322 100644 (file)
@@ -1835,7 +1835,6 @@ IntUnmapDesktopView(IN PDESKTOP DesktopObject)
 static NTSTATUS
 IntMapDesktopView(IN PDESKTOP DesktopObject)
 {
-    PTHREADINFO ti;
     PPROCESSINFO CurrentWin32Process;
     PW32HEAP_USER_MAPPING HeapMapping, *PrevLink;
     PVOID UserBase = NULL;
@@ -1898,19 +1897,6 @@ IntMapDesktopView(IN PDESKTOP DesktopObject)
 
     ObReferenceObject(DesktopObject);
 
-    /* create a W32THREADINFO structure if not already done, or update it */
-    ti = GetW32ThreadInfo();
-    GetWin32ClientInfo()->ulClientDelta = DesktopHeapGetUserDelta();
-    if (ti != NULL)
-    {
-        if (GetWin32ClientInfo()->pDeskInfo == NULL)
-        {
-           GetWin32ClientInfo()->pDeskInfo = 
-                (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - 
-                                          GetWin32ClientInfo()->ulClientDelta);
-        }
-    }
-
     return STATUS_SUCCESS;
 }
 
@@ -1922,6 +1908,7 @@ IntSetThreadDesktop(IN PDESKTOP DesktopObject,
     PTHREADINFO W32Thread;
     NTSTATUS Status;
     BOOL MapHeap;
+    CLIENTTHREADINFO ctiSave;
 
     DPRINT("IntSetThreadDesktop() DO=%p, FOF=%d\n", DesktopObject, FreeOnFailure);
     MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess);
@@ -1948,9 +1935,27 @@ IntSetThreadDesktop(IN PDESKTOP DesktopObject,
                 SetLastNtError(Status);
                 return FALSE;
             }
+            W32Thread->pDeskInfo = DesktopObject->pDeskInfo;
+        }
+
+        RtlZeroMemory(&ctiSave, sizeof(CLIENTTHREADINFO));
+
+        if (W32Thread->pcti && OldDesktop)
+        {
+           RtlCopyMemory(&ctiSave, W32Thread->pcti, sizeof(CLIENTTHREADINFO));
+           DPRINT("Free ClientThreadInfo\n");
+           DesktopHeapFree(OldDesktop, W32Thread->pcti);
+           W32Thread->pcti = NULL;
+        }
+
+        if (!W32Thread->pcti && DesktopObject)
+        { 
+           DPRINT("Allocate ClientThreadInfo\n");
+           W32Thread->pcti = DesktopHeapAlloc( DesktopObject,
+                                               sizeof(CLIENTTHREADINFO));
+           RtlCopyMemory(W32Thread->pcti, &ctiSave, sizeof(CLIENTTHREADINFO));
         }
 
-        /* Hack for system threads */
         if (NtCurrentTeb())
         {
             PCLIENTINFO pci = GetWin32ClientInfo();
@@ -1958,6 +1963,7 @@ IntSetThreadDesktop(IN PDESKTOP DesktopObject,
             if (DesktopObject)
             {
                 pci->pDeskInfo = (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - pci->ulClientDelta);
+                if (W32Thread->pcti) pci->pClientThreadInfo = (PVOID)((ULONG_PTR)W32Thread->pcti - pci->ulClientDelta);
             }
         }