Make GetProcessWindowStation work for CSRSS
Modified: trunk/reactos/subsys/win32k/ntuser/winsta.c
Modified: trunk/reactos/w32api/include/winuser.h

Modified: trunk/reactos/subsys/win32k/ntuser/winsta.c
--- trunk/reactos/subsys/win32k/ntuser/winsta.c	2005-11-30 22:44:41 UTC (rev 19789)
+++ trunk/reactos/subsys/win32k/ntuser/winsta.c	2005-11-30 23:24:19 UTC (rev 19790)
@@ -915,17 +915,31 @@
 HWINSTA FASTCALL
 UserGetProcessWindowStation(VOID)
 {
+   NTSTATUS Status;
+   HWINSTA WinSta;
+
    if(PsGetCurrentProcess() != CsrProcess)
    {
       return PsGetCurrentProcess()->Win32WindowStation;
    }
    else
    {
-      /* FIXME - get the pointer to the window station by querying the parent of
-                 the desktop of the calling thread (which is a window station),
-                 then use ObFindHandleForObject() to find a suitable handle */
-      DPRINT1("CSRSS called NtUserGetProcessWindowStation()!!! returned NULL!\n");
-      return NULL;
+      DPRINT1("Should use ObFindHandleForObject\n");
+      Status = ObOpenObjectByPointer(PsGetWin32Thread()->Desktop->WindowStation,
+                                     0,
+                                     NULL,
+                                     WINSTA_ALL_ACCESS,
+                                     ExWindowStationObjectType,
+                                     UserMode,
+                                     (PHANDLE) &WinSta);
+      if (! NT_SUCCESS(Status))
+      {
+         SetLastNtError(Status);
+         DPRINT1("Unable to open handle for CSRSSs winsta, status 0x%08x\n",
+                 Status);
+         return NULL;
+      }
+      return WinSta;
    }
 }
 

Modified: trunk/reactos/w32api/include/winuser.h
--- trunk/reactos/w32api/include/winuser.h	2005-11-30 22:44:41 UTC (rev 19789)
+++ trunk/reactos/w32api/include/winuser.h	2005-11-30 23:24:19 UTC (rev 19790)
@@ -380,6 +380,7 @@
 #define WINSTA_READATTRIBUTES	2
 #define WINSTA_READSCREEN	512
 #define WINSTA_WRITEATTRIBUTES	16
+#define WINSTA_ALL_ACCESS       895
 #define DDL_READWRITE	0
 #define DDL_READONLY	1
 #define DDL_HIDDEN	2