[1/5] advapi32: Break well known sid handling out of LookupAccountNameW and into a helper function.
Hans Leidekker
hans at codeweavers.com
Wed Jul 22 04:53:54 CDT 2009
Based on a patch set by Aric Stewart.
-Hans
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index e1cbb1a..c5a8b18 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2653,44 +2653,55 @@ static BOOL lookup_computer_account_name(PSID Sid, PDWORD cbSid, LPWSTR Referenc
return ret;
}
-/******************************************************************************
- * LookupAccountNameW [ADVAPI32.@]
+static void split_domain_account(LPCWSTR lpAccountName, DWORD accountNameLen,
+ LPCWSTR *lpAccountNamePtr, DWORD *accountLen,
+ LPCWSTR *lpDomainNamePtr, DWORD *domainLen)
+{
+ *lpDomainNamePtr = NULL;
+ *domainLen = 0;
+ *accountLen = accountNameLen;
+
+ if ((*lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
+ {
+ *domainLen = *lpAccountNamePtr - lpAccountName;
+ (*lpAccountNamePtr)++;
+ *lpDomainNamePtr = lpAccountName;
+ *accountLen = accountNameLen - (*domainLen) - 1;
+ }
+ else
+ *lpAccountNamePtr = lpAccountName;
+}
+
+
+/*
+ * Helper function for LookupAccountNameW
*/
-BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid,
- LPDWORD cbSid, LPWSTR ReferencedDomainName,
- LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse )
+
+static BOOL lookup_local_wellknown_name(LPCWSTR lpAccountName, DWORD ccAccountName,
+ PSID Sid, LPDWORD cbSid,
+ LPWSTR ReferencedDomainName,
+ LPDWORD cchReferencedDomainName,
+ PSID_NAME_USE peUse, BOOL *handled)
{
- BOOL ret;
+ int i;
PSID pSid;
- unsigned int i;
- DWORD nameLen;
- LPWSTR userName = NULL;
LPCWSTR domainName;
+ DWORD nameLen;
+ DWORD accountLen;
+ DWORD domainLen;
LPCWSTR lpAccountNamePtr;
LPCWSTR lpDomainNamePtr = NULL;
+ BOOL ret = TRUE;
- FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
- Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
-
- if (!ADVAPI_IsLocalComputer(lpSystemName))
- {
- SetLastError(RPC_S_SERVER_UNAVAILABLE);
- return FALSE;
- }
-
- if (!lpAccountName || !strcmpW(lpAccountName, Blank))
- {
- lpAccountName = BUILTIN;
- }
-
- /* Check well known SIDs first */
- if ((lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
- {
- lpAccountNamePtr++;
- lpDomainNamePtr = lpAccountName;
- }
+ *handled = FALSE;
+ if (ccAccountName != -1)
+ accountLen = ccAccountName;
else
- lpAccountNamePtr = lpAccountName;
+ accountLen = lstrlenW(lpAccountName);
+
+ split_domain_account(lpAccountName, accountLen,
+ &lpAccountNamePtr, &accountLen,
+ &lpDomainNamePtr, &domainLen);
for (i = 0; i < (sizeof(ACCOUNT_SIDS) / sizeof(ACCOUNT_SIDS[0])); i++)
{
@@ -2698,8 +2709,8 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
if (lpDomainNamePtr && (strncmpiW(lpDomainNamePtr, ACCOUNT_SIDS[i].domain, strlenW(ACCOUNT_SIDS[i].domain)) || lpDomainNamePtr[strlenW(ACCOUNT_SIDS[i].domain)]!='\\'))
continue;
- if (!strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].account) ||
- (ACCOUNT_SIDS[i].alias && !strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].alias)))
+ if ((!strncmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].account,accountLen) && ACCOUNT_SIDS[i].account[accountLen] == 0) ||
+ (ACCOUNT_SIDS[i].alias && !strncmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].alias,accountLen) && ACCOUNT_SIDS[i].alias[accountLen] == 0))
{
DWORD sidLen = SECURITY_MAX_SID_SIZE;
@@ -2745,11 +2756,55 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
HeapFree(GetProcessHeap(), 0, pSid);
+ *handled = TRUE;
return ret;
}
}
+ return ret;
+}
+
+/******************************************************************************
+ * LookupAccountNameW [ADVAPI32.@]
+ */
+BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid,
+ LPDWORD cbSid, LPWSTR ReferencedDomainName,
+ LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse )
+{
+ BOOL ret, handled;
+ DWORD nameLen;
+ LPWSTR userName = NULL;
+ LPCWSTR lpAccountNamePtr;
+ LPCWSTR lpDomainNamePtr = NULL;
+
+ FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
+ Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
+
+ if (!ADVAPI_IsLocalComputer(lpSystemName))
+ {
+ SetLastError(RPC_S_SERVER_UNAVAILABLE);
+ return FALSE;
+ }
+
+ if (!lpAccountName || !strcmpW(lpAccountName, Blank))
+ {
+ lpAccountName = BUILTIN;
+ }
+
+ /* Check well known SIDs first */
+ ret = lookup_local_wellknown_name(lpAccountName, -1, Sid, cbSid,
+ ReferencedDomainName, cchReferencedDomainName,
+ peUse, &handled);
+ if (handled)
+ return ret;
/* Let the current Unix user id masquerade as first Windows user account */
+ if ((lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
+ {
+ lpAccountNamePtr++;
+ lpDomainNamePtr = lpAccountName;
+ }
+ else
+ lpAccountNamePtr = lpAccountName;
nameLen = UNLEN + 1;
More information about the wine-patches
mailing list