diff --git a/reactos/dll/win32/samsrv/alias.c b/reactos/dll/win32/samsrv/alias.c index 96e70c854a8..6e9c7607076 100644 --- a/reactos/dll/win32/samsrv/alias.c +++ b/reactos/dll/win32/samsrv/alias.c @@ -39,4 +39,191 @@ SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject, AliasObject); } + +NTSTATUS +SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject, + IN PRPC_SID MemberId) +{ + LPWSTR MemberIdString = NULL; + HANDLE MembersKeyHandle = NULL; + HANDLE MemberKeyHandle = NULL; + ULONG MemberIdLength; + NTSTATUS Status; + + TRACE("(%p %p)\n", + AliasObject, MemberId); + + ConvertSidToStringSidW(MemberId, &MemberIdString); + TRACE("Member SID: %S\n", MemberIdString); + + MemberIdLength = RtlLengthSid(MemberId); + + Status = SampRegCreateKey(AliasObject->KeyHandle, + L"Members", + KEY_WRITE, + &MembersKeyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegSetValue(MembersKeyHandle, + MemberIdString, + REG_BINARY, + MemberId, + MemberIdLength); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegSetValue failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegCreateKey(AliasObject->MembersKeyHandle, + MemberIdString, + KEY_WRITE, + &MemberKeyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegSetValue(MemberKeyHandle, + AliasObject->Name, + REG_BINARY, + MemberId, + MemberIdLength); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegSetValue failed with status 0x%08lx\n", Status); + goto done; + } + +done: + if (MemberKeyHandle != NULL) + SampRegCloseKey(MemberKeyHandle); + + if (MembersKeyHandle != NULL) + SampRegCloseKey(MembersKeyHandle); + + if (MemberIdString != NULL) + LocalFree(MemberIdString); + + return Status; +} + + +NTSTATUS +NTAPI +SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject, + IN PRPC_SID MemberId) +{ + LPWSTR MemberIdString = NULL; + HANDLE MembersKeyHandle = NULL; + HANDLE MemberKeyHandle = NULL; + ULONG ulValueCount; + NTSTATUS Status; + + TRACE("(%p %p)\n", + AliasObject, MemberId); + + ConvertSidToStringSidW(MemberId, &MemberIdString); + TRACE("Member SID: %S\n", MemberIdString); + + Status = SampRegOpenKey(AliasObject->MembersKeyHandle, + MemberIdString, + KEY_WRITE | KEY_QUERY_VALUE, + &MemberKeyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegDeleteValue(MemberKeyHandle, + AliasObject->Name); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegQueryKeyInfo(MemberKeyHandle, + NULL, + &ulValueCount); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status); + goto done; + } + + if (ulValueCount == 0) + { + SampRegCloseKey(MemberKeyHandle); + MemberKeyHandle = NULL; + + Status = SampRegDeleteKey(AliasObject->MembersKeyHandle, + MemberIdString); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status); + goto done; + } + } + + Status = SampRegOpenKey(AliasObject->KeyHandle, + L"Members", + KEY_WRITE | KEY_QUERY_VALUE, + &MembersKeyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegDeleteValue(MembersKeyHandle, + MemberIdString); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status); + goto done; + } + + Status = SampRegQueryKeyInfo(MembersKeyHandle, + NULL, + &ulValueCount); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status); + goto done; + } + + if (ulValueCount == 0) + { + SampRegCloseKey(MembersKeyHandle); + MembersKeyHandle = NULL; + + Status = SampRegDeleteKey(AliasObject->KeyHandle, + L"Members"); + if (!NT_SUCCESS(Status)) + { + TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status); + goto done; + } + } + +done: + if (MemberKeyHandle != NULL) + SampRegCloseKey(MemberKeyHandle); + + if (MembersKeyHandle != NULL) + SampRegCloseKey(MembersKeyHandle); + + if (MemberIdString != NULL) + LocalFree(MemberIdString); + + return Status; +} + /* EOF */ diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index d485162fa25..cdce9b44cc0 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -4669,7 +4669,7 @@ SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle) &AliasObject); if (!NT_SUCCESS(Status)) { - TRACE("failed with status 0x%08lx\n", Status); + TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status); return Status; } @@ -4704,14 +4704,9 @@ SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle, IN PRPC_SID MemberId) { PSAM_DB_OBJECT AliasObject; - LPWSTR MemberIdString = NULL; - HANDLE MembersKeyHandle = NULL; - HANDLE MemberKeyHandle = NULL; - ULONG MemberIdLength; NTSTATUS Status; - TRACE("SamrAddMemberToAlias(%p %p)\n", - AliasHandle, MemberId); + TRACE("(%p %p)\n", AliasHandle, MemberId); /* Validate the alias handle */ Status = SampValidateDbObject(AliasHandle, @@ -4724,63 +4719,13 @@ SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle, return Status; } - ConvertSidToStringSidW(MemberId, &MemberIdString); - TRACE("Member SID: %S\n", MemberIdString); - - MemberIdLength = RtlLengthSid(MemberId); - - Status = SampRegCreateKey(AliasObject->KeyHandle, - L"Members", - KEY_WRITE, - &MembersKeyHandle); + Status = SampAddMemberToAlias(AliasObject, + MemberId); if (!NT_SUCCESS(Status)) { - TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status); - goto done; + TRACE("failed with status 0x%08lx\n", Status); } - Status = SampRegSetValue(MembersKeyHandle, - MemberIdString, - REG_BINARY, - MemberId, - MemberIdLength); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegSetValue failed with status 0x%08lx\n", Status); - goto done; - } - - Status = SampRegCreateKey(AliasObject->MembersKeyHandle, - MemberIdString, - KEY_WRITE, - &MemberKeyHandle); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status); - goto done; - } - - Status = SampRegSetValue(MemberKeyHandle, - AliasObject->Name, - REG_BINARY, - MemberId, - MemberIdLength); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegSetValue failed with status 0x%08lx\n", Status); - goto done; - } - -done: - if (MemberKeyHandle != NULL) - SampRegCloseKey(MemberKeyHandle); - - if (MembersKeyHandle != NULL) - SampRegCloseKey(MembersKeyHandle); - - if (MemberIdString != NULL) - LocalFree(MemberIdString); - return Status; } @@ -4792,14 +4737,9 @@ SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle, IN PRPC_SID MemberId) { PSAM_DB_OBJECT AliasObject; - LPWSTR MemberIdString = NULL; - HANDLE MembersKeyHandle = NULL; - HANDLE MemberKeyHandle = NULL; - ULONG ulValueCount; NTSTATUS Status; - TRACE("SamrRemoveMemberFromAlias(%p %p)\n", - AliasHandle, MemberId); + TRACE("(%p %p)\n", AliasHandle, MemberId); /* Validate the alias handle */ Status = SampValidateDbObject(AliasHandle, @@ -4812,101 +4752,13 @@ SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle, return Status; } - ConvertSidToStringSidW(MemberId, &MemberIdString); - TRACE("Member SID: %S\n", MemberIdString); - - Status = SampRegOpenKey(AliasObject->MembersKeyHandle, - MemberIdString, - KEY_WRITE | KEY_QUERY_VALUE, - &MemberKeyHandle); + Status = SampRemoveMemberFromAlias(AliasObject, + MemberId); if (!NT_SUCCESS(Status)) { - TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status); - goto done; + TRACE("failed with status 0x%08lx\n", Status); } - Status = SampRegDeleteValue(MemberKeyHandle, - AliasObject->Name); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status); - goto done; - } - - Status = SampRegQueryKeyInfo(MemberKeyHandle, - NULL, - &ulValueCount); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status); - goto done; - } - - if (ulValueCount == 0) - { - SampRegCloseKey(MemberKeyHandle); - MemberKeyHandle = NULL; - - Status = SampRegDeleteKey(AliasObject->MembersKeyHandle, - MemberIdString); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status); - goto done; - } - } - - Status = SampRegOpenKey(AliasObject->KeyHandle, - L"Members", - KEY_WRITE | KEY_QUERY_VALUE, - &MembersKeyHandle); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status); - goto done; - } - - Status = SampRegDeleteValue(MembersKeyHandle, - MemberIdString); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status); - goto done; - } - - Status = SampRegQueryKeyInfo(MembersKeyHandle, - NULL, - &ulValueCount); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status); - goto done; - } - - if (ulValueCount == 0) - { - SampRegCloseKey(MembersKeyHandle); - MembersKeyHandle = NULL; - - Status = SampRegDeleteKey(AliasObject->KeyHandle, - L"Members"); - if (!NT_SUCCESS(Status)) - { - TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status); - goto done; - } - } - -done: - if (MemberKeyHandle != NULL) - SampRegCloseKey(MemberKeyHandle); - - if (MembersKeyHandle != NULL) - SampRegCloseKey(MembersKeyHandle); - - if (MemberIdString != NULL) - LocalFree(MemberIdString); - return Status; } diff --git a/reactos/dll/win32/samsrv/samsrv.h b/reactos/dll/win32/samsrv/samsrv.h index e0f3fd4bb6f..dffc65ec816 100644 --- a/reactos/dll/win32/samsrv/samsrv.h +++ b/reactos/dll/win32/samsrv/samsrv.h @@ -128,6 +128,15 @@ SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject, IN ACCESS_MASK DesiredAccess, OUT PSAM_DB_OBJECT *AliasObject); +NTSTATUS +SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject, + IN PRPC_SID MemberId); + +NTSTATUS +NTAPI +SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject, + IN PRPC_SID MemberId); + /* database.c */