Sync with trunk r43123
[reactos.git] / reactos / dll / win32 / advapi32 / sec / misc.c
index 3c45f62..604bd1d 100644 (file)
@@ -289,7 +289,7 @@ CheckNtMartaPresent(VOID)
 {
     DWORD ErrorCode;
 
-    if (InterlockedCompareExchangePointer(&NtMarta,
+    if (InterlockedCompareExchangePointer((PVOID)&NtMarta,
                                           NULL,
                                           NULL) == NULL)
     {
@@ -300,7 +300,7 @@ CheckNtMartaPresent(VOID)
         if (ErrorCode == ERROR_SUCCESS)
         {
             /* try change the NtMarta pointer */
-            if (InterlockedCompareExchangePointer(&NtMarta,
+            if (InterlockedCompareExchangePointer((PVOID)&NtMarta,
                                                   &NtMartaStatic,
                                                   NULL) != NULL)
             {
@@ -329,7 +329,7 @@ CheckNtMartaPresent(VOID)
 VOID
 UnloadNtMarta(VOID)
 {
-    if (InterlockedExchangePointer(&NtMarta,
+    if (InterlockedExchangePointer((PVOID)&NtMarta,
                                    NULL) != NULL)
     {
         FreeLibrary(NtMartaStatic.hDllInstance);
@@ -1200,8 +1200,11 @@ LookupAccountSidW(LPCWSTR pSystemName,
                                else
                                {
                                        *pdwDomainName = dwSrcLen;
-                                       RtlCopyMemory ( pDomainName, ReferencedDomain->Domains[0].Name.Buffer, ReferencedDomain->Domains[0].Name.Length );
-                                                       pDomainName[ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR)] = L'\0';
+                                       if (pDomainName)
+                                       {
+                                           RtlCopyMemory ( pDomainName, ReferencedDomain->Domains[0].Name.Buffer, ReferencedDomain->Domains[0].Name.Length );
+                                           pDomainName[ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR)] = L'\0';
+                                       }
                                }
                        }
                }
@@ -1261,9 +1264,9 @@ LookupAccountNameA(LPCSTR SystemName,
         WideCharToMultiByte(CP_ACP,
                             0,
                             lpReferencedDomainNameW,
-                            *hReferencedDomainNameLength,
+                            *hReferencedDomainNameLength + 1,
                             ReferencedDomainName,
-                            *hReferencedDomainNameLength,
+                            *hReferencedDomainNameLength + 1,
                             NULL,
                             NULL);
     }
@@ -1301,6 +1304,12 @@ LookupAccountNameW(LPCWSTR lpSystemName,
     TRACE("%s %s %p %p %p %p %p - stub\n", lpSystemName, lpAccountName,
           Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
 
+    if (!ADVAPI_IsLocalComputer(lpSystemName))
+    {
+        SetLastError(RPC_S_SERVER_UNAVAILABLE);
+        return FALSE;
+    }
+
     for (i = 0; i < (sizeof(ACCOUNT_SIDS) / sizeof(ACCOUNT_SIDS[0])); i++)
     {
         if (!wcscmp(lpAccountName, ACCOUNT_SIDS[i].account))
@@ -1343,13 +1352,16 @@ LookupAccountNameW(LPCWSTR lpSystemName,
     if (ReferencedDomainName != NULL && (*cchReferencedDomainName > wcslen(dm)))
         wcscpy(ReferencedDomainName, dm);
 
-    if (*cchReferencedDomainName <= wcslen(dm))
+    if ((*cchReferencedDomainName <= wcslen(dm)) || (!ret))
     {
         SetLastError(ERROR_INSUFFICIENT_BUFFER);
         ret = FALSE;
+        *cchReferencedDomainName = wcslen(dm) + 1;
+    }
+    else
+    {
+        *cchReferencedDomainName = wcslen(dm);
     }
-
-    *cchReferencedDomainName = wcslen(dm)+1;
 
     FreeSid(pSid);
 
@@ -1452,6 +1464,12 @@ LookupPrivilegeValueW(LPCWSTR SystemName,
     };
   unsigned Priv;
 
+  if (!ADVAPI_IsLocalComputer(SystemName))
+    {
+        SetLastError(RPC_S_SERVER_UNAVAILABLE);
+        return FALSE;
+    }
+
   if (NULL != SystemName && L'\0' != *SystemName)
     {
       FIXME("LookupPrivilegeValueW: not implemented for remote system\n");
@@ -1461,7 +1479,7 @@ LookupPrivilegeValueW(LPCWSTR SystemName,
 
   for (Priv = 0; Priv < sizeof(DefaultPrivNames) / sizeof(DefaultPrivNames[0]); Priv++)
     {
-      if (0 == wcsicmp(PrivName, DefaultPrivNames[Priv]))
+      if (0 == _wcsicmp(PrivName, DefaultPrivNames[Priv]))
         {
           Luid->LowPart = Priv + SE_MIN_WELL_KNOWN_PRIVILEGE;
           Luid->HighPart = 0;
@@ -1592,6 +1610,7 @@ LookupPrivilegeNameW(LPCWSTR lpSystemName,
         SetLastError(RPC_S_SERVER_UNAVAILABLE);
         return FALSE;
     }
+
     if (lpLuid->HighPart || (lpLuid->LowPart < SE_MIN_WELL_KNOWN_PRIVILEGE ||
      lpLuid->LowPart > SE_MAX_WELL_KNOWN_PRIVILEGE))
     {
@@ -1858,29 +1877,26 @@ GetNamedSecurityInfoA(LPSTR pObjectName,
                       PACL *ppSacl,
                       PSECURITY_DESCRIPTOR *ppSecurityDescriptor)
 {
-    UNICODE_STRING ObjectName;
-    NTSTATUS Status;
-    DWORD Ret;
+    DWORD len;
+    LPWSTR wstr = NULL;
+    DWORD r;
 
-    Status = RtlCreateUnicodeStringFromAsciiz(&ObjectName,
-                                              pObjectName);
-    if (!NT_SUCCESS(Status))
+    TRACE("%s %d %d %p %p %p %p %p\n", pObjectName, ObjectType, SecurityInfo,
+        ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor);
+
+    if( pObjectName )
     {
-        return RtlNtStatusToDosError(Status);
+        len = MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, NULL, 0 );
+        wstr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR));
+        MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, wstr, len );
     }
 
-    Ret = GetNamedSecurityInfoW(ObjectName.Buffer,
-                                ObjectType,
-                                SecurityInfo,
-                                ppsidOwner,
-                                ppsidGroup,
-                                ppDacl,
-                                ppSacl,
-                                ppSecurityDescriptor);
+    r = GetNamedSecurityInfoW( wstr, ObjectType, SecurityInfo, ppsidOwner,
+                           ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor );
 
-    RtlFreeUnicodeString(&ObjectName);
+    HeapFree( GetProcessHeap(), 0, wstr );
 
-    return Ret;
+    return r;
 }
 
 
@@ -2239,14 +2255,15 @@ DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR *ObjectDescriptor)
  */
 BOOL
 WINAPI
-GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR ObjectDescriptor,
-                         SECURITY_INFORMATION SecurityInformation,
-                         PSECURITY_DESCRIPTOR ResultantDescriptor,
-                         DWORD DescriptorLength,
-                         PDWORD ReturnLength)
+GetPrivateObjectSecurity(IN PSECURITY_DESCRIPTOR ObjectDescriptor,
+                         IN SECURITY_INFORMATION SecurityInformation,
+                         OUT PSECURITY_DESCRIPTOR ResultantDescriptor OPTIONAL,
+                         IN DWORD DescriptorLength,
+                         OUT PDWORD ReturnLength)
 {
     NTSTATUS Status;
 
+    /* Call RTL */
     Status = RtlQuerySecurityObject(ObjectDescriptor,
                                     SecurityInformation,
                                     ResultantDescriptor,
@@ -2254,10 +2271,12 @@ GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR ObjectDescriptor,
                                     ReturnLength);
     if (!NT_SUCCESS(Status))
     {
+        /* Fail */
         SetLastError(RtlNtStatusToDosError(Status));
         return FALSE;
     }
 
+    /* Success */
     return TRUE;
 }