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