return E_FAIL;
}
-/*
- * Unimplemented
- */
-EXTERN_C BOOL
-WINAPI
-SHOpenEffectiveToken(LPVOID Token)
-{
- FIXME("SHOpenEffectiveToken() stub\n");
- return FALSE;
-}
-
/*
* Unimplemented
*/
return 0;
}
-/*
- * Unimplemented
- */
-EXTERN_C LPVOID
-WINAPI
-SHGetUserSessionId(HANDLE hHandle)
-{
- FIXME("SHGetUserSessionId() stub\n");
- return NULL;
-}
-
EXTERN_C
DWORD WINAPI CheckStagingArea(VOID)
{
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)
*/
_In_opt_ const NUMBERFMTW *pNumberFormat,
_In_ DWORD dwNumberFlags);
+BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken);
+DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken);
+
/*****************************************************************************
* Shell32 resources
*/