Make GetProcessWindowStation work for CSRSS
authorGé van Geldorp <ge@gse.nl>
Wed, 30 Nov 2005 23:24:19 +0000 (23:24 +0000)
committerGé van Geldorp <ge@gse.nl>
Wed, 30 Nov 2005 23:24:19 +0000 (23:24 +0000)
svn path=/trunk/; revision=19790

reactos/subsys/win32k/ntuser/winsta.c
reactos/w32api/include/winuser.h

index be08986..c8453ac 100644 (file)
@@ -915,17 +915,31 @@ NtUserSetObjectInformation(
 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;
    }
 }
 
index 6d2e6f3..6abeac1 100644 (file)
@@ -380,6 +380,7 @@ extern "C" {
 #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