[USERENV]
[reactos.git] / reactos / dll / win32 / userenv / misc.c
index 689f60f..1075b33 100644 (file)
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
- * FILE:            lib/userenv/misc.c
+ * FILE:            dll/win32/userenv/misc.c
  * PURPOSE:         User profile code
  * PROGRAMMER:      Eric Kohl
  */
 
-#include <precomp.h>
+#include "precomp.h"
 
 #define NDEBUG
 #include <debug.h>
@@ -36,88 +35,157 @@ static SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY};
 /* FUNCTIONS ***************************************************************/
 
 LPWSTR
-AppendBackslash (LPWSTR String)
+AppendBackslash(LPWSTR String)
 {
-  ULONG Length;
+    ULONG Length;
+
+    Length = lstrlenW(String);
+    if (String[Length - 1] != L'\\')
+    {
+        String[Length] = L'\\';
+        Length++;
+        String[Length] = (WCHAR)0;
+    }
+
+    return &String[Length];
+}
+
+
+BOOL
+GetUserSidFromToken(HANDLE hToken,
+                    PSID *Sid)
+{
+    PTOKEN_USER UserBuffer, nsb;
+    PSID pSid = NULL;
+    ULONG Length;
+    NTSTATUS Status;
+
+    Length = 256;
+    UserBuffer = LocalAlloc(LPTR, Length);
+    if (UserBuffer == NULL)
+    {
+        return FALSE;
+    }
+
+    Status = NtQueryInformationToken(hToken,
+                                     TokenUser,
+                                     (PVOID)UserBuffer,
+                                     Length,
+                                     &Length);
+    if (Status == STATUS_BUFFER_TOO_SMALL)
+    {
+        nsb = LocalReAlloc(UserBuffer, Length, LMEM_MOVEABLE);
+        if (nsb == NULL)
+        {
+            LocalFree(UserBuffer);
+            return FALSE;
+        }
+
+        UserBuffer = nsb;
+        Status = NtQueryInformationToken(hToken,
+                                         TokenUser,
+                                         (PVOID)UserBuffer,
+                                         Length,
+                                         &Length);
+    }
+
+    if (!NT_SUCCESS (Status))
+    {
+        LocalFree(UserBuffer);
+        return FALSE;
+    }
+
+    Length = RtlLengthSid(UserBuffer->User.Sid);
 
-  Length = lstrlenW (String);
-  if (String[Length - 1] != L'\\')
+    pSid = LocalAlloc(LPTR, Length);
+    if (pSid == NULL)
     {
-      String[Length] = L'\\';
-      Length++;
-      String[Length] = (WCHAR)0;
+        LocalFree(UserBuffer);
+        return FALSE;
     }
 
-  return &String[Length];
+    Status = RtlCopySid(Length, pSid, UserBuffer->User.Sid);
+
+    LocalFree(UserBuffer);
+
+    if (!NT_SUCCESS (Status))
+    {
+        LocalFree(pSid);
+        return FALSE;
+    }
+
+    *Sid = pSid;
+
+    return TRUE;
 }
 
 
 BOOL
