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
Show replies by date