[SAMSRV]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 24 Jun 2012 21:42:13 +0000 (21:42 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 24 Jun 2012 21:42:13 +0000 (21:42 +0000)
Implement SamrQueryInformationAlias and simplify SamrSetInformationAlias.

svn path=/trunk/; revision=56801

reactos/dll/win32/samsrv/samrpc.c

index 2e2822c..b3426d4 100644 (file)
@@ -1506,6 +1506,254 @@ SamrOpenAlias(IN SAMPR_HANDLE DomainHandle,
     return STATUS_SUCCESS;
 }
 
     return STATUS_SUCCESS;
 }
 
+
+static NTSTATUS
+SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject,
+                      PSAMPR_ALIAS_INFO_BUFFER *Buffer)
+{
+    PSAMPR_ALIAS_INFO_BUFFER InfoBuffer = NULL;
+    HANDLE MembersKeyHandle = NULL;
+    ULONG NameLength = 0;
+    ULONG DescriptionLength = 0;
+    NTSTATUS Status;
+
+    *Buffer = NULL;
+
+    InfoBuffer = midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER));
+    if (InfoBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Name",
+                                    NULL,
+                                    NULL,
+                                    &NameLength);
+    TRACE("Status 0x%08lx\n", Status);
+    if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW)
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    InfoBuffer->General.Name.Length = NameLength - sizeof(WCHAR);
+    InfoBuffer->General.Name.MaximumLength = NameLength;
+    InfoBuffer->General.Name.Buffer = midl_user_allocate(NameLength);
+    if (InfoBuffer->General.Name.Buffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    TRACE("Name Length: %lu\n", NameLength);
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Name",
+                                    NULL,
+                                    (PVOID)InfoBuffer->General.Name.Buffer,
+                                    &NameLength);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Description",
+                                    NULL,
+                                    NULL,
+                                    &DescriptionLength);
+    if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW)
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    InfoBuffer->General.AdminComment.Length = DescriptionLength - sizeof(WCHAR);
+    InfoBuffer->General.AdminComment.MaximumLength = DescriptionLength;
+    InfoBuffer->General.AdminComment.Buffer = midl_user_allocate(DescriptionLength);
+    if (InfoBuffer->General.AdminComment.Buffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    TRACE("Description Length: %lu\n", DescriptionLength);
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Description",
+                                    NULL,
+                                    (PVOID)InfoBuffer->General.AdminComment.Buffer,
+                                    &DescriptionLength);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    /* Open the Members subkey */
+    Status = SampRegOpenKey(AliasObject->KeyHandle,
+                            L"Members",
+                            KEY_READ,
+                            &MembersKeyHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    /* Retrieve the number of members of the alias */
+    Status = SampRegQueryKeyInfo(MembersKeyHandle,
+                                 NULL,
+                                 &InfoBuffer->General.MemberCount);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    *Buffer = InfoBuffer;
+
+done:
+    if (MembersKeyHandle != NULL)
+        SampRegCloseKey(MembersKeyHandle);
+
+    if (!NT_SUCCESS(Status))
+    {
+        if (InfoBuffer != NULL)
+        {
+            if (InfoBuffer->General.Name.Buffer != NULL)
+                midl_user_free(InfoBuffer->General.Name.Buffer);
+
+            if (InfoBuffer->General.AdminComment.Buffer != NULL)
+                midl_user_free(InfoBuffer->General.AdminComment.Buffer);
+
+            midl_user_free(InfoBuffer);
+        }
+    }
+
+    return Status;
+}
+
+
+static NTSTATUS
+SampQueryAliasName(PSAM_DB_OBJECT AliasObject,
+                   PSAMPR_ALIAS_INFO_BUFFER *Buffer)
+{
+    PSAMPR_ALIAS_INFO_BUFFER InfoBuffer = NULL;
+    ULONG Length = 0;
+    NTSTATUS Status;
+
+    *Buffer = NULL;
+
+    InfoBuffer = midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER));
+    if (InfoBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Name",
+                                    NULL,
+                                    NULL,
+                                    &Length);
+    if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW)
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    InfoBuffer->Name.Name.Length = Length - sizeof(WCHAR);
+    InfoBuffer->Name.Name.MaximumLength = Length;
+    InfoBuffer->Name.Name.Buffer = midl_user_allocate(Length);
+    if (InfoBuffer->Name.Name.Buffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    TRACE("Length: %lu\n", Length);
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Name",
+                                    NULL,
+                                    (PVOID)InfoBuffer->Name.Name.Buffer,
+                                    &Length);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("Status 0x%08lx\n", Status);
+        goto done;
+    }
+
+    *Buffer = InfoBuffer;
+
+done:
+    if (!NT_SUCCESS(Status))
+    {
+        if (InfoBuffer != NULL)
+        {
+            if (InfoBuffer->Name.Name.Buffer != NULL)
+                midl_user_free(InfoBuffer->Name.Name.Buffer);
+
+            midl_user_free(InfoBuffer);
+        }
+    }
+
+    return Status;
+}
+
+
+static NTSTATUS
+SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject,
+                           PSAMPR_ALIAS_INFO_BUFFER *Buffer)
+{
+    PSAMPR_ALIAS_INFO_BUFFER InfoBuffer = NULL;
+    ULONG Length = 0;
+    NTSTATUS Status;
+
+    *Buffer = NULL;
+
+    InfoBuffer = midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER));
+    if (InfoBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Description",
+                                    NULL,
+                                    NULL,
+                                    &Length);
+    if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW)
+        goto done;
+
+    InfoBuffer->AdminComment.AdminComment.Length = Length - sizeof(WCHAR);
+    InfoBuffer->AdminComment.AdminComment.MaximumLength = Length;
+    InfoBuffer->AdminComment.AdminComment.Buffer = midl_user_allocate(Length);
+    if (InfoBuffer->AdminComment.AdminComment.Buffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    Status = SampGetObjectAttribute(AliasObject,
+                                    L"Description",
+                                    NULL,
+                                    (PVOID)InfoBuffer->AdminComment.AdminComment.Buffer,
+                                    &Length);
+    if (!NT_SUCCESS(Status))
+        goto done;
+
+    *Buffer = InfoBuffer;
+
+done:
+    if (!NT_SUCCESS(Status))
+    {
+        if (InfoBuffer != NULL)
+        {
+            if (InfoBuffer->AdminComment.AdminComment.Buffer != NULL)
+                midl_user_free(InfoBuffer->AdminComment.AdminComment.Buffer);
+
+            midl_user_free(InfoBuffer);
+        }
+    }
+
+    return Status;
+}
+
+
 /* Function 28 */
 NTSTATUS
 NTAPI
 /* Function 28 */
 NTSTATUS
 NTAPI
