advapi32: add computer sid support to LookupAccountSidW
(revised)
Robert Reif
reif at earthlink.net
Mon Jul 31 06:09:21 CDT 2006
-------------- next part --------------
Index: dlls/advapi32/security.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/security.c,v
retrieving revision 1.140
diff -p -u -r1.140 security.c
--- dlls/advapi32/security.c 31 Jul 2006 09:33:02 -0000 1.140
+++ dlls/advapi32/security.c 31 Jul 2006 11:03:31 -0000
@@ -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 };
@@ -1788,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),
@@ -1803,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++) {
@@ -1817,16 +1857,61 @@ LookupAccountSidW(
}
}
- *accountSize = strlenW(ac)+1;
- if (account && (*accountSize > strlenW(ac)))
- strcpyW(account, ac);
-
- *domainSize = strlenW(dm)+1;
- if (domain && (*domainSize > strlenW(dm)))
- strcpyW(domain,dm);
+ 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);
- *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-patches
mailing list