Robert Reif : advapi32: Add computer sid support to LookupAccountSidW.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 31 10:38:55 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 6d4fb08eceee7fba076341e300f269300aa731c1
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=6d4fb08eceee7fba076341e300f269300aa731c1

Author: Robert Reif <reif at earthlink.net>
Date:   Mon Jul 31 07:09:21 2006 -0400

advapi32: Add computer sid support to LookupAccountSidW.

---

 dlls/advapi32/security.c |   72 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 3ff2081..53b2210 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -143,6 +143,7 @@ static const WCHAR DIALUP[] = { 'D','I',
 static const WCHAR DOMAIN[] = {'D','O','M','A','I','N',0};
 static const WCHAR ENTERPRISE_DOMAIN_CONTROLLERS[] = { 'E','N','T','E','R','P','R','I','S','E',' ','D','O','M','A','I','N',' ','C','O','N','T','R','O','L','L','E','R','S',0 };
 static const WCHAR Everyone[] = { 'E','v','e','r','y','o','n','e',0 };
+static const WCHAR Guest[] = { 'G','u','e','s','t',0 };
 static const WCHAR Guests[] = { 'G','u','e','s','t','s',0 };
 static const WCHAR INTERACTIVE[] = { 'I','N','T','E','R','A','C','T','I','V','E',0 };
 static const WCHAR LOCAL[] = { 'L','O','C','A','L',0 };
@@ -1825,9 +1826,10 @@ LookupAccountSidW(
 	OUT PSID_NAME_USE name_use )
 {
     int i, j;
-    const WCHAR * ac = Administrator;	/* FIXME */
-    const WCHAR * dm = DOMAIN;		/* FIXME */
-    SID_NAME_USE use = SidTypeUser;	/* FIXME */
+    const WCHAR * ac = NULL;
+    const WCHAR * dm = NULL;
+    SID_NAME_USE use = 0;
+    LPWSTR computer_name = NULL;
 
     TRACE("(%s,sid=%s,%p,%p(%lu),%p,%p(%lu),%p)\n",
 	  debugstr_w(system),debugstr_sid(sid),
@@ -1840,7 +1842,8 @@ LookupAccountSidW(
         SetLastError(ERROR_NONE_MAPPED);
         return FALSE;
     }
-    
+
+    /* check the well known SIDs first */
     for (i = 0; i <= 60; i++) {
         if (IsWellKnownSid(sid, i)) {
             for (j = 0; j < (sizeof(ACCOUNT_SIDS) / sizeof(ACCOUNT_SIDS[0])); j++) {
@@ -1854,16 +1857,61 @@ LookupAccountSidW(
         }
     }
 
-    *accountSize = strlenW(ac)+1;
-    if (account && (*accountSize > strlenW(ac)))
-        strcpyW(account, ac);
+    if (dm == NULL) {
+        MAX_SID local;
+        MAX_SID admin;
+        MAX_SID guest;
+
+        /* check for the local computer next */
+        if (ADVAPI_GetComputerSid(&local)) {
+            DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
+            BOOL result;
+
+            computer_name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
+            result = GetComputerNameW(computer_name,  &size);
+
+            if (result) {
+                CopySid(GetSidLengthRequired(local.SubAuthorityCount), &admin, &local);
+                admin.SubAuthorityCount++;
+                admin.SubAuthority[4] = DOMAIN_USER_RID_ADMIN;
+                CopySid(GetSidLengthRequired(local.SubAuthorityCount), &guest, &local);
+                guest.SubAuthorityCount++;
+                guest.SubAuthority[4] = DOMAIN_USER_RID_GUEST;
+
+                if (EqualSid(sid, &local)) {
+                    dm = computer_name;
+                    ac = Blank;
+                    use = 3;
+                } else if (EqualSid(sid, &admin)) {
+                    dm = computer_name;
+                    ac = Administrator;
+                    use = 1;
+                } else if (EqualSid(sid, &guest)) {
+                    dm = computer_name;
+                    ac = Guest;
+                    use = 1;
+                }
+            }
+        }
+    }
+
+    if (dm) {
+        *accountSize = strlenW(ac)+1;
+        if (account && (*accountSize > strlenW(ac)))
+            strcpyW(account, ac);
 
-    *domainSize = strlenW(dm)+1;
-    if (domain && (*domainSize > strlenW(dm)))
-        strcpyW(domain,dm);
+        *domainSize = strlenW(dm)+1;
+        if (domain && (*domainSize > strlenW(dm)))
+            strcpyW(domain,dm);
 
-    *name_use = use;
-    return TRUE;
+        *name_use = use;
+        HeapFree(GetProcessHeap(), 0, computer_name);
+        return TRUE;
+    }
+
+    HeapFree(GetProcessHeap(), 0, computer_name);
+    SetLastError(ERROR_NONE_MAPPED);
+    return FALSE;
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list