@@ -1529,22 +1777,20 @@ SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle,
 
     switch (AliasInformationClass)
     {
 
     switch (AliasInformationClass)
     {
-#if 0
         case AliasGeneralInformation:
             Status = SampQueryAliasGeneral(AliasObject,
         case AliasGeneralInformation:
             Status = SampQueryAliasGeneral(AliasObject,
-                                           &Buffer->General);
+                                           Buffer);
             break;
 
         case AliasNameInformation:
             Status = SampQueryAliasName(AliasObject,
             break;
 
         case AliasNameInformation:
             Status = SampQueryAliasName(AliasObject,
-                                        &Buffer->Name);
+                                        Buffer);
             break;
 
         case AliasAdminCommentInformation:
             Status = SampQueryAliasAdminComment(AliasObject,
             break;
 
         case AliasAdminCommentInformation:
             Status = SampQueryAliasAdminComment(AliasObject,
-                                                &Buffer->AdminComment);
+                                                Buffer);
             break;
             break;
-#endif
 
         default:
             Status = STATUS_INVALID_INFO_CLASS;
 
         default:
             Status = STATUS_INVALID_INFO_CLASS;
@@ -1557,30 +1803,30 @@ SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle,
 
 static NTSTATUS
 SampSetAliasName(PSAM_DB_OBJECT AliasObject,
 
 static NTSTATUS
 SampSetAliasName(PSAM_DB_OBJECT AliasObject,
-                 PSAMPR_ALIAS_NAME_INFORMATION AliasNameInfo)
+                 PSAMPR_ALIAS_INFO_BUFFER Buffer)
 {
     NTSTATUS Status;
 
     Status = SampSetObjectAttribute(AliasObject,
                                     L"Name",
                                     REG_SZ,
 {
     NTSTATUS Status;
 
     Status = SampSetObjectAttribute(AliasObject,
                                     L"Name",
                                     REG_SZ,
-                                    AliasNameInfo->Name.Buffer,
-                                    AliasNameInfo->Name.Length + sizeof(WCHAR));
+                                    Buffer->Name.Name.Buffer,
+                                    Buffer->Name.Name.Length + sizeof(WCHAR));
 
     return Status;
 }
 
 static NTSTATUS
 SampSetAliasAdminComment(PSAM_DB_OBJECT AliasObject,
 
     return Status;
 }
 
 static NTSTATUS
 SampSetAliasAdminComment(PSAM_DB_OBJECT AliasObject,
-                         PSAMPR_ALIAS_ADM_COMMENT_INFORMATION AliasAdminCommentInfo)
+                         PSAMPR_ALIAS_INFO_BUFFER Buffer)
 {
     NTSTATUS Status;
 
     Status = SampSetObjectAttribute(AliasObject,
                                     L"Description",
                                     REG_SZ,
 {
     NTSTATUS Status;
 
     Status = SampSetObjectAttribute(AliasObject,
                                     L"Description",
                                     REG_SZ,
-                                    AliasAdminCommentInfo->AdminComment.Buffer,
-                                    AliasAdminCommentInfo->AdminComment.Length + sizeof(WCHAR));
+                                    Buffer->AdminComment.AdminComment.Buffer,
+                                    Buffer->AdminComment.AdminComment.Length + sizeof(WCHAR));
 
     return Status;
 }
 
     return Status;
 }
@@ -1610,12 +1856,12 @@ SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle,
     {
         case AliasNameInformation:
             Status = SampSetAliasName(AliasObject,
     {
         case AliasNameInformation:
             Status = SampSetAliasName(AliasObject,
-                                      &Buffer->Name);
+                                      Buffer);
             break;
 
         case AliasAdminCommentInformation:
             Status = SampSetAliasAdminComment(AliasObject,
             break;
 
         case AliasAdminCommentInformation:
             Status = SampSetAliasAdminComment(AliasObject,
-                                              &Buffer->AdminComment);
+                                              Buffer);
             break;
 
         default:
             break;
 
         default: