3 * Copyright (C) 2004 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS system libraries
22 * PURPOSE: SAM interface library
23 * FILE: lib/samlib/samlib.c
24 * PROGRAMER: Eric Kohl
29 #define NTOS_MODE_USER
30 #include <ndk/rtlfuncs.h>
34 #include <wine/debug.h>
36 WINE_DEFAULT_DEBUG_CHANNEL(samlib
);
40 SystemFunction006(LPCSTR password
,
45 SystemFunction007(PUNICODE_STRING string
,
48 /* GLOBALS *******************************************************************/
51 /* FUNCTIONS *****************************************************************/
53 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
55 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
59 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
61 HeapFree(GetProcessHeap(), 0, ptr
);
66 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
68 handle_t hBinding
= NULL
;
69 LPWSTR pszStringBinding
;
72 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
74 status
= RpcStringBindingComposeW(NULL
,
82 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
86 /* Set the binding handle that will be used to bind to the server. */
87 status
= RpcBindingFromStringBindingW(pszStringBinding
,
91 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
94 status
= RpcStringFreeW(&pszStringBinding
);
97 // TRACE("RpcStringFree returned 0x%x\n", status);
105 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
110 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
112 status
= RpcBindingFree(&hBinding
);
115 TRACE("RpcBindingFree returned 0x%x\n", status
);
121 SampCheckPassword(IN SAMPR_HANDLE UserHandle
,
122 IN PUNICODE_STRING Password
)
124 USER_DOMAIN_PASSWORD_INFORMATION DomainPasswordInformation
;
125 ULONG PasswordLength
;
128 TRACE("(%p %p)\n", UserHandle
, Password
);
130 /* Get the domain password information */
131 Status
= SamrGetUserDomainPasswordInformation(UserHandle
,
132 &DomainPasswordInformation
);
133 if (!NT_SUCCESS(Status
))
135 TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status
);
139 PasswordLength
= (ULONG
)(Password
->Length
/ sizeof(WCHAR
));
141 /* Fail if the password is too short or too long */
142 if ((PasswordLength
< DomainPasswordInformation
.MinPasswordLength
) ||
143 (PasswordLength
> 256))
144 return STATUS_PASSWORD_RESTRICTION
;
146 /* Check the password complexity */
147 if (DomainPasswordInformation
.PasswordProperties
& DOMAIN_PASSWORD_COMPLEX
)
152 return STATUS_SUCCESS
;
158 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
163 TRACE("SamAddMemberToAlias(%p %p)\n",
164 AliasHandle
, MemberId
);
168 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
171 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
173 Status
= I_RpcMapWin32Status(RpcExceptionCode());
183 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
189 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
190 GroupHandle
, MemberId
, Attributes
);
194 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
198 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
200 Status
= I_RpcMapWin32Status(RpcExceptionCode());
210 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
212 IN ULONG MemberCount
)
214 SAMPR_PSID_ARRAY Buffer
;
217 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
218 AliasHandle
, MemberIds
, MemberCount
);
220 if (MemberIds
== NULL
)
221 return STATUS_INVALID_PARAMETER_2
;
223 Buffer
.Count
= MemberCount
;
224 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
228 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
231 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
233 Status
= I_RpcMapWin32Status(RpcExceptionCode());
243 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
244 IN PUNICODE_STRING OldPassword
,
245 IN PUNICODE_STRING NewPassword
)
247 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
248 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
249 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
250 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
251 OEM_STRING LmPwdString
;
252 CHAR LmPwdBuffer
[15];
253 BOOLEAN OldLmPasswordPresent
= FALSE
;
254 BOOLEAN NewLmPasswordPresent
= FALSE
;
257 /* Calculate the NT hash for the old password */
258 Status
= SystemFunction007(OldPassword
,
259 (LPBYTE
)&OldNtPassword
);
260 if (!NT_SUCCESS(Status
))
262 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
266 /* Calculate the NT hash for the new password */
267 Status
= SystemFunction007(NewPassword
,
268 (LPBYTE
)&NewNtPassword
);
269 if (!NT_SUCCESS(Status
))
271 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
275 /* Calculate the LM password and hash for the old password */
276 LmPwdString
.Length
= 15;
277 LmPwdString
.MaximumLength
= 15;
278 LmPwdString
.Buffer
= LmPwdBuffer
;
279 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
281 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
284 if (NT_SUCCESS(Status
))
286 /* Calculate the LM hash value of the password */
287 Status
= SystemFunction006(LmPwdString
.Buffer
,
288 (LPSTR
)&OldLmPassword
);
289 if (NT_SUCCESS(Status
))
291 OldLmPasswordPresent
= TRUE
;
295 /* Calculate the LM password and hash for the new password */
296 LmPwdString
.Length
= 15;
297 LmPwdString
.MaximumLength
= 15;
298 LmPwdString
.Buffer
= LmPwdBuffer
;
299 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
301 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
304 if (NT_SUCCESS(Status
))
306 /* Calculate the LM hash value of the password */
307 Status
= SystemFunction006(LmPwdString
.Buffer
,
308 (LPSTR
)&NewLmPassword
);
309 if (NT_SUCCESS(Status
))
311 NewLmPasswordPresent
= TRUE
;
317 Status
= SamrChangePasswordUser((SAMPR_HANDLE
)UserHandle
,
318 OldLmPasswordPresent
&& NewLmPasswordPresent
,
329 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
331 Status
= I_RpcMapWin32Status(RpcExceptionCode());
341 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
342 IN PUNICODE_STRING UserName
,
343 IN PUNICODE_STRING OldPassword
,
344 IN PUNICODE_STRING NewPassword
)
347 return STATUS_NOT_IMPLEMENTED
;
353 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
354 IN PUNICODE_STRING UserName
,
355 IN PUNICODE_STRING OldPassword
,
356 IN PUNICODE_STRING NewPassword
,
357 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
358 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
361 return STATUS_NOT_IMPLEMENTED
;
367 SamCloseHandle(IN SAM_HANDLE SamHandle
)
371 TRACE("SamCloseHandle(%p)\n", SamHandle
);
375 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
377 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
379 Status
= I_RpcMapWin32Status(RpcExceptionCode());
389 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
390 OUT PSAM_HANDLE ServerHandle
,
391 IN ACCESS_MASK DesiredAccess
,
392 IN POBJECT_ATTRIBUTES ObjectAttributes
)
396 TRACE("SamConnect(%p %p 0x%08x %p)\n",
397 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
401 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
402 (SAMPR_HANDLE
*)ServerHandle
,
405 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
407 Status
= I_RpcMapWin32Status(RpcExceptionCode());
417 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
418 IN PUNICODE_STRING AccountName
,
419 IN ACCESS_MASK DesiredAccess
,
420 OUT PSAM_HANDLE AliasHandle
,
421 OUT PULONG RelativeId
)
425 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
426 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
433 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
434 (PRPC_UNICODE_STRING
)AccountName
,
436 (SAMPR_HANDLE
*)AliasHandle
,
439 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
441 Status
= I_RpcMapWin32Status(RpcExceptionCode());
451 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
452 IN PUNICODE_STRING AccountName
,
453 IN ACCESS_MASK DesiredAccess
,
454 OUT PSAM_HANDLE GroupHandle
,
455 OUT PULONG RelativeId
)
459 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
460 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
467 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
468 (PRPC_UNICODE_STRING
)AccountName
,
470 (SAMPR_HANDLE
*)GroupHandle
,
473 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
475 Status
= I_RpcMapWin32Status(RpcExceptionCode());
485 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
486 IN PUNICODE_STRING AccountName
,
487 IN ULONG AccountType
,
488 IN ACCESS_MASK DesiredAccess
,
489 OUT PSAM_HANDLE UserHandle
,
490 OUT PULONG GrantedAccess
,
491 OUT PULONG RelativeId
)
495 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
496 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
497 UserHandle
, GrantedAccess
, RelativeId
);
504 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
505 (PRPC_UNICODE_STRING
)AccountName
,
508 (SAMPR_HANDLE
*)UserHandle
,
513 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
515 Status
= I_RpcMapWin32Status(RpcExceptionCode());
525 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
526 IN PUNICODE_STRING AccountName
,
527 IN ACCESS_MASK DesiredAccess
,
528 OUT PSAM_HANDLE UserHandle
,
529 OUT PULONG RelativeId
)
533 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
534 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
541 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
542 (PRPC_UNICODE_STRING
)AccountName
,
544 (SAMPR_HANDLE
*)UserHandle
,
547 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
549 Status
= I_RpcMapWin32Status(RpcExceptionCode());
559 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
561 SAMPR_HANDLE LocalAliasHandle
;
564 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
566 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
568 if (LocalAliasHandle
== NULL
)
569 return STATUS_INVALID_HANDLE
;
573 Status
= SamrDeleteAlias(&LocalAliasHandle
);
575 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
577 Status
= I_RpcMapWin32Status(RpcExceptionCode());
587 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
589 SAMPR_HANDLE LocalGroupHandle
;
592 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
594 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
596 if (LocalGroupHandle
== NULL
)
597 return STATUS_INVALID_HANDLE
;
601 Status
= SamrDeleteGroup(&LocalGroupHandle
);
603 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
605 Status
= I_RpcMapWin32Status(RpcExceptionCode());
615 SamDeleteUser(IN SAM_HANDLE UserHandle
)
617 SAMPR_HANDLE LocalUserHandle
;
620 TRACE("SamDeleteUser(%p)\n", UserHandle
);
622 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
624 if (LocalUserHandle
== NULL
)
625 return STATUS_INVALID_HANDLE
;
629 Status
= SamrDeleteUser(&LocalUserHandle
);
631 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
633 Status
= I_RpcMapWin32Status(RpcExceptionCode());
643 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
644 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
646 IN ULONG PreferedMaximumLength
,
647 OUT PULONG CountReturned
)
649 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
652 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
653 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
656 if ((EnumerationContext
== NULL
) ||
658 (CountReturned
== NULL
))
659 return STATUS_INVALID_PARAMETER
;
665 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
668 PreferedMaximumLength
,
671 if (EnumBuffer
!= NULL
)
673 if (EnumBuffer
->Buffer
!= NULL
)
675 *Buffer
= EnumBuffer
->Buffer
;
678 midl_user_free(EnumBuffer
);
681 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
683 Status
= I_RpcMapWin32Status(RpcExceptionCode());
693 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
694 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
696 IN ULONG PreferedMaximumLength
,
697 OUT PULONG CountReturned
)
699 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
702 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
703 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
706 if ((EnumerationContext
== NULL
) ||
708 (CountReturned
== NULL
))
709 return STATUS_INVALID_PARAMETER
;
715 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
718 PreferedMaximumLength
,
721 if (EnumBuffer
!= NULL
)
723 if (EnumBuffer
->Buffer
!= NULL
)
725 *Buffer
= EnumBuffer
->Buffer
;
728 midl_user_free(EnumBuffer
);
731 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
733 Status
= I_RpcMapWin32Status(RpcExceptionCode());
743 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
744 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
746 IN ULONG PreferedMaximumLength
,
747 OUT PULONG CountReturned
)
749 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
752 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
753 DomainHandle
, EnumerationContext
, Buffer
,
754 PreferedMaximumLength
, CountReturned
);
756 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
757 return STATUS_INVALID_PARAMETER
;
763 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
766 PreferedMaximumLength
,
768 if (EnumBuffer
!= NULL
)
770 if (EnumBuffer
->Buffer
!= NULL
)
771 *Buffer
= EnumBuffer
->Buffer
;
773 midl_user_free(EnumBuffer
);
776 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
778 Status
= I_RpcMapWin32Status(RpcExceptionCode());
788 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
789 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
790 IN ULONG UserAccountControl
,
792 IN ULONG PreferedMaximumLength
,
793 OUT PULONG CountReturned
)
795 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
798 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
799 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
800 PreferedMaximumLength
, CountReturned
);
802 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
803 return STATUS_INVALID_PARAMETER
;
809 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
813 PreferedMaximumLength
,
815 if (EnumBuffer
!= NULL
)
817 if (EnumBuffer
->Buffer
!= NULL
)
819 *Buffer
= EnumBuffer
->Buffer
;
822 midl_user_free(EnumBuffer
);
826 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
828 Status
= I_RpcMapWin32Status(RpcExceptionCode());
838 SamFreeMemory(IN PVOID Buffer
)
841 midl_user_free(Buffer
);
843 return STATUS_SUCCESS
;
849 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
850 IN ULONG PassedCount
,
852 OUT PULONG MembershipCount
,
855 SAMPR_PSID_ARRAY SidArray
;
856 SAMPR_ULONG_ARRAY Membership
;
859 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
860 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
863 MembershipCount
== NULL
||
865 return STATUS_INVALID_PARAMETER
;
867 Membership
.Element
= NULL
;
871 SidArray
.Count
= PassedCount
;
872 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
874 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
877 if (NT_SUCCESS(Status
))
879 *MembershipCount
= Membership
.Count
;
880 *Aliases
= Membership
.Element
;
884 if (Membership
.Element
!= NULL
)
885 midl_user_free(Membership
.Element
);
888 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
890 Status
= I_RpcMapWin32Status(RpcExceptionCode());
900 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
903 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
906 return STATUS_INVALID_PARAMETER
;
908 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
910 return STATUS_SUCCESS
;
916 SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle
,
917 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
918 IN PUNICODE_STRING Prefix
,
923 TRACE("(%p %lu %wZ %p)\n",
924 DomainHandle
, DisplayInformation
, Prefix
, Index
);
926 if ((Prefix
== NULL
) ||
928 return STATUS_INVALID_PARAMETER
;
932 Status
= SamrGetDisplayEnumerationIndex2((SAMPR_HANDLE
)DomainHandle
,
934 (PRPC_UNICODE_STRING
)Prefix
,
937 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
939 Status
= I_RpcMapWin32Status(RpcExceptionCode());
949 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
950 OUT PGROUP_MEMBERSHIP
*Groups
,
951 OUT PULONG MembershipCount
)
953 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
956 TRACE("SamGetGroupsForUser(%p %p %p)\n",
957 UserHandle
, Groups
, MembershipCount
);
961 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
963 if (NT_SUCCESS(Status
))
965 *Groups
= GroupsBuffer
->Groups
;
966 *MembershipCount
= GroupsBuffer
->MembershipCount
;
968 MIDL_user_free(GroupsBuffer
);
972 if (GroupsBuffer
!= NULL
)
974 if (GroupsBuffer
->Groups
!= NULL
)
975 MIDL_user_free(GroupsBuffer
->Groups
);
977 MIDL_user_free(GroupsBuffer
);
981 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
983 Status
= I_RpcMapWin32Status(RpcExceptionCode());
993 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
994 OUT PSID
**MemberIds
,
995 OUT PULONG MemberCount
)
997 SAMPR_PSID_ARRAY_OUT SidArray
;
1000 TRACE("SamGetMembersInAlias(%p %p %p)\n",
1001 AliasHandle
, MemberIds
, MemberCount
);
1003 if ((MemberIds
== NULL
) ||
1004 (MemberCount
== NULL
))
1005 return STATUS_INVALID_PARAMETER
;
1010 SidArray
.Sids
= NULL
;
1014 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
1016 if (NT_SUCCESS(Status
))
1018 *MemberCount
= SidArray
.Count
;
1019 *MemberIds
= (PSID
*)SidArray
.Sids
;
1023 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1025 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1035 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
1036 OUT PULONG
*MemberIds
,
1037 OUT PULONG
*Attributes
,
1038 OUT PULONG MemberCount
)
1040 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
1043 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
1044 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
1048 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
1050 if (NT_SUCCESS(Status
))
1052 *MemberIds
= MembersBuffer
->Members
;
1053 *Attributes
= MembersBuffer
->Attributes
;
1054 *MemberCount
= MembersBuffer
->MemberCount
;
1056 MIDL_user_free(MembersBuffer
);
1060 if (MembersBuffer
!= NULL
)
1062 if (MembersBuffer
->Members
!= NULL
)
1063 MIDL_user_free(MembersBuffer
->Members
);
1065 if (MembersBuffer
->Attributes
!= NULL
)
1066 MIDL_user_free(MembersBuffer
->Attributes
);
1068 MIDL_user_free(MembersBuffer
);
1072 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1074 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1084 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
1085 IN PUNICODE_STRING Name
,
1090 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1091 ServerHandle
, Name
, DomainId
);
1095 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
1096 (PRPC_UNICODE_STRING
)Name
,
1097 (PRPC_SID
*)DomainId
);
1099 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1101 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1111 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
1113 IN PULONG RelativeIds
,
1114 OUT PUNICODE_STRING
*Names
,
1115 OUT PSID_NAME_USE
*Use OPTIONAL
)
1117 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
1118 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1122 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1123 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
1132 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
1138 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1140 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1144 if (NT_SUCCESS(Status
))
1146 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
1149 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1153 for (i
= 0; i
< Count
; i
++)
1155 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
1156 if ((*Names
)[i
].Buffer
== NULL
)
1158 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1163 for (i
= 0; i
< Count
; i
++)
1165 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1166 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1168 RtlCopyMemory((*Names
)[i
].Buffer
,
1169 NamesBuffer
.Element
[i
].Buffer
,
1170 NamesBuffer
.Element
[i
].Length
);
1175 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1178 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1184 Count
* sizeof(SID_NAME_USE
));
1189 if (!NT_SUCCESS(Status
))
1193 for (i
= 0; i
< Count
; i
++)
1195 if ((*Names
)[i
].Buffer
!= NULL
)
1196 midl_user_free((*Names
)[i
].Buffer
);
1199 midl_user_free(*Names
);
1202 if (Use
!= NULL
&& *Use
!= NULL
)
1203 midl_user_free(*Use
);
1206 if (NamesBuffer
.Element
!= NULL
)
1208 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1210 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1211 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1214 midl_user_free(NamesBuffer
.Element
);
1217 if (UseBuffer
.Element
!= NULL
)
1218 midl_user_free(UseBuffer
.Element
);
1226 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1228 IN PUNICODE_STRING Names
,
1229 OUT PULONG
*RelativeIds
,
1230 OUT PSID_NAME_USE
*Use
)
1232 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1233 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1236 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1237 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1239 *RelativeIds
= NULL
;
1244 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1246 (PRPC_UNICODE_STRING
)Names
,
1250 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1252 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1256 if (NT_SUCCESS(Status
))
1258 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1259 if (*RelativeIds
== NULL
)
1261 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1265 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1268 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1272 RtlCopyMemory(*RelativeIds
,
1274 Count
* sizeof(ULONG
));
1278 Count
* sizeof(SID_NAME_USE
));
1282 if (!NT_SUCCESS(Status
))
1284 if (*RelativeIds
!= NULL
)
1285 midl_user_free(*RelativeIds
);
1288 midl_user_free(*Use
);
1291 if (RidBuffer
.Element
!= NULL
)
1292 midl_user_free(RidBuffer
.Element
);
1294 if (UseBuffer
.Element
!= NULL
)
1295 midl_user_free(UseBuffer
.Element
);
1303 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1304 IN ACCESS_MASK DesiredAccess
,
1306 OUT PSAM_HANDLE AliasHandle
)
1310 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1311 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1315 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1318 (SAMPR_HANDLE
*)AliasHandle
);
1320 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1322 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1332 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1333 IN ACCESS_MASK DesiredAccess
,
1335 OUT PSAM_HANDLE DomainHandle
)
1339 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1340 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1344 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1347 (SAMPR_HANDLE
*)DomainHandle
);
1349 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1351 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1361 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1362 IN ACCESS_MASK DesiredAccess
,
1364 OUT PSAM_HANDLE GroupHandle
)
1368 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1369 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1373 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1376 (SAMPR_HANDLE
*)GroupHandle
);
1378 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1380 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1390 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1391 IN ACCESS_MASK DesiredAccess
,
1393 OUT PSAM_HANDLE UserHandle
)
1397 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1398 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1402 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1405 (SAMPR_HANDLE
*)UserHandle
);
1407 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1409 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1419 SamQueryDisplayInformation(IN SAM_HANDLE DomainHandle
,
1420 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
1422 IN ULONG EntryCount
,
1423 IN ULONG PreferredMaximumLength
,
1424 OUT PULONG TotalAvailable
,
1425 OUT PULONG TotalReturned
,
1426 OUT PULONG ReturnedEntryCount
,
1427 OUT PVOID
*SortedBuffer
)
1429 SAMPR_DISPLAY_INFO_BUFFER LocalBuffer
;
1432 TRACE("(%p %lu %lu %lu %lu %p %p %p %p)\n",
1433 DomainHandle
, DisplayInformation
, Index
, EntryCount
,
1434 PreferredMaximumLength
, TotalAvailable
, TotalReturned
,
1435 ReturnedEntryCount
, SortedBuffer
);
1437 if ((TotalAvailable
== NULL
) ||
1438 (TotalReturned
== NULL
) ||
1439 (ReturnedEntryCount
== NULL
) ||
1440 (SortedBuffer
== NULL
))
1441 return STATUS_INVALID_PARAMETER
;
1445 Status
= SamrQueryDisplayInformation3((SAMPR_HANDLE
)DomainHandle
,
1449 PreferredMaximumLength
,
1453 if (NT_SUCCESS(Status
))
1455 switch (DisplayInformation
)
1457 case DomainDisplayUser
:
1458 *ReturnedEntryCount
= LocalBuffer
.UserInformation
.EntriesRead
;
1459 *SortedBuffer
= LocalBuffer
.UserInformation
.Buffer
;
1462 case DomainDisplayMachine
:
1463 *ReturnedEntryCount
= LocalBuffer
.MachineInformation
.EntriesRead
;
1464 *SortedBuffer
= LocalBuffer
.MachineInformation
.Buffer
;
1467 case DomainDisplayGroup
:
1468 *ReturnedEntryCount
= LocalBuffer
.GroupInformation
.EntriesRead
;
1469 *SortedBuffer
= LocalBuffer
.GroupInformation
.Buffer
;
1472 case DomainDisplayOemUser
:
1473 *ReturnedEntryCount
= LocalBuffer
.OemUserInformation
.EntriesRead
;
1474 *SortedBuffer
= LocalBuffer
.OemUserInformation
.Buffer
;
1477 case DomainDisplayOemGroup
:
1478 *ReturnedEntryCount
= LocalBuffer
.OemGroupInformation
.EntriesRead
;
1479 *SortedBuffer
= LocalBuffer
.OemGroupInformation
.Buffer
;
1482 case DomainDisplayServer
:
1489 *ReturnedEntryCount
= 0;
1490 *SortedBuffer
= NULL
;
1493 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1495 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1505 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1506 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1511 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1512 AliasHandle
, AliasInformationClass
, Buffer
);
1516 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1517 AliasInformationClass
,
1518 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1520 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1522 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1532 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1533 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1538 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1539 DomainHandle
, DomainInformationClass
, Buffer
);
1543 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1544 DomainInformationClass
,
1545 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1547 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1549 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1559 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1560 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1565 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1566 GroupHandle
, GroupInformationClass
, Buffer
);
1570 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1571 GroupInformationClass
,
1572 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1574 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1576 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1586 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1587 IN USER_INFORMATION_CLASS UserInformationClass
,
1592 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1593 UserHandle
, UserInformationClass
, Buffer
);
1597 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1598 UserInformationClass
,
1599 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1601 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1603 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1613 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1614 IN SECURITY_INFORMATION SecurityInformation
,
1615 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1617 PSAMPR_SR_SECURITY_DESCRIPTOR SamSecurityDescriptor
= NULL
;
1620 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1621 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1623 *SecurityDescriptor
= NULL
;
1627 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1628 SecurityInformation
,
1629 &SamSecurityDescriptor
);
1631 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1633 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1637 TRACE("SamSecurityDescriptor: %p\n", SamSecurityDescriptor
);
1639 if (SamSecurityDescriptor
!= NULL
)
1641 TRACE("SamSecurityDescriptor->Length: %lu\n", SamSecurityDescriptor
->Length
);
1642 TRACE("SamSecurityDescriptor->SecurityDescriptor: %p\n", SamSecurityDescriptor
->SecurityDescriptor
);
1644 *SecurityDescriptor
= SamSecurityDescriptor
->SecurityDescriptor
;
1646 midl_user_free(SamSecurityDescriptor
);
1655 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1660 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1661 AliasHandle
, MemberId
);
1665 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1668 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1670 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1680 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1685 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1686 DomainHandle
, MemberId
);
1690 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1693 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1695 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1705 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1710 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1711 GroupHandle
, MemberId
);
1715 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1718 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1720 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1730 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1732 IN ULONG MemberCount
)
1734 SAMPR_PSID_ARRAY Buffer
;
1737 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1738 AliasHandle
, MemberIds
, MemberCount
);
1740 if (MemberIds
== NULL
)
1741 return STATUS_INVALID_PARAMETER_2
;
1743 Buffer
.Count
= MemberCount
;
1744 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1748 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1751 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1753 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1763 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1768 return STATUS_NOT_IMPLEMENTED
;
1774 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1775 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1780 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1781 AliasHandle
, AliasInformationClass
, Buffer
);
1785 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1786 AliasInformationClass
,
1789 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1791 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1801 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1802 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1807 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1808 DomainHandle
, DomainInformationClass
, Buffer
);
1812 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1813 DomainInformationClass
,
1816 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1818 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1828 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1829 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1834 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1835 GroupHandle
, GroupInformationClass
, Buffer
);
1839 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1840 GroupInformationClass
,
1843 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1845 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1855 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1856 IN USER_INFORMATION_CLASS UserInformationClass
,
1859 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1860 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1861 USER_ALL_INFORMATION InternalAllBuffer
;
1862 OEM_STRING LmPwdString
;
1863 CHAR LmPwdBuffer
[15];
1866 TRACE("SamSetInformationUser(%p %lu %p)\n",
1867 UserHandle
, UserInformationClass
, Buffer
);
1869 if (UserInformationClass
== UserSetPasswordInformation
)
1871 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1873 Status
= SampCheckPassword(UserHandle
,
1874 (PUNICODE_STRING
)&PasswordBuffer
->Password
);
1875 if (!NT_SUCCESS(Status
))
1877 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1881 /* Calculate the NT hash value of the passord */
1882 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1883 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1884 if (!NT_SUCCESS(Status
))
1886 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1890 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1891 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1893 /* Build the LM password */
1894 LmPwdString
.Length
= 15;
1895 LmPwdString
.MaximumLength
= 15;
1896 LmPwdString
.Buffer
= LmPwdBuffer
;
1897 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
1899 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
1900 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
1902 if (NT_SUCCESS(Status
))
1904 /* Calculate the LM hash value of the password */
1905 Status
= SystemFunction006(LmPwdString
.Buffer
,
1906 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
1907 if (NT_SUCCESS(Status
))
1908 Internal1Buffer
.LmPasswordPresent
= TRUE
;
1911 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1915 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1916 UserInternal1Information
,
1917 (PVOID
)&Internal1Buffer
);
1919 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1921 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1925 if (!NT_SUCCESS(Status
))
1927 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1932 else if (UserInformationClass
== UserAllInformation
)
1934 RtlCopyMemory(&InternalAllBuffer
,
1936 sizeof(USER_ALL_INFORMATION
));
1938 if (InternalAllBuffer
.WhichFields
& (USER_ALL_LMPASSWORDPRESENT
| USER_ALL_NTPASSWORDPRESENT
))
1940 if (InternalAllBuffer
.WhichFields
& USER_ALL_OWFPASSWORD
)
1942 /* Check NT password hash */
1943 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
1945 if (InternalAllBuffer
.NtPassword
.Length
!= sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
1946 return STATUS_INVALID_PARAMETER
;
1949 /* Check LM password hash */
1950 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
1952 if (InternalAllBuffer
.LmPassword
.Length
!= sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
1953 return STATUS_INVALID_PARAMETER
;
1959 * Only allow the NT password to be set.
1960 * The LM password will be created here.
1962 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
1964 TRACE("Do not try to set a clear text LM password!\n");
1965 return STATUS_INVALID_PARAMETER
;
1968 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
1970 Status
= SampCheckPassword(UserHandle
,
1971 &InternalAllBuffer
.NtPassword
);
1972 if (!NT_SUCCESS(Status
))
1974 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1978 /* Calculate the NT password hash */
1979 Status
= SystemFunction007((PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
1980 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1981 if (!NT_SUCCESS(Status
))
1983 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1987 InternalAllBuffer
.NtPasswordPresent
= TRUE
;
1988 InternalAllBuffer
.LmPasswordPresent
= FALSE
;
1990 InternalAllBuffer
.NtPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
1991 InternalAllBuffer
.NtPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
1992 InternalAllBuffer
.NtPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedNtOwfPassword
;
1994 /* Build the LM password */
1995 LmPwdString
.Length
= 15;
1996 LmPwdString
.MaximumLength
= 15;
1997 LmPwdString
.Buffer
= LmPwdBuffer
;
1998 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
2000 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
2001 (PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
2003 if (NT_SUCCESS(Status
))
2005 /* Calculate the LM password hash */
2006 Status
= SystemFunction006(LmPwdString
.Buffer
,
2007 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
2008 if (NT_SUCCESS(Status
))
2010 InternalAllBuffer
.WhichFields
|= USER_ALL_LMPASSWORDPRESENT
;
2011 InternalAllBuffer
.LmPasswordPresent
= TRUE
;
2013 InternalAllBuffer
.LmPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2014 InternalAllBuffer
.LmPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2015 InternalAllBuffer
.LmPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
;
2024 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2026 (PVOID
)&InternalAllBuffer
);
2028 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2030 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2034 if (!NT_SUCCESS(Status
))
2036 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
2044 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2045 UserInformationClass
,
2048 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2050 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2060 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
2062 IN ULONG Attributes
)
2066 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
2067 GroupHandle
, MemberId
, Attributes
);
2071 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
2075 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2077 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2087 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
2088 IN SECURITY_INFORMATION SecurityInformation
,
2089 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
2091 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
2095 TRACE("SamSetSecurityObject(%p %lu %p)\n",
2096 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
2098 /* Retrieve the length of the relative security descriptor */
2100 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2103 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
2104 return STATUS_INVALID_PARAMETER
;
2107 /* Allocate a buffer for the security descriptor */
2108 DescriptorToPass
.Length
= Length
;
2109 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
2110 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
2111 return STATUS_INSUFFICIENT_RESOURCES
;
2113 /* Convert the given security descriptor to a relative security descriptor */
2114 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2115 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
2117 if (!NT_SUCCESS(Status
))
2122 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
2123 SecurityInformation
,
2126 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2128 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2133 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
2134 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
2142 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
2146 TRACE("(%p)\n", ServerHandle
);
2150 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
2152 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2154 Status
= I_RpcMapWin32Status(RpcExceptionCode());