[SHELL32][SDK] Implement SHOpenEffectiveToken and SHGetUserSessionId (#5713)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Thu, 21 Sep 2023 13:44:20 +0000 (22:44 +0900)
committerGitHub <noreply@github.com>
Thu, 21 Sep 2023 13:44:20 +0000 (22:44 +0900)
- Implement SHOpenEffectiveToken and
  SHGetUserSessionId functions.
- Add them to <undocshell.h>.

dll/win32/shell32/stubs.cpp
dll/win32/shell32/utils.cpp
sdk/include/reactos/undocshell.h

index a048e2c..ae4ce67 100644 (file)
@@ -1099,17 +1099,6 @@ SHSetUserPicturePathW(LPCWSTR lpPath, int csidl, LPVOID lpUnknown)
     return E_FAIL;
 }
 
-/*
- * Unimplemented
- */
-EXTERN_C BOOL
-WINAPI
-SHOpenEffectiveToken(LPVOID Token)
-{
-    FIXME("SHOpenEffectiveToken() stub\n");
-    return FALSE;
-}
-
 /*
  * Unimplemented
  */
@@ -1178,17 +1167,6 @@ SHGetProcessDword(DWORD dwUnknown1, DWORD dwUnknown2)
     return 0;
 }
 
-/*
- * Unimplemented
- */
-EXTERN_C LPVOID
-WINAPI
-SHGetUserSessionId(HANDLE hHandle)
-{
-    FIXME("SHGetUserSessionId() stub\n");
-    return NULL;
-}
-
 EXTERN_C
 DWORD WINAPI CheckStagingArea(VOID)
 {
index edb1f64..537f23a 100644 (file)
@@ -9,6 +9,59 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
+static BOOL OpenEffectiveToken(DWORD DesiredAccess, HANDLE *phToken)
+{
+    BOOL ret;
+
+    if (phToken == NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    *phToken = NULL;
+
+    ret = OpenThreadToken(GetCurrentThread(), DesiredAccess, FALSE, phToken);
+    if (!ret && GetLastError() == ERROR_NO_TOKEN)
+        ret = OpenProcessToken(GetCurrentProcess(), DesiredAccess, phToken);
+
+    return ret;
+}
+
+/*************************************************************************
+ *                SHOpenEffectiveToken (SHELL32.235)
+ */
+EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
+{
+    TRACE("%p\n", phToken);
+    return OpenEffectiveToken(TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, phToken);
+}
+
+/*************************************************************************
+ *                SHGetUserSessionId (SHELL32.248)
+ */
+EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
+{
+    DWORD dwSessionId, dwLength;
+    BOOL bOpenToken = FALSE;
+
+    TRACE("%p\n", hToken);
+
+    if (!hToken)
+        bOpenToken = SHOpenEffectiveToken(&hToken);
+
+    if (!hToken ||
+        !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
+    {
+        dwSessionId = 0;
+    }
+
+    if (bOpenToken)
+        CloseHandle(hToken);
+
+    return dwSessionId;
+}
+
 /*************************************************************************
  *                SHGetShellStyleHInstance (SHELL32.749)
  */
index 93fc420..9c74f8d 100644 (file)
@@ -684,6 +684,9 @@ LargeIntegerToString(
     _In_opt_ const NUMBERFMTW *pNumberFormat,
     _In_ DWORD dwNumberFlags);
 
+BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken);
+DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken);
+
 /*****************************************************************************
  * Shell32 resources
  */