[win32k]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Fri, 29 Apr 2011 17:50:30 +0000 (17:50 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Fri, 29 Apr 2011 17:50:30 +0000 (17:50 +0000)
- UserSetProcessWindowStation: Use PsGetProcessWin32WindowStation and PsSetProcessWindowStation. Close the prevoious window station handle only when the window station was not set by UserSetProcessWindowStation (should be the case for console apps)

svn path=/trunk/; revision=51496

reactos/include/ndk/psfuncs.h
reactos/subsystems/win32/win32k/ntuser/winsta.c

index 4b0a96f..19c6678 100644 (file)
@@ -78,6 +78,21 @@ PsGetThreadWin32Thread(
     PETHREAD Thread
 );
 
     PETHREAD Thread
 );
 
+NTKERNELAPI
+PVOID
+NTAPI
+PsGetProcessWin32WindowStation(
+    PEPROCESS Process
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsSetProcessWindowStation(
+    PEPROCESS Process,
+    PVOID WindowStation
+);
+
 NTKERNELAPI
 PTEB
 NTAPI
 NTKERNELAPI
 PTEB
 NTAPI
index 2d5d387..1015029 100644 (file)
@@ -940,6 +940,7 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
 
     ppi = PsGetCurrentProcessWin32Process();
 
 
     ppi = PsGetCurrentProcessWin32Process();
 
+    /* Reference the new window station */
     if(hWindowStation !=NULL)
     {
         Status = IntValidateWindowStationHandle( hWindowStation,
     if(hWindowStation !=NULL)
     {
         Status = IntValidateWindowStationHandle( hWindowStation,
@@ -956,28 +957,29 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
     }
 
    OldWinSta = ppi->prpwinsta;
     }
 
    OldWinSta = ppi->prpwinsta;
-   hwinstaOld = ppi->hwinsta;
-
-   /*
-    * FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects
-    */
-
-   InterlockedExchangePointer(&PsGetCurrentProcess()->Win32WindowStation, hWindowStation);
-
-   ppi->prpwinsta = NewWinSta;
-   ppi->hwinsta = hWindowStation;
-
+   hwinstaOld = PsGetProcessWin32WindowStation(ppi->peProcess);
 
 
+   /* Dereference the previous window station */
    if(OldWinSta != NULL)
    {
        ObDereferenceObject(OldWinSta);
    }
 
    if(OldWinSta != NULL)
    {
        ObDereferenceObject(OldWinSta);
    }
 
-   if(hwinstaOld != NULL)
+   /* Check if we have a stale handle (it should happen for console apps) */
+   if(hwinstaOld != ppi->hwinsta)
    {
        ObCloseHandle(hwinstaOld, UserMode);
    }
 
    {
        ObCloseHandle(hwinstaOld, UserMode);
    }
 
+   /*
+    * FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects
+    */
+   
+   PsSetProcessWindowStation(ppi->peProcess, hWindowStation);
+
+   ppi->prpwinsta = NewWinSta;
+   ppi->hwinsta = hWindowStation;
+
    return TRUE;
 }
 
    return TRUE;
 }