Sync aclui, advapi32, atl, authz, kernel32, msi, oledlg, powrprof, qmgr, riched20...
[reactos.git] / reactos / dll / win32 / advapi32 / sec / sid.c
index ed466a5..70974db 100644 (file)
@@ -303,6 +303,68 @@ static __inline BOOL set_ntstatus( NTSTATUS status )
     return !status;
 }
 
+/************************************************************
+ *                ADVAPI_GetComputerSid
+ *
+ * Reads the computer SID from the registry.
+ */
+BOOL ADVAPI_GetComputerSid(PSID sid)
+{
+    HKEY key;
+    LONG ret;
+    BOOL retval = FALSE;
+    static const WCHAR Account[] = { 'S','E','C','U','R','I','T','Y','\\','S','A','M','\\','D','o','m','a','i','n','s','\\','A','c','c','o','u','n','t',0 };
+    static const WCHAR V[] = { 'V',0 };
+
+    if ((ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Account, 0,
+        KEY_READ, &key)) == ERROR_SUCCESS)
+    {
+        DWORD size = 0;
+        ret = RegQueryValueExW(key, V, NULL, NULL, NULL, &size);
+        if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
+        {
+            BYTE * data = HeapAlloc(GetProcessHeap(), 0, size);
+            if (data)
+            {
+                if ((ret = RegQueryValueExW(key, V, NULL, NULL,
+                     data, &size)) == ERROR_SUCCESS)
+                {
+                    /* the SID is in the last 24 bytes of the binary data */
+                    CopyMemory(sid, &data[size-24], 24);
+                    retval = TRUE;
+                }
+                HeapFree(GetProcessHeap(), 0, data);
+            }
+        }
+        RegCloseKey(key);
+    }
+
+    if(retval == TRUE) return retval;
+
+    /* create a new random SID */
+    if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, Account,
+        0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL) == ERROR_SUCCESS)
+    {
+        PSID new_sid;
+        SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY};
+        DWORD id[3];
+
+        if (RtlGenRandom(id, sizeof(id)))
+        {
+            if (AllocateAndInitializeSid(&identifierAuthority, 4, SECURITY_NT_NON_UNIQUE, id[0], id[1], id[2], 0, 0, 0, 0, &new_sid))
+            {
+                if (RegSetValueExW(key, V, 0, REG_BINARY, new_sid, GetLengthSid(new_sid)) == ERROR_SUCCESS)
+                    retval = CopySid(GetLengthSid(new_sid), sid, new_sid);
+
+                FreeSid(new_sid);
+            }
+        }
+        RegCloseKey(key);
+    }
+
+    return retval;
+}
+
 /* Exported functions */
 
 /*
@@ -1740,7 +1802,7 @@ IsWellKnownSid(IN PSID pSid,
     {
         if (WellKnownSids[i].Type == WellKnownSidType)
         {
-            if (EqualSid(pSid, (PSID)((ULONG_PTR)&WellKnownSids[i].Sid.Revision)))
+            if (EqualSid(pSid, (PSID)(&WellKnownSids[i].Sid.Revision)))
                 return TRUE;
         }
     }
@@ -1758,7 +1820,10 @@ ConvertStringSidToSidA(IN LPCSTR StringSid,
 {
     BOOL bRetVal = FALSE;
 
-    if (!StringSid || !sid)
+    TRACE("%s, %p\n", debugstr_a(StringSid), sid);
+    if (GetVersion() & 0x80000000)
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    else if (!StringSid || !sid)
         SetLastError(ERROR_INVALID_PARAMETER);
     else
     {