Author: ekohl
Date: Sun Jun 24 21:42:13 2012
New Revision: 56801
URL:
http://svn.reactos.org/svn/reactos?rev=56801&view=rev
Log:
[SAMSRV]
Implement SamrQueryInformationAlias and simplify SamrSetInformationAlias.
Modified:
trunk/reactos/dll/win32/samsrv/samrpc.c
Modified: trunk/reactos/dll/win32/samsrv/samrpc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samrpc.c?…
==============================================================================
--- trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] Sun Jun 24 21:42:13 2012
@@ -1506,6 +1506,254 @@
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
@@ -1529,22 +1777,20 @@
switch (AliasInformationClass)
{
-#if 0
case AliasGeneralInformation:
Status = SampQueryAliasGeneral(AliasObject,
- &Buffer->General);
+ Buffer);
break;
case AliasNameInformation:
Status = SampQueryAliasName(AliasObject,
- &Buffer->Name);
+ Buffer);
break;
case AliasAdminCommentInformation:
Status = SampQueryAliasAdminComment(AliasObject,
- &Buffer->AdminComment);
+ Buffer);
break;
-#endif
default:
Status = STATUS_INVALID_INFO_CLASS;
@@ -1557,30 +1803,30 @@
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,
- 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,
- PSAMPR_ALIAS_ADM_COMMENT_INFORMATION AliasAdminCommentInfo)
+ PSAMPR_ALIAS_INFO_BUFFER Buffer)
{
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;
}
@@ -1610,12 +1856,12 @@
{
case AliasNameInformation:
Status = SampSetAliasName(AliasObject,
- &Buffer->Name);
+ Buffer);
break;
case AliasAdminCommentInformation:
Status = SampSetAliasAdminComment(AliasObject,
- &Buffer->AdminComment);
+ Buffer);
break;
default: