From a55d7c692ba0215e976630df88782c1ca20e792e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 22 Apr 2018 22:56:16 +0200 Subject: [PATCH] =?UTF-8?q?[WIN32K]=20Implement=20UOI=5FFLAGS=20in=20NtUse?= =?UTF-8?q?rGetObjectInformation().=20Based=20from=20a=20patch=20by=20J?= =?UTF-8?q?=C3=A9r=C3=B4me=20Gardou.=20CORE-13447=20CORE-14422?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes closing nLite 1.4.9.3 (.NET2) application, as well as any other program that expects that the interactive window station is reported as being visible. I thank Mark Jansen and Joachim Henze for help and testing. --- win32ss/user/ntuser/winsta.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/win32ss/user/ntuser/winsta.c b/win32ss/user/ntuser/winsta.c index 1187e440553..d9ca3ca9992 100644 --- a/win32ss/user/ntuser/winsta.c +++ b/win32ss/user/ntuser/winsta.c @@ -717,22 +717,49 @@ NtUserGetObjectInformation( goto Exit; } - TRACE("WinSta or Desktop opened!!\n"); + TRACE("WinSta or Desktop opened!\n"); /* Get data */ switch (nIndex) { case UOI_FLAGS: { - /* This is a default implementation that does almost nothing */ - ObjectFlags.fInherit = FALSE; + OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; + ULONG BytesWritten; + ObjectFlags.fReserved = FALSE; + + /* Check whether this handle is inheritable */ + Status = ZwQueryObject(hObject, + ObjectHandleFlagInformation, + &HandleInfo, + sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), + &BytesWritten); + if (!NT_SUCCESS(Status)) + { + ERR("ZwQueryObject failed, Status 0x%08lx\n", Status); + break; + } + ObjectFlags.fInherit = HandleInfo.Inherit; + ObjectFlags.dwFlags = 0; + if (WinStaObject != NULL) + { + if (!(WinStaObject->Flags & WSS_NOIO)) + ObjectFlags.dwFlags |= WSF_VISIBLE; + } + else if (DesktopObject != NULL) + { + FIXME("Setting DF_ALLOWOTHERACCOUNTHOOK is unimplemented.\n"); + } + else + { + ERR("No associated WinStaObject nor DesktopObject!\n"); + } pvData = &ObjectFlags; nDataSize = sizeof(ObjectFlags); Status = STATUS_SUCCESS; - ERR("UOI_FLAGS unimplemented!\n"); break; }