From 74d50a4da32e91cb9b1fc2b3cbe94789b14c307a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 16 Dec 2018 20:41:36 +0100 Subject: [PATCH] [SAMSRV] Implement SamConnect5() and add/improve TRACE messages. - Implement SamConnect5() and let the other connect functions call SamrConnect5(). - Add missing and improve incomplete TRACE messages for all Samr functions. --- dll/win32/samsrv/samrpc.c | 171 ++++++++++++++++++++++++++------------ 1 file changed, 120 insertions(+), 51 deletions(-) diff --git a/dll/win32/samsrv/samrpc.c b/dll/win32/samsrv/samrpc.c index 5d3595c14a3..0bea2e0d5f9 100644 --- a/dll/win32/samsrv/samrpc.c +++ b/dll/win32/samsrv/samrpc.c @@ -135,35 +135,22 @@ SamrConnect(IN PSAMPR_SERVER_NAME ServerName, OUT SAMPR_HANDLE *ServerHandle, IN ACCESS_MASK DesiredAccess) { - PSAM_DB_OBJECT ServerObject; - NTSTATUS Status; + SAMPR_REVISION_INFO InRevisionInfo, OutRevisionInfo; + ULONG OutVersion; TRACE("SamrConnect(%p %p %lx)\n", ServerName, ServerHandle, DesiredAccess); - RtlAcquireResourceShared(&SampResource, - TRUE); + InRevisionInfo.V1.Revision = 0; + InRevisionInfo.V1.SupportedFeatures = 0; - /* Map generic access rights */ - RtlMapGenericMask(&DesiredAccess, - &ServerMapping); - - /* Open the Server Object */ - Status = SampOpenDbObject(NULL, - NULL, - L"SAM", - 0, - SamDbServerObject, - DesiredAccess, - &ServerObject); - if (NT_SUCCESS(Status)) - *ServerHandle = (SAMPR_HANDLE)ServerObject; - - RtlReleaseResource(&SampResource); - - TRACE("SamrConnect done (Status 0x%08lx)\n", Status); - - return Status; + return SamrConnect5(ServerName, + DesiredAccess, + 1, + &InRevisionInfo, + &OutVersion, + &OutRevisionInfo, + ServerHandle); } @@ -351,7 +338,7 @@ SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle, ULONG ResultSdSize = 0; NTSTATUS Status; - TRACE("(%p %lx %p)\n", + TRACE("SamrQuerySecurityObject(%p %lx %p)\n", ObjectHandle, SecurityInformation, SecurityDescriptor); *SecurityDescriptor = NULL; @@ -480,7 +467,8 @@ SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle) PSAM_DB_OBJECT ServerObject; NTSTATUS Status; - TRACE("(%p)\n", ServerHandle); + TRACE("SamrShutdownSamServer(%p)\n", + ServerHandle); RtlAcquireResourceShared(&SampResource, TRUE); @@ -4581,7 +4569,7 @@ SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle, PSAM_DB_OBJECT UserObject = NULL; NTSTATUS Status; - TRACE("(%p %lu %lx)\n", + TRACE("SamrAddMemberToGroup(%p %lu %lx)\n", GroupHandle, MemberId, Attributes); RtlAcquireResourceExclusive(&SampResource, @@ -4643,7 +4631,7 @@ SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle) ULONG Length = 0; NTSTATUS Status; - TRACE("(%p)\n", GroupHandle); + TRACE("SamrDeleteGroup(%p)\n", GroupHandle); RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -4712,7 +4700,7 @@ SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle, PSAM_DB_OBJECT UserObject = NULL; NTSTATUS Status; - TRACE("(%p %lu)\n", + TRACE("SamrRemoveMemberFromGroup(%p %lu)\n", GroupHandle, MemberId); RtlAcquireResourceExclusive(&SampResource, @@ -4776,6 +4764,9 @@ SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle, ULONG i; NTSTATUS Status; + TRACE("SamrGetMembersInGroup(%p %p)\n", + GroupHandle, Members); + RtlAcquireResourceShared(&SampResource, TRUE); @@ -4885,6 +4876,9 @@ SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle, PSAM_DB_OBJECT GroupObject; NTSTATUS Status; + TRACE("SamrSetMemberAttributesOfGroup(%p %lu %lx)\n", + GroupHandle, MemberId, Attributes); + RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -5324,6 +5318,8 @@ SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle) PSAM_DB_OBJECT AliasObject; NTSTATUS Status; + TRACE("SamrDeleteAlias(%p)\n", AliasHandle); + RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -5381,7 +5377,8 @@ SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle, PSAM_DB_OBJECT AliasObject; NTSTATUS Status; - TRACE("(%p %p)\n", AliasHandle, MemberId); + TRACE("SamrAddMemberToAlias(%p %p)\n", + AliasHandle, MemberId); RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -5420,7 +5417,8 @@ SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle, PSAM_DB_OBJECT AliasObject; NTSTATUS Status; - TRACE("(%p %p)\n", AliasHandle, MemberId); + TRACE("SamrRemoveMemberFromAlias(%p %p)\n", + AliasHandle, MemberId); RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -5580,7 +5578,7 @@ SamrDeleteUser(IN OUT SAMPR_HANDLE *UserHandle) PSAM_DB_OBJECT UserObject; NTSTATUS Status; - TRACE("(%p)\n", UserHandle); + TRACE("SamrDeleteUser(%p)\n", UserHandle); RtlAcquireResourceExclusive(&SampResource, TRUE); @@ -8356,7 +8354,7 @@ SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle, DBG_UNREFERENCED_LOCAL_VARIABLE(StoredNtPresent); DBG_UNREFERENCED_LOCAL_VARIABLE(StoredLmEmpty); - TRACE("(%p %u %p %p %u %p %p %u %p %u %p)\n", + TRACE("SamrChangePasswordUser(%p %u %p %p %u %p %p %u %p %u %p)\n", UserHandle, LmPresent, OldLmEncryptedWithNewLm, NewLmEncryptedWithOldLm, NtPresent, OldNtEncryptedWithNewNt, NewNtEncryptedWithOldNt, NtCrossEncryptionPresent, NewNtEncryptedWithNewLm, LmCrossEncryptionPresent, NewLmEncryptedWithNewNt); @@ -8764,7 +8762,7 @@ SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle, ULONG Length = 0; NTSTATUS Status; - TRACE("(%p %p)\n", + TRACE("SamrGetUserDomainPasswordInformation(%p %p)\n", UserHandle, PasswordInformation); RtlAcquireResourceShared(&SampResource, @@ -8849,7 +8847,7 @@ SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle, ULONG Rid = 0; NTSTATUS Status; - TRACE("(%p %p)\n", + TRACE("SamrRemoveMemberFromForeignDomain(%p %p)\n", DomainHandle, MemberSid); RtlAcquireResourceExclusive(&SampResource, @@ -8905,7 +8903,8 @@ SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, OUT PSAMPR_DOMAIN_INFO_BUFFER *Buffer) { - TRACE("(%p %lu %p)\n", DomainHandle, DomainInformationClass, Buffer); + TRACE("SamrQueryInformationDomain2(%p %lu %p)\n", + DomainHandle, DomainInformationClass, Buffer); return SamrQueryInformationDomain(DomainHandle, DomainInformationClass, @@ -8920,7 +8919,8 @@ SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, OUT PSAMPR_USER_INFO_BUFFER *Buffer) { - TRACE("(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer); + TRACE("SamrQueryInformationUser2(%p %lu %p)\n", + UserHandle, UserInformationClass, Buffer); return SamrQueryInformationUser(UserHandle, UserInformationClass, @@ -8940,7 +8940,7 @@ SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle, OUT unsigned long *TotalReturned, OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer) { - TRACE("%p %lu %lu %lu %lu %p %p %p\n", + TRACE("SamrQueryDisplayInformation2(%p %lu %lu %lu %lu %p %p %p)\n", DomainHandle, DisplayInformationClass, Index, EntryCount, PreferredMaximumLength, TotalAvailable, TotalReturned, Buffer); @@ -8964,8 +8964,8 @@ SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle, IN PRPC_UNICODE_STRING Prefix, OUT unsigned long *Index) { - TRACE("(%p %lu %p %p)\n", - DomainHandle, DisplayInformationClass, Prefix, Index); + TRACE("SamrGetDisplayEnumerationIndex2(%p %lu %p %p)\n", + DomainHandle, DisplayInformationClass, Prefix, Index); return SamrGetDisplayEnumerationIndex(DomainHandle, DisplayInformationClass, @@ -9401,7 +9401,7 @@ SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle, OUT unsigned long *TotalReturned, OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer) { - TRACE("%p %lu %lu %lu %lu %p %p %p\n", + TRACE("SamrQueryDisplayInformation3(%p %lu %lu %lu %lu %p %p %p)\n", DomainHandle, DisplayInformationClass, Index, EntryCount, PreferredMaximumLength, TotalAvailable, TotalReturned, Buffer); @@ -9516,7 +9516,8 @@ SamrGetDomainPasswordInformation(IN handle_t BindingHandle, ULONG Length; NTSTATUS Status; - TRACE("(%p %p %p)\n", BindingHandle, Unused, PasswordInformation); + TRACE("SamrGetDomainPasswordInformation(%p %p %p)\n", + BindingHandle, Unused, PasswordInformation); Status = SamrConnect(NULL, &ServerHandle, @@ -9573,11 +9574,22 @@ SamrConnect2(IN PSAMPR_SERVER_NAME ServerName, OUT SAMPR_HANDLE *ServerHandle, IN ACCESS_MASK DesiredAccess) { - TRACE("(%p %p %lx)\n", ServerName, ServerHandle, DesiredAccess); + SAMPR_REVISION_INFO InRevisionInfo, OutRevisionInfo; + ULONG OutVersion; - return SamrConnect(ServerName, - ServerHandle, - DesiredAccess); + TRACE("SamrConnect2(%p %p %lx)\n", + ServerName, ServerHandle, DesiredAccess); + + InRevisionInfo.V1.Revision = 1; + InRevisionInfo.V1.SupportedFeatures = 0; + + return SamrConnect5(ServerName, + DesiredAccess, + 1, + &InRevisionInfo, + &OutVersion, + &OutRevisionInfo, + ServerHandle); } @@ -9588,7 +9600,8 @@ SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, IN PSAMPR_USER_INFO_BUFFER Buffer) { - TRACE("(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer); + TRACE("SamrSetInformationUser2(%p %lu %p)\n", + UserHandle, UserInformationClass, Buffer); return SamrSetInformationUser(UserHandle, UserInformationClass, @@ -9623,6 +9636,7 @@ SamrConnect3(IN handle_t BindingHandle) /* FIXME */ return STATUS_NOT_IMPLEMENTED; } + /* Function 62 */ NTSTATUS NTAPI @@ -9631,10 +9645,25 @@ SamrConnect4(IN PSAMPR_SERVER_NAME ServerName, IN unsigned long ClientRevision, IN ACCESS_MASK DesiredAccess) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + SAMPR_REVISION_INFO InRevisionInfo, OutRevisionInfo; + ULONG OutVersion; + + TRACE("SamrConnect4(%p %p %lu 0x%lx)\n", + ServerName, ServerHandle, ClientRevision, DesiredAccess); + + InRevisionInfo.V1.Revision = 2; + InRevisionInfo.V1.SupportedFeatures = 0; + + return SamrConnect5(ServerName, + DesiredAccess, + 1, + &InRevisionInfo, + &OutVersion, + &OutRevisionInfo, + ServerHandle); } + /* Function 63 */ NTSTATUS NTAPI @@ -9644,6 +9673,7 @@ SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle) /* FIXME */ return STATUS_NOT_IMPLEMENTED; } + /* Function 64 */ NTSTATUS NTAPI @@ -9655,10 +9685,49 @@ SamrConnect5(IN PSAMPR_SERVER_NAME ServerName, OUT SAMPR_REVISION_INFO *OutRevisionInfo, OUT SAMPR_HANDLE *ServerHandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PSAM_DB_OBJECT ServerObject; + NTSTATUS Status; + + TRACE("SamrConnect5(%p 0x%lx %lu %p %p %p %p)\n", + ServerName, DesiredAccess, InVersion, InRevisionInfo, + OutVersion, OutRevisionInfo, ServerHandle); + + if (InVersion != 1) + return STATUS_NOT_SUPPORTED; + + RtlAcquireResourceShared(&SampResource, + TRUE); + + /* Map generic access rights */ + RtlMapGenericMask(&DesiredAccess, + &ServerMapping); + + /* Open the Server Object */ + Status = SampOpenDbObject(NULL, + NULL, + L"SAM", + 0, + SamDbServerObject, + DesiredAccess, + &ServerObject); + if (NT_SUCCESS(Status)) + { + *OutVersion = 1; + + OutRevisionInfo->V1.Revision = 3; + OutRevisionInfo->V1.SupportedFeatures = 0; + + *ServerHandle = (SAMPR_HANDLE)ServerObject; + } + + RtlReleaseResource(&SampResource); + + TRACE("SamrConnect5 done (Status 0x%08lx)\n", Status); + + return Status; } + /* Function 65 */ NTSTATUS NTAPI