-GetUserSidFromToken (HANDLE hToken,
-                    PUNICODE_STRING SidString)
+GetUserSidStringFromToken(HANDLE hToken,
+                          PUNICODE_STRING SidString)
 {
-  PSID_AND_ATTRIBUTES SidBuffer, nsb;
-  ULONG Length;
-  NTSTATUS Status;
-
-  Length = 256;
-  SidBuffer = LocalAlloc (LMEM_FIXED,
-                         Length);
-  if (SidBuffer == NULL)
-    return FALSE;
-
-  Status = NtQueryInformationToken (hToken,
-                                   TokenUser,
-                                   (PVOID)SidBuffer,
-                                   Length,
-                                   &Length);
-  if (Status == STATUS_BUFFER_TOO_SMALL)
+    PTOKEN_USER UserBuffer, nsb;
+    ULONG Length;
+    NTSTATUS Status;
+
+    Length = 256;
+    UserBuffer = LocalAlloc(LPTR, Length);
+    if (UserBuffer == NULL)
+        return FALSE;
+
+    Status = NtQueryInformationToken(hToken,
+                                     TokenUser,
+                                     (PVOID)UserBuffer,
+                                     Length,
+                                     &Length);
+    if (Status == STATUS_BUFFER_TOO_SMALL)
     {
-      nsb = LocalReAlloc (SidBuffer,
-                          Length,
-                          LMEM_MOVEABLE);
-      if (nsb == NULL)
+        nsb = LocalReAlloc(UserBuffer,
+                           Length,
+                           LMEM_MOVEABLE);
+        if (nsb == NULL)
         {
-          LocalFree((HLOCAL)SidBuffer);
-          return FALSE;
+            LocalFree(UserBuffer);
+            return FALSE;
         }
 
-      SidBuffer = nsb;
-      Status = NtQueryInformationToken (hToken,
-                                       TokenUser,
-                                       (PVOID)SidBuffer,
-                                       Length,
-                                       &Length);
+        UserBuffer = nsb;
+        Status = NtQueryInformationToken(hToken,
+                                         TokenUser,
+                                         (PVOID)UserBuffer,
+                                         Length,
+                                         &Length);
     }
 
-  if (!NT_SUCCESS (Status))
+    if (!NT_SUCCESS (Status))
     {
-      LocalFree ((HLOCAL)SidBuffer);
-      SetLastError (RtlNtStatusToDosError (Status));
-      return FALSE;
+        LocalFree(UserBuffer);
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
     }
 
-  DPRINT ("SidLength: %lu\n", RtlLengthSid (SidBuffer[0].Sid));
+    DPRINT("SidLength: %lu\n", RtlLengthSid (UserBuffer->User.Sid));
 
-  Status = RtlConvertSidToUnicodeString (SidString,
-                                        SidBuffer[0].Sid,
-                                        TRUE);
+    Status = RtlConvertSidToUnicodeString(SidString,
+                                          UserBuffer->User.Sid,
+                                          TRUE);
 
-  LocalFree ((HLOCAL)SidBuffer);
+    LocalFree(UserBuffer);
 
-  if (!NT_SUCCESS (Status))
+    if (!NT_SUCCESS(Status))
     {
-      SetLastError (RtlNtStatusToDosError (Status));
-      return FALSE;
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
     }
 
-  DPRINT ("SidString.Length: %lu\n", SidString->Length);
-  DPRINT ("SidString.MaximumLength: %lu\n", SidString->MaximumLength);
-  DPRINT ("SidString: '%wZ'\n", SidString);
+    DPRINT("SidString.Length: %lu\n", SidString->Length);
+    DPRINT("SidString.MaximumLength: %lu\n", SidString->MaximumLength);
+    DPRINT("SidString: '%wZ'\n", SidString);
 
-  return TRUE;
+    return TRUE;
 }
 
+
 PSECURITY_DESCRIPTOR
 CreateDefaultSecurityDescriptor(VOID)
 {
@@ -285,47 +353,48 @@ DYN_MODULE DynOle32 =
  * has been created!
  */
 BOOL
-LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs)
+LoadDynamicImports(PDYN_MODULE Module,
+                   PDYN_FUNCS DynFuncs)
 {
-  LPSTR *fname;
-  PVOID *fn;
+    LPSTR *fname;
+    PVOID *fn;
 
-  ZeroMemory(DynFuncs, sizeof(DYN_FUNCS));
+    ZeroMemory(DynFuncs, sizeof(DYN_FUNCS));
 
-  DynFuncs->hModule = LoadLibraryW(Module->Library);
-  if (!DynFuncs->hModule)
+    DynFuncs->hModule = LoadLibraryW(Module->Library);
+    if (!DynFuncs->hModule)
     {
-      return FALSE;
+        return FALSE;
     }
 
-  fn = &DynFuncs->fn.foo;
+    fn = &DynFuncs->fn.foo;
 
-  /* load the imports */
-  for (fname = Module->Functions; *fname != NULL; fname++)
+    /* load the imports */
+    for (fname = Module->Functions; *fname != NULL; fname++)
     {
-      *fn = GetProcAddress(DynFuncs->hModule, *fname);
-      if (*fn == NULL)
+        *fn = GetProcAddress(DynFuncs->hModule, *fname);
+        if (*fn == NULL)
         {
-          FreeLibrary(DynFuncs->hModule);
-          DynFuncs->hModule = (HMODULE)0;
+            FreeLibrary(DynFuncs->hModule);
+            DynFuncs->hModule = (HMODULE)0;
 
-          return FALSE;
+            return FALSE;
         }
 
-      fn++;
+        fn++;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 
 VOID
 UnloadDynamicImports(PDYN_FUNCS DynFuncs)
 {
-  if (DynFuncs->hModule)
+    if (DynFuncs->hModule)
     {
-      FreeLibrary(DynFuncs->hModule);
-      DynFuncs->hModule = (HMODULE)0;
+        FreeLibrary(DynFuncs->hModule);
+        DynFuncs->hModule = (HMODULE)0;
     }
 }