[INCLUDE]
[reactos.git] / reactos / dll / win32 / advapi32 / sec / lsa.c
index a15ab3d..e428f6d 100644 (file)
  *      20030202 KJK compressed stubs
  *
  */
+
 #include <advapi32.h>
+
 WINE_DEFAULT_DEBUG_CHANNEL(advapi);
 
 
-static BOOL LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName)
+static
+BOOL
+LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName)
 {
     DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
     BOOL Result;
@@ -34,7 +38,8 @@ static BOOL LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName)
 }
 
 
-handle_t __RPC_USER
+handle_t
+__RPC_USER
 PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName)
 {
     handle_t hBinding = NULL;
@@ -73,7 +78,8 @@ PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName)
 }
 
 
-void __RPC_USER
+void
+__RPC_USER
 PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName,
                           handle_t hBinding)
 {
@@ -94,15 +100,26 @@ PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName,
  */
 NTSTATUS
 WINAPI
-LsaClose(IN LSA_HANDLE ObjectHandle)
+LsaAddAccountRights(IN LSA_HANDLE PolicyHandle,
+                    IN PSID AccountSid,
+                    IN PLSA_UNICODE_STRING UserRights,
+                    IN ULONG CountOfRights)
 {
+    LSAPR_USER_RIGHT_SET UserRightSet;
     NTSTATUS Status;
 
-    TRACE("LsaClose(0x%p) called\n", ObjectHandle);
+    TRACE("LsaAddAccountRights(%p %p %p 0x%08x)\n",
+          PolicyHandle, AccountSid, UserRights, CountOfRights);
+
+    UserRightSet.Entries = CountOfRights;
+    UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights;
 
     RpcTryExcept
     {
-        Status = LsarClose((PLSAPR_HANDLE)&ObjectHandle);
+        Status = LsarAddAccountRights((LSAPR_HANDLE)PolicyHandle,
+                                      (PRPC_SID)AccountSid,
+                                      &UserRightSet);
+
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -119,15 +136,18 @@ LsaClose(IN LSA_HANDLE ObjectHandle)
  */
 NTSTATUS
 WINAPI
-LsaDelete(IN LSA_HANDLE ObjectHandle)
+LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle,
+                          IN PPRIVILEGE_SET PrivilegeSet)
 {
     NTSTATUS Status;
 
-    TRACE("LsaDelete(0x%p) called\n", ObjectHandle);
+    TRACE("LsaAddPrivilegesToAccount(%p %p)\n",
+          AccountHandle, PrivilegeSet);
 
     RpcTryExcept
     {
-        Status = LsarDelete((LSAPR_HANDLE)ObjectHandle);
+        Status = LsarAddPrivilegesToAccount((LSAPR_HANDLE)AccountHandle,
+                                            (PLSAPR_PRIVILEGE_SET)PrivilegeSet);
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -144,26 +164,15 @@ LsaDelete(IN LSA_HANDLE ObjectHandle)
  */
 NTSTATUS
 WINAPI
-LsaAddAccountRights(IN LSA_HANDLE PolicyHandle,
-                    IN PSID AccountSid,
-                    IN PLSA_UNICODE_STRING UserRights,
-                    IN ULONG CountOfRights)
+LsaClearAuditLog(IN LSA_HANDLE PolicyHandle)
 {
-    LSAPR_USER_RIGHT_SET UserRightSet;
     NTSTATUS Status;
 
-    TRACE("LsaAddAccountRights(%p %p %p 0x%08x)\n",
-          PolicyHandle, AccountSid, UserRights, CountOfRights);
-
-    UserRightSet.Entries = CountOfRights;
-    UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights;
+    TRACE("LsaClearAuditLog(%p)\n", PolicyHandle);
 
     RpcTryExcept
     {
-        Status = LsarAddAccountRights((LSAPR_HANDLE)PolicyHandle,
-                                      (PRPC_SID)AccountSid,
-                                      &UserRightSet);
-
+        Status = LsarClearAuditLog((LSAPR_HANDLE)PolicyHandle);
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -180,18 +189,15 @@ LsaAddAccountRights(IN LSA_HANDLE PolicyHandle,
  */
 NTSTATUS
 WINAPI
-LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle,
-                          IN PPRIVILEGE_SET PrivilegeSet)
+LsaClose(IN LSA_HANDLE ObjectHandle)
 {
     NTSTATUS Status;
 
-    TRACE("LsaAddPrivilegesToAccount(%p %p)\n",
-          AccountHandle, PrivilegeSet);
+    TRACE("LsaClose(%p) called\n", ObjectHandle);
 
     RpcTryExcept
     {
-        Status = LsarAddPrivilegesToAccount((LSAPR_HANDLE)AccountHandle,
-                                            (PLSAPR_PRIVILEGE_SET)PrivilegeSet);
+        Status = LsarClose((PLSAPR_HANDLE)&ObjectHandle);
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -215,7 +221,7 @@ LsaCreateAccount(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("LsaCreateAccount(%p %p 0x%08x %p)\n",
+    TRACE("LsaCreateAccount(%p %p 0x%08lx %p)\n",
           PolicyHandle, AccountSid, DesiredAccess, AccountHandle);
 
     RpcTryExcept
@@ -279,8 +285,8 @@ LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, TrustedDomainInformation,
-          DesiredAccess, TrustedDomainHandle);
+    TRACE("LsaCreateTrustedDomain(%p %p 0x%08lx %p)\n",
+          PolicyHandle, TrustedDomainInformation, DesiredAccess, TrustedDomainHandle);
 
     RpcTryExcept
     {
@@ -304,16 +310,61 @@ LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle,
  */
 NTSTATUS
 WINAPI
-LsaCreateTrustedDomainEx(
-    LSA_HANDLE PolicyHandle,
-    PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation,
-    PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation,
-    ACCESS_MASK DesiredAccess,
-    PLSA_HANDLE TrustedDomainHandle)
+LsaCreateTrustedDomainEx(IN LSA_HANDLE PolicyHandle,
+                         IN PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation,
+                         IN PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation,
+                         IN ACCESS_MASK DesiredAccess,
+                         OUT PLSA_HANDLE TrustedDomainHandle)
 {
-    FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, TrustedDomainInformation, AuthenticationInformation,
+    PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION_INTERNAL EncryptedAuthInfo = NULL;
+    NTSTATUS Status;
+
+    TRACE("LsaCreateTrustedDomainEx(%p %p %p 0x%08lx %p) stub\n",
+          PolicyHandle, TrustedDomainInformation, AuthenticationInformation,
           DesiredAccess, TrustedDomainHandle);
-    return STATUS_SUCCESS;
+
+    RpcTryExcept
+    {
+        /* FIXME: Encrypt AuthenticationInformation */
+
+        Status = LsarCreateTrustedDomainEx2((LSAPR_HANDLE)PolicyHandle,
+                                            (PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX)TrustedDomainInformation,
+                                            EncryptedAuthInfo,
+                                            DesiredAccess,
+                                            (PLSAPR_HANDLE)TrustedDomainHandle);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaDelete(IN LSA_HANDLE ObjectHandle)
+{
+    NTSTATUS Status;
+
+    TRACE("LsaDelete(%p)\n", ObjectHandle);
+
+    RpcTryExcept
+    {
+        Status = LsarDelete((LSAPR_HANDLE)ObjectHandle);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
 }
 
 
@@ -327,7 +378,8 @@ LsaDeleteTrustedDomain(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p)\n", PolicyHandle, TrustedDomainSid);
+    TRACE("LsaDeleteTrustedDomain(%p %p)\n",
+          PolicyHandle, TrustedDomainSid);
 
     RpcTryExcept
     {
@@ -357,7 +409,8 @@ LsaEnumerateAccountRights(IN LSA_HANDLE PolicyHandle,
     LSAPR_USER_RIGHT_SET UserRightsSet;
     NTSTATUS Status;
 
-    TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights, CountOfRights);
+    TRACE("LsaEnumerateAccountRights(%p %p %p %p)\n",
+          PolicyHandle, AccountSid, UserRights, CountOfRights);
 
     UserRightsSet.Entries = 0;
     UserRightsSet.UserRights = NULL;
@@ -368,17 +421,15 @@ LsaEnumerateAccountRights(IN LSA_HANDLE PolicyHandle,
                                             AccountSid,
                                             &UserRightsSet);
 
-        *CountOfRights = UserRightsSet.Entries;
         *UserRights = (PUNICODE_STRING)UserRightsSet.UserRights;
+        *CountOfRights = UserRightsSet.Entries;
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
 
         if (UserRightsSet.UserRights != NULL)
-        {
             MIDL_user_free(UserRightsSet.UserRights);
-        }
     }
     RpcEndExcept;
 
@@ -387,18 +438,132 @@ LsaEnumerateAccountRights(IN LSA_HANDLE PolicyHandle,
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 WINAPI
-LsaEnumerateAccountsWithUserRight(
-    LSA_HANDLE PolicyHandle,
-    OPTIONAL PLSA_UNICODE_STRING UserRights,
-    PVOID *EnumerationBuffer,
-    PULONG CountReturned)
+LsaEnumerateAccounts(IN LSA_HANDLE PolicyHandle,
+                     IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext,
+                     OUT PVOID *Buffer,
+                     IN ULONG PreferedMaximumLength,
+                     OUT PULONG CountReturned)
 {
-    FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle, UserRights, EnumerationBuffer, CountReturned);
-    return STATUS_NO_MORE_ENTRIES;
+    LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer;
+    NTSTATUS Status;
+
+    TRACE("LsaEnumerateAccounts(%p %p %p %lu %p)\n",
+          PolicyHandle, EnumerationContext, Buffer,
+          PreferedMaximumLength, CountReturned);
+
+    AccountEnumBuffer.EntriesRead = 0;
+    AccountEnumBuffer.Information = NULL;
+
+    RpcTryExcept
+    {
+        Status = LsarEnumerateAccounts((LSAPR_HANDLE)PolicyHandle,
+                                       EnumerationContext,
+                                       &AccountEnumBuffer,
+                                       PreferedMaximumLength);
+
+        *Buffer = AccountEnumBuffer.Information;
+        *CountReturned = AccountEnumBuffer.EntriesRead;
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (AccountEnumBuffer.Information != NULL)
+            MIDL_user_free(AccountEnumBuffer.Information);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaEnumerateAccountsWithUserRight(IN LSA_HANDLE PolicyHandle,
+                                  IN PLSA_UNICODE_STRING UserRight OPTIONAL,
+                                  OUT PVOID *Buffer,
+                                  OUT PULONG CountReturned)
+{
+    LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer;
+    NTSTATUS Status;
+
+    TRACE("LsaEnumerateAccountsWithUserRight(%p %p %p %p) stub\n",
+          PolicyHandle, UserRight, Buffer, CountReturned);
+
+    AccountEnumBuffer.EntriesRead = 0;
+    AccountEnumBuffer.Information = NULL;
+
+    RpcTryExcept
+    {
+        Status = LsarEnumerateAccountsWithUserRight((LSAPR_HANDLE)PolicyHandle,
+                                                    (PRPC_UNICODE_STRING)UserRight,
+                                                    &AccountEnumBuffer);
+
+        *Buffer = AccountEnumBuffer.Information;
+        *CountReturned = AccountEnumBuffer.EntriesRead;
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (AccountEnumBuffer.Information != NULL)
+            MIDL_user_free(AccountEnumBuffer.Information);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaEnumeratePrivileges(IN LSA_HANDLE PolicyHandle,
+                       IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext,
+                       OUT PVOID *Buffer,
+                       IN ULONG PreferedMaximumLength,
+                       OUT PULONG CountReturned)
+{
+    LSAPR_PRIVILEGE_ENUM_BUFFER PrivilegeEnumBuffer;
+    NTSTATUS Status;
+
+    TRACE("LsaEnumeratePrivileges(%p %p %p %lu %p)\n",
+          PolicyHandle, EnumerationContext, Buffer,
+          PreferedMaximumLength, CountReturned);
+
+    PrivilegeEnumBuffer.Entries = 0;
+    PrivilegeEnumBuffer.Privileges = NULL;
+
+    RpcTryExcept
+    {
+        Status = LsarEnumeratePrivileges((LSAPR_HANDLE)PolicyHandle,
+                                         EnumerationContext,
+                                         &PrivilegeEnumBuffer,
+                                         PreferedMaximumLength);
+
+        *Buffer = PrivilegeEnumBuffer.Privileges;
+        *CountReturned = PrivilegeEnumBuffer.Entries;
+
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (PrivilegeEnumBuffer.Privileges != NULL)
+            MIDL_user_free(PrivilegeEnumBuffer.Privileges);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
 }
 
 
@@ -412,7 +577,8 @@ LsaEnumeratePrivilegesOfAccount(IN LSA_HANDLE AccountHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p) stub\n", AccountHandle, Privileges);
+    TRACE("LsaEnumeratePrivilegesOfAccount(%p %p)\n",
+          AccountHandle, Privileges);
 
     RpcTryExcept
     {
@@ -434,35 +600,41 @@ LsaEnumeratePrivilegesOfAccount(IN LSA_HANDLE AccountHandle,
  */
 NTSTATUS
 WINAPI
-LsaEnumerateTrustedDomains(
-    LSA_HANDLE PolicyHandle,
-    PLSA_ENUMERATION_HANDLE EnumerationContext,
-    PVOID *Buffer,
-    ULONG PreferedMaximumLength,
-    PULONG CountReturned)
+LsaEnumerateTrustedDomains(IN LSA_HANDLE PolicyHandle,
+                           IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext,
+                           OUT PVOID *Buffer,
+                           IN ULONG PreferedMaximumLength,
+                           OUT PULONG CountReturned)
 {
-    FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, EnumerationContext,
-        Buffer, PreferedMaximumLength, CountReturned);
+    FIXME("LsaEnumerateTrustedDomains(%p %p %p %lu %p) stub\n",
+          PolicyHandle, EnumerationContext, Buffer,
+          PreferedMaximumLength, CountReturned);
+
+    if (CountReturned)
+        *CountReturned = 0;
 
-    if (CountReturned) *CountReturned = 0;
     return STATUS_SUCCESS;
 }
 
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaEnumerateTrustedDomainsEx(
-    LSA_HANDLE PolicyHandle,
-    PLSA_ENUMERATION_HANDLE EnumerationContext,
-    PVOID *Buffer,
-    ULONG PreferedMaximumLength,
-    PULONG CountReturned)
+LsaEnumerateTrustedDomainsEx(IN LSA_HANDLE PolicyHandle,
+                             IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext,
+                             OUT PVOID *Buffer,
+                             IN ULONG PreferedMaximumLength,
+                             OUT PULONG CountReturned)
 {
-    FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, EnumerationContext, Buffer,
-        PreferedMaximumLength, CountReturned);
-    if (CountReturned) *CountReturned = 0;
+    FIXME("LsaEnumerateTrustedDomainsEx(%p %p %p %lu %p) stub\n",
+          PolicyHandle, EnumerationContext, Buffer,
+          PreferedMaximumLength, CountReturned);
+
+    if (CountReturned)
+        *CountReturned = 0;
+
     return STATUS_SUCCESS;
 }
 
@@ -474,11 +646,83 @@ NTSTATUS
 WINAPI
 LsaFreeMemory(IN PVOID Buffer)
 {
-    TRACE("(%p)\n", Buffer);
+    TRACE("LsaFreeMemory(%p)\n", Buffer);
     return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaGetQuotasForAccount(IN LSA_HANDLE AccountHandle,
+                       OUT PQUOTA_LIMITS QuotaLimits)
+{
+    NTSTATUS Status;
+
+    TRACE("LsaGetQuotasForAccount(%p %p)\n",
+          AccountHandle, QuotaLimits);
+
+    RpcTryExcept
+    {
+        Status = LsarGetQuotasForAccount((LSAPR_HANDLE)AccountHandle,
+                                         QuotaLimits);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaGetRemoteUserName(IN PLSA_UNICODE_STRING SystemName OPTIONAL,
+                     OUT PLSA_UNICODE_STRING *UserName,
+                     OUT PLSA_UNICODE_STRING *DomainName OPTIONAL)
+{
+    PRPC_UNICODE_STRING UserNameString = NULL;
+    PRPC_UNICODE_STRING DomainNameString = NULL;
+    NTSTATUS Status;
+
+    TRACE("LsaGetRemoteUserName(%s %p %p)\n",
+          SystemName ? debugstr_w(SystemName->Buffer) : "(null)",
+          UserName, DomainName);
+
+    RpcTryExcept
+    {
+        Status = LsarGetUserName((PLSAPR_SERVER_NAME)SystemName,
+                                 &UserNameString,
+                                 (DomainName != NULL) ? &DomainNameString : NULL);
+
+        *UserName = (PLSA_UNICODE_STRING)UserNameString;
+
+        if (DomainName != NULL)
+            *DomainName = (PLSA_UNICODE_STRING)DomainNameString;
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (UserNameString != NULL)
+            MIDL_user_free(UserNameString);
+
+        if (DomainNameString != NULL)
+            MIDL_user_free(DomainNameString);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @implemented
  */
@@ -489,7 +733,8 @@ LsaGetSystemAccessAccount(IN LSA_HANDLE AccountHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p)\n", AccountHandle, SystemAccess);
+    TRACE("LsaGetSystemAccessAccount(%p %p)\n",
+          AccountHandle, SystemAccess);
 
     RpcTryExcept
     {
@@ -506,6 +751,48 @@ LsaGetSystemAccessAccount(IN LSA_HANDLE AccountHandle,
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaGetUserName(OUT PUNICODE_STRING *UserName,
+               OUT PUNICODE_STRING *DomainName OPTIONAL)
+{
+    PRPC_UNICODE_STRING UserNameString = NULL;
+    PRPC_UNICODE_STRING DomainNameString = NULL;
+    NTSTATUS Status;
+
+    TRACE("LsaGetUserName(%p %p)\n",
+          UserName, DomainName);
+
+    RpcTryExcept
+    {
+        Status = LsarGetUserName(NULL,
+                                 &UserNameString,
+                                 (DomainName != NULL) ? &DomainNameString : NULL);
+
+        *UserName = (PUNICODE_STRING)UserNameString;
+
+        if (DomainName != NULL)
+            *DomainName = (PUNICODE_STRING)DomainNameString;
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (UserNameString != NULL)
+            MIDL_user_free(UserNameString);
+
+        if (DomainNameString != NULL)
+            MIDL_user_free(DomainNameString);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @implemented
  */
@@ -521,8 +808,8 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
     ULONG MappedCount = 0;
     NTSTATUS Status;
 
-    TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle, Count, Names,
-          ReferencedDomains, Sids);
+    TRACE("LsaLookupNames(%p %lu %p %p %p)\n",
+          PolicyHandle, Count, Names, ReferencedDomains, Sids);
 
     if (ReferencedDomains == NULL || Sids == NULL)
         return STATUS_INVALID_PARAMETER;
@@ -573,8 +860,8 @@ LsaLookupNames2(IN LSA_HANDLE PolicyHandle,
     ULONG MappedCount = 0;
     NTSTATUS Status;
 
-    TRACE("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags,
-          Count, Names, ReferencedDomains, Sids);
+    TRACE("LsaLookupNames2(%p 0x%08x %lu %p %p %p)\n",
+          PolicyHandle, Flags, Count, Names, ReferencedDomains, Sids);
 
     if (ReferencedDomains == NULL || Sids == NULL)
         return STATUS_INVALID_PARAMETER;
@@ -611,6 +898,22 @@ LsaLookupNames2(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle,
+                              IN PLSA_UNICODE_STRING Name,
+                              OUT PLSA_UNICODE_STRING *DisplayName,
+                              OUT PSHORT LanguageReturned)
+{
+    FIXME("LsaLookupPrivilegeDisplayName(%p %p %p %p)\n",
+          PolicyHandle, Name, DisplayName, LanguageReturned);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
 /*
  * @implemented
  */
@@ -623,7 +926,8 @@ LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle,
     PRPC_UNICODE_STRING NameBuffer = NULL;
     NTSTATUS Status;
 
-    TRACE("(%p,%p,%p)\n", PolicyHandle, Value, Name);
+    TRACE("LsaLookupPrivilegeName(%p %p %p)\n",
+          PolicyHandle, Value, Name);
 
     RpcTryExcept
     {
@@ -658,7 +962,8 @@ LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle,
     LUID Luid;
     NTSTATUS Status;
 
-    TRACE("(%p,%p,%p)\n", PolicyHandle, Name, Value);
+    TRACE("LsaLookupPrivilegeValue(%p %p %p)\n",
+          PolicyHandle, Name, Value);
 
     RpcTryExcept
     {
@@ -694,8 +999,8 @@ LsaLookupSids(IN LSA_HANDLE PolicyHandle,
     ULONG MappedCount = 0;
     NTSTATUS  Status;
 
-    TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle, Count, Sids,
-          ReferencedDomains, Names);
+    TRACE("LsaLookupSids(%p %lu %p %p %p)\n",
+          PolicyHandle, Count, Sids, ReferencedDomains, Names);
 
     if (Count == 0)
         return STATUS_INVALID_PARAMETER;
@@ -747,7 +1052,7 @@ ULONG
 WINAPI
 LsaNtStatusToWinError(IN NTSTATUS Status)
 {
-    TRACE("(%lx)\n", Status);
+    TRACE("LsaNtStatusToWinError(0x%lx)\n", Status);
     return RtlNtStatusToDosError(Status);
 }
 
@@ -764,7 +1069,8 @@ LsaOpenAccount(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p,0x%08lx,%p)\n", PolicyHandle, AccountSid, DesiredAccess, AccountHandle);
+    TRACE("LsaOpenAccount(%p %p 0x%08lx %p)\n",
+          PolicyHandle, AccountSid, DesiredAccess, AccountHandle);
 
     RpcTryExcept
     {
@@ -796,14 +1102,14 @@ LsaOpenAccount(IN LSA_HANDLE PolicyHandle,
  */
 NTSTATUS
 WINAPI
-LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName,
+LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL,
               IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
               IN ACCESS_MASK DesiredAccess,
               OUT PLSA_HANDLE PolicyHandle)
 {
     NTSTATUS Status;
 
-    TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
+    TRACE("LsaOpenPolicy(%s %p 0x%08lx %p)\n",
           SystemName ? debugstr_w(SystemName->Buffer) : "(null)",
           ObjectAttributes, DesiredAccess, PolicyHandle);
 
@@ -832,6 +1138,26 @@ LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName,
 }
 
 
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaOpenPolicySce(IN PLSA_UNICODE_STRING SystemName OPTIONAL,
+                 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
+                 IN ACCESS_MASK DesiredAccess,
+                 OUT PLSA_HANDLE PolicyHandle)
+{
+    FIXME("LsaOpenPolicySce(%s %p 0x%08lx %p)\n",
+          SystemName ? debugstr_w(SystemName->Buffer) : "(null)",
+          ObjectAttributes, DesiredAccess, PolicyHandle);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @implemented
+ */
 NTSTATUS
 WINAPI
 LsaOpenSecret(IN LSA_HANDLE PolicyHandle,
@@ -841,7 +1167,7 @@ LsaOpenSecret(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("LsaOpenSecret(%p %p 0x%08x %p)\n",
+    TRACE("LsaOpenSecret(%p %p 0x%08lx %p)\n",
           PolicyHandle, SecretName, DesiredAccess, SecretHandle);
 
     RpcTryExcept
@@ -865,6 +1191,38 @@ LsaOpenSecret(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaOpenTrustedDomain(IN LSA_HANDLE PolicyHandle,
+                     IN PSID TrustedDomainSid,
+                     IN ACCESS_MASK DesiredAccess,
+                     OUT PLSA_HANDLE TrustedDomainHandle)
+{
+    NTSTATUS Status;
+
+    TRACE("LsaOpenTrustedDomain(%p %p 0x%08lx %p)\n",
+          PolicyHandle, TrustedDomainSid, DesiredAccess, TrustedDomainHandle);
+
+    RpcTryExcept
+    {
+        Status = LsarOpenTrustedDomain((LSAPR_HANDLE)PolicyHandle,
+                                       (PRPC_SID)TrustedDomainSid,
+                                       DesiredAccess,
+                                       (PLSAPR_HANDLE)TrustedDomainHandle);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @implemented
  */
@@ -877,8 +1235,8 @@ LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, TrustedDomainName,
-          DesiredAccess, TrustedDomainHandle);
+    TRACE("LsaOpenTrustedDomainByName(%p %p 0x%08lx %p)\n",
+          PolicyHandle, TrustedDomainName, DesiredAccess, TrustedDomainHandle);
 
     RpcTryExcept
     {
@@ -897,17 +1255,53 @@ LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaQueryDomainInformationPolicy(IN LSA_HANDLE PolicyHandle,
+                                IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
+                                OUT PVOID *Buffer)
+{
+    PLSAPR_POLICY_DOMAIN_INFORMATION PolicyInformation = NULL;
+    NTSTATUS Status;
+
+    TRACE("LsaQueryDomainInformationPolicy(%p %lu %p)\n",
+          PolicyHandle, InformationClass, Buffer);
+
+    RpcTryExcept
+    {
+        Status = LsarQueryDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle,
+                                                  InformationClass,
+                                                  &PolicyInformation);
+
+        *Buffer = PolicyInformation;
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        if (PolicyInformation != NULL)
+            MIDL_user_free(PolicyInformation);
+
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaQueryDomainInformationPolicy(
-    LSA_HANDLE PolicyHandle,
-    POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
-    PVOID *Buffer)
+LsaQueryForestTrustInformation(IN LSA_HANDLE PolicyHandle,
+                               IN PLSA_UNICODE_STRING TrustedDomainName,
+                               OUT PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo)
 {
-    FIXME("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
+    FIXME("LsaQueryForestTrustInformation(%p %p %p) stub\n",
+          PolicyHandle, TrustedDomainName, ForestTrustInfo);
     return STATUS_NOT_IMPLEMENTED;
 }
 
@@ -917,12 +1311,12 @@ LsaQueryDomainInformationPolicy(
  */
 NTSTATUS
 WINAPI
-LsaQueryForestTrustInformation(
-    LSA_HANDLE PolicyHandle,
-    PLSA_UNICODE_STRING TrustedDomainName,
-    PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo)
+LsaQueryInfoTrustedDomain(IN LSA_HANDLE TrustedDomainHandle,
+                          IN TRUSTED_INFORMATION_CLASS InformationClass,
+                          OUT PVOID *Buffer)
 {
-    FIXME("(%p,%p,%p) stub\n", PolicyHandle, TrustedDomainName, ForestTrustInfo);
+    FIXME("LsaQueryInfoTrustedDomain(%p %d %p) stub\n",
+          TrustedDomainHandle, InformationClass, Buffer);
     return STATUS_NOT_IMPLEMENTED;
 }
 
@@ -939,7 +1333,8 @@ LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle,
     PLSAPR_POLICY_INFORMATION PolicyInformation = NULL;
     NTSTATUS Status;
 
-    TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
+    TRACE("LsaQueryInformationPolicy(%p %d %p)\n",
+          PolicyHandle, InformationClass, Buffer);
 
     RpcTryExcept
     {
@@ -981,6 +1376,10 @@ LsaQuerySecret(IN LSA_HANDLE SecretHandle,
     SIZE_T BufferSize;
     NTSTATUS Status;
 
+    TRACE("LsaQuerySecret(%p %p %p %p %p)\n",
+          SecretHandle, CurrentValue, CurrentValueSetTime,
+          OldValue, OldValueSetTime);
+
     RpcTryExcept
     {
         Status = LsarQuerySecret((PLSAPR_HANDLE)SecretHandle,
@@ -1082,18 +1481,63 @@ done:
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaQuerySecurityObject(IN LSA_HANDLE ObjectHandle,
+                       IN SECURITY_INFORMATION SecurityInformation,
+                       OUT PSECURITY_DESCRIPTOR *SecurityDescriptor)
+{
+    LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer;
+    PLSAPR_SR_SECURITY_DESCRIPTOR SdPointer;
+    NTSTATUS Status;
+
+    TRACE("LsaQuerySecurityObject(%p %lx %p)\n",
+          ObjectHandle, SecurityInformation, SecurityDescriptor);
+
+    SdBuffer.Length = 0;
+    SdBuffer.SecurityDescriptor = NULL;
+
+    SdPointer = &SdBuffer;
+
+    RpcTryExcept
+    {
+        Status = LsarQuerySecurityObject((LSAPR_HANDLE)ObjectHandle,
+                                         SecurityInformation,
+                                         &SdPointer);
+        if (NT_SUCCESS(Status))
+        {
+            *SecurityDescriptor = SdBuffer.SecurityDescriptor;
+        }
+        else
+        {
+            *SecurityDescriptor = NULL;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaQueryTrustedDomainInfo(
-    LSA_HANDLE PolicyHandle,
-    PSID TrustedDomainSid,
-    TRUSTED_INFORMATION_CLASS InformationClass,
-    PVOID *Buffer)
+LsaQueryTrustedDomainInfo(IN LSA_HANDLE PolicyHandle,
+                          IN PSID TrustedDomainSid,
+                          IN TRUSTED_INFORMATION_CLASS InformationClass,
+                          OUT PVOID *Buffer)
 {
-    FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
+    FIXME("LsaQueryTrustedDomainInfo(%p %p %d %p) stub\n",
+          PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
     return STATUS_OBJECT_NAME_NOT_FOUND;
 }
 
@@ -1110,7 +1554,8 @@ LsaQueryTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("(%p,%p,%d,%p)\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer);
+    TRACE("LsaQueryTrustedDomainInfoByName(%p %p %d %p)\n",
+          PolicyHandle, TrustedDomainName, InformationClass, Buffer);
 
     if (InformationClass == TrustedDomainAuthInformationInternal ||
         InformationClass == TrustedDomainFullInformationInternal)
@@ -1121,7 +1566,7 @@ LsaQueryTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle,
         Status = LsarQueryTrustedDomainInfoByName((LSAPR_HANDLE)PolicyHandle,
                                                   (PRPC_UNICODE_STRING)TrustedDomainName,
                                                   InformationClass,
-                                                  (unsigned long *)Buffer); // Shuld be: (PLSAPR_POLICY_INFORMATION *)Buffer
+                                                  (PLSAPR_TRUSTED_DOMAIN_INFO *)Buffer);
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -1133,6 +1578,20 @@ LsaQueryTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaRegisterPolicyChangeNotification(IN POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
+                                    IN HANDLE NotificationEventHandle)
+{
+    FIXME("LsaRegisterPolicyChangeNotification(%d %p) stub\n",
+          InformationClass, NotificationEventHandle);
+    return STATUS_UNSUCCESSFUL;
+}
+
+
 /*
  * @implemented
  */
@@ -1146,7 +1605,7 @@ LsaRemoveAccountRights(IN LSA_HANDLE PolicyHandle,
 {
     LSAPR_USER_RIGHT_SET UserRightSet;
 
-    TRACE("LsaRemoveAccountRights(%p %p %d %p 0x%08x) stub\n",
+    TRACE("LsaRemoveAccountRights(%p %p %d %p %lu)\n",
           PolicyHandle, AccountSid, AllRights, UserRights, CountOfRights);
 
     UserRightSet.Entries = CountOfRights;
@@ -1169,32 +1628,92 @@ LsaRemoveAccountRights(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaRemovePrivilegesFromAccount(IN LSA_HANDLE AccountHandle,
+                               IN BOOLEAN AllPrivileges,
+                               IN PPRIVILEGE_SET Privileges OPTIONAL)
+{
+    NTSTATUS Status;
+
+    RpcTryExcept
+    {
+        Status = LsarRemovePrivilegesFromAccount((LSAPR_HANDLE)AccountHandle,
+                                                 AllPrivileges,
+                                                 (PLSAPR_PRIVILEGE_SET)Privileges);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaRetrievePrivateData(
-    LSA_HANDLE PolicyHandle,
-    PLSA_UNICODE_STRING KeyName,
-    PLSA_UNICODE_STRING *PrivateData)
+LsaRetrievePrivateData(IN LSA_HANDLE PolicyHandle,
+                       IN PLSA_UNICODE_STRING KeyName,
+                       OUT PLSA_UNICODE_STRING *PrivateData)
 {
-    FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
+    FIXME("LsaRetrievePrivateData(%p %p %p) stub\n",
+          PolicyHandle, KeyName, PrivateData);
     return STATUS_OBJECT_NAME_NOT_FOUND;
 }
 
+
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaSetDomainInformationPolicy(IN LSA_HANDLE PolicyHandle,
+                              IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
+                              IN PVOID Buffer OPTIONAL)
+{
+    NTSTATUS Status;
+
+    TRACE("LsaSetDomainInformationPolicy(%p %d %p)\n",
+          PolicyHandle, InformationClass, Buffer);
+
+    RpcTryExcept
+    {
+        Status = LsarSetDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle,
+                                                InformationClass,
+                                                (PLSAPR_POLICY_DOMAIN_INFORMATION)Buffer);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaSetDomainInformationPolicy(
-    LSA_HANDLE PolicyHandle,
-    POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
-    PVOID Buffer)
+LsaSetForestTrustInformation(IN LSA_HANDLE PolicyHandle,
+                             IN PLSA_UNICODE_STRING TrustedDomainName,
+                             IN PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo,
+                             IN BOOL CheckOnly,
+                             OUT PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo)
 {
-    FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer);
-    return STATUS_UNSUCCESSFUL;
+    FIXME("LsaSetForestTrustInformation(%p %p %p %d %p) stub\n",
+          PolicyHandle, TrustedDomainName, ForestTrustInfo, CheckOnly, CollisionInfo);
+    return STATUS_NOT_IMPLEMENTED;
 }
 
 
@@ -1209,7 +1728,7 @@ LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle,
 {
     NTSTATUS Status;
 
-    TRACE("LsaSetInformationPolicy(%p 0x%08x %p)\n",
+    TRACE("LsaSetInformationPolicy(%p %d %p)\n",
           PolicyHandle, InformationClass, Buffer);
 
     RpcTryExcept
@@ -1228,6 +1747,49 @@ LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle,
 }
 
 
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaSetInformationTrustedDomain(IN LSA_HANDLE TrustedDomainHandle,
+                               IN TRUSTED_INFORMATION_CLASS InformationClass,
+                               IN PVOID Buffer)
+{
+    FIXME("LsaSetInformationTrustedDomain(%p %d %p)\n",
+          TrustedDomainHandle, InformationClass, Buffer);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS
+WINAPI
+LsaSetQuotasForAccount(IN LSA_HANDLE AccountHandle,
+                       IN PQUOTA_LIMITS QuotaLimits)
+{
+    NTSTATUS Status;
+
+    TRACE("LsaSetQuotasForAccount(%p %p)\n",
+          AccountHandle, QuotaLimits);
+
+    RpcTryExcept
+    {
+        Status = LsarSetQuotasForAccount((LSAPR_HANDLE)AccountHandle,
+                                         QuotaLimits);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
+}
+
+
 /*
  * @implemented
  */
@@ -1242,7 +1804,7 @@ LsaSetSecret(IN LSA_HANDLE SecretHandle,
     SIZE_T BufferSize;
     NTSTATUS Status;
 
-    TRACE("LsaSetSecret(%p,%p,%p)\n",
+    TRACE("LsaSetSecret(%p %p %p)\n",
           SecretHandle, EncryptedCurrentValue, EncryptedOldValue);
 
     if (CurrentValue != NULL)
@@ -1307,18 +1869,40 @@ done:
  */
 NTSTATUS
 WINAPI
-LsaSetSystemAccessAccount(IN LSA_HANDLE AccountHandle,
-                          IN ULONG SystemAccess)
+LsaSetSecurityObject(IN LSA_HANDLE ObjectHandle,
+                     IN SECURITY_INFORMATION SecurityInformation,
+                     IN PSECURITY_DESCRIPTOR SecurityDescriptor)
 {
+    LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer = {0, NULL};
+    ULONG SdLength = 0;
     NTSTATUS Status;
 
-    TRACE("LsaSetSystemAccessAccount(%p 0x%lx)\n",
-          AccountHandle, SystemAccess);
+    TRACE("LsaSetSecurityObject(%p %lx %p)\n",
+          ObjectHandle, SecurityInformation, SecurityDescriptor);
+
+    Status = RtlMakeSelfRelativeSD(SecurityDescriptor,
+                                   NULL,
+                                   &SdLength);
+    if (Status != STATUS_BUFFER_TOO_SMALL)
+        return STATUS_INVALID_PARAMETER;
+
+    SdBuffer.SecurityDescriptor = MIDL_user_allocate(SdLength);
+    if (SdBuffer.SecurityDescriptor == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = RtlMakeSelfRelativeSD(SecurityDescriptor,
+                                   (PSECURITY_DESCRIPTOR)SdBuffer.SecurityDescriptor,
+                                   &SdLength);
+    if (!NT_SUCCESS(Status))
+        goto done;
+
+    SdBuffer.Length = SdLength;
 
     RpcTryExcept
     {
-        Status = LsarSetSystemAccessAccount((LSAPR_HANDLE)AccountHandle,
-                                            SystemAccess);
+        Status = LsarSetSecurityObject((LSAPR_HANDLE)ObjectHandle,
+                                       SecurityInformation,
+                                       &SdBuffer);
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -1326,117 +1910,100 @@ LsaSetSystemAccessAccount(IN LSA_HANDLE AccountHandle,
     }
     RpcEndExcept;
 
+done:
+    if (SdBuffer.SecurityDescriptor != NULL)
+        MIDL_user_free(SdBuffer.SecurityDescriptor);
+
     return Status;
 }
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 WINAPI
-LsaSetForestTrustInformation(
-    LSA_HANDLE PolicyHandle,
-    PLSA_UNICODE_STRING TrustedDomainName,
-    PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo,
-    BOOL CheckOnly,
-    PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo)
+LsaSetSystemAccessAccount(IN LSA_HANDLE AccountHandle,
+                          IN ULONG SystemAccess)
 {
-    FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainName, ForestTrustInfo, CheckOnly, CollisionInfo);
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+
+    TRACE("LsaSetSystemAccessAccount(%p 0x%lx)\n",
+          AccountHandle, SystemAccess);
+
+    RpcTryExcept
+    {
+        Status = LsarSetSystemAccessAccount((LSAPR_HANDLE)AccountHandle,
+                                            SystemAccess);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return Status;
 }
 
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaSetTrustedDomainInfoByName(
-    LSA_HANDLE PolicyHandle,
-    PLSA_UNICODE_STRING TrustedDomainName,
-    TRUSTED_INFORMATION_CLASS InformationClass,
-    PVOID Buffer)
+LsaSetTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle,
+                              IN PLSA_UNICODE_STRING TrustedDomainName,
+                              IN TRUSTED_INFORMATION_CLASS InformationClass,
+                              IN PVOID Buffer)
 {
-    FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer);
+    FIXME("LsaSetTrustedDomainInfoByName(%p %p %d %p) stub\n",
+          PolicyHandle, TrustedDomainName, InformationClass, Buffer);
     return STATUS_SUCCESS;
 }
 
-/*
- * @unimplemented
- */
-NTSTATUS WINAPI LsaRegisterPolicyChangeNotification(
-    POLICY_NOTIFICATION_INFORMATION_CLASS class,
-    HANDLE event)
-{
-    FIXME("(%d,%p) stub\n", class, event);
-    return STATUS_UNSUCCESSFUL;
-}
 
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaSetTrustedDomainInformation(
-    LSA_HANDLE PolicyHandle,
-    PSID TrustedDomainSid,
-    TRUSTED_INFORMATION_CLASS InformationClass,
-    PVOID Buffer)
+LsaSetTrustedDomainInformation(IN LSA_HANDLE PolicyHandle,
+                               IN PSID TrustedDomainSid,
+                               IN TRUSTED_INFORMATION_CLASS InformationClass,
+                               IN PVOID Buffer)
 {
-    FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
+    FIXME("LsaSetTrustedDomainInformation(%p %p %d %p) stub\n",
+          PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
     return STATUS_SUCCESS;
 }
 
+
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaStorePrivateData(
-    LSA_HANDLE PolicyHandle,
-    PLSA_UNICODE_STRING KeyName,
-    PLSA_UNICODE_STRING PrivateData)
+LsaStorePrivateData(IN LSA_HANDLE PolicyHandle,
+                    IN PLSA_UNICODE_STRING KeyName,
+                    IN PLSA_UNICODE_STRING PrivateData OPTIONAL)
 {
-    FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
+    FIXME("LsaStorePrivateData(%p %p %p) stub\n",
+          PolicyHandle, KeyName, PrivateData);
     return STATUS_OBJECT_NAME_NOT_FOUND;
 }
 
-/*
- * @unimplemented
- */
-NTSTATUS WINAPI LsaUnregisterPolicyChangeNotification(
-    POLICY_NOTIFICATION_INFORMATION_CLASS class,
-    HANDLE event)
-{
-    FIXME("(%d,%p) stub\n", class, event);
-    return STATUS_SUCCESS;
-}
 
 /*
  * @unimplemented
  */
 NTSTATUS
 WINAPI
-LsaGetUserName(
-    PUNICODE_STRING *UserName,
-    PUNICODE_STRING *DomainName)
+LsaUnregisterPolicyChangeNotification(IN POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
+                                      IN HANDLE NotificationEventHandle)
 {
-    FIXME("(%p,%p) stub\n", UserName, DomainName);
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-WINAPI
-LsaQueryInfoTrustedDomain (DWORD Unknonw0,
-                          DWORD Unknonw1,
-                          DWORD Unknonw2)
-{
-    FIXME("(%d,%d,%d) stub\n", Unknonw0, Unknonw1, Unknonw2);
-    return STATUS_NOT_IMPLEMENTED;
+    FIXME("(%d %p) stub\n",
+          InformationClass, NotificationEventHandle);
+    return STATUS_SUCCESS;
 }
 
-
 /* EOF */