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?r... ============================================================================== --- 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: