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
,
50 SystemFunction012(const BYTE
*in
,
54 /* GLOBALS *******************************************************************/
57 /* FUNCTIONS *****************************************************************/
59 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
61 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
65 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
67 HeapFree(GetProcessHeap(), 0, ptr
);
72 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
74 handle_t hBinding
= NULL
;
75 LPWSTR pszStringBinding
;
78 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
80 status
= RpcStringBindingComposeW(NULL
,
88 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
92 /* Set the binding handle that will be used to bind to the server. */
93 status
= RpcBindingFromStringBindingW(pszStringBinding
,
97 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
100 status
= RpcStringFreeW(&pszStringBinding
);
103 // TRACE("RpcStringFree returned 0x%x\n", status);
111 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
116 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
118 status
= RpcBindingFree(&hBinding
);
121 TRACE("RpcBindingFree returned 0x%x\n", status
);
127 SampCheckPassword(IN SAMPR_HANDLE UserHandle
,
128 IN PUNICODE_STRING Password
)
130 USER_DOMAIN_PASSWORD_INFORMATION DomainPasswordInformation
;
131 ULONG PasswordLength
;
134 TRACE("(%p %p)\n", UserHandle
, Password
);
136 /* Get the domain password information */
137 Status
= SamrGetUserDomainPasswordInformation(UserHandle
,
138 &DomainPasswordInformation
);
139 if (!NT_SUCCESS(Status
))
141 TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status
);
145 PasswordLength
= (ULONG
)(Password
->Length
/ sizeof(WCHAR
));
147 /* Fail if the password is too short or too long */
148 if ((PasswordLength
< DomainPasswordInformation
.MinPasswordLength
) ||
149 (PasswordLength
> 256))
150 return STATUS_PASSWORD_RESTRICTION
;
152 /* Check the password complexity */
153 if (DomainPasswordInformation
.PasswordProperties
& DOMAIN_PASSWORD_COMPLEX
)
158 return STATUS_SUCCESS
;
164 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
169 TRACE("SamAddMemberToAlias(%p %p)\n",
170 AliasHandle
, MemberId
);
174 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
177 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
179 Status
= I_RpcMapWin32Status(RpcExceptionCode());
189 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
195 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
196 GroupHandle
, MemberId
, Attributes
);
200 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
204 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
206 Status
= I_RpcMapWin32Status(RpcExceptionCode());
216 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
218 IN ULONG MemberCount
)
220 SAMPR_PSID_ARRAY Buffer
;
223 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
224 AliasHandle
, MemberIds
, MemberCount
);
226 if (MemberIds
== NULL
)
227 return STATUS_INVALID_PARAMETER_2
;
229 Buffer
.Count
= MemberCount
;
230 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
234 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
237 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
239 Status
= I_RpcMapWin32Status(RpcExceptionCode());
249 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
250 IN PUNICODE_STRING OldPassword
,
251 IN PUNICODE_STRING NewPassword
)
253 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
254 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
255 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
256 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
257 OEM_STRING LmPwdString
;
258 CHAR LmPwdBuffer
[15];
259 BOOLEAN OldLmPasswordPresent
= FALSE
;
260 BOOLEAN NewLmPasswordPresent
= FALSE
;
263 ENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
;
264 ENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
;
265 ENCRYPTED_LM_OWF_PASSWORD OldNtEncryptedWithNewNt
;
266 ENCRYPTED_LM_OWF_PASSWORD NewNtEncryptedWithOldNt
;
267 PENCRYPTED_LM_OWF_PASSWORD pOldLmEncryptedWithNewLm
= NULL
;
268 PENCRYPTED_LM_OWF_PASSWORD pNewLmEncryptedWithOldLm
= NULL
;
270 /* Calculate the NT hash for the old password */
271 Status
= SystemFunction007(OldPassword
,
272 (LPBYTE
)&OldNtPassword
);
273 if (!NT_SUCCESS(Status
))
275 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
279 /* Calculate the NT hash for the new password */
280 Status
= SystemFunction007(NewPassword
,
281 (LPBYTE
)&NewNtPassword
);
282 if (!NT_SUCCESS(Status
))
284 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
288 /* Calculate the LM password and hash for the old password */
289 LmPwdString
.Length
= 15;
290 LmPwdString
.MaximumLength
= 15;
291 LmPwdString
.Buffer
= LmPwdBuffer
;
292 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
294 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
297 if (NT_SUCCESS(Status
))
299 /* Calculate the LM hash value of the password */
300 Status
= SystemFunction006(LmPwdString
.Buffer
,
301 (LPSTR
)&OldLmPassword
);
302 if (NT_SUCCESS(Status
))
304 OldLmPasswordPresent
= TRUE
;
308 /* Calculate the LM password and hash for the new password */
309 LmPwdString
.Length
= 15;
310 LmPwdString
.MaximumLength
= 15;
311 LmPwdString
.Buffer
= LmPwdBuffer
;
312 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
314 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
317 if (NT_SUCCESS(Status
))
319 /* Calculate the LM hash value of the password */
320 Status
= SystemFunction006(LmPwdString
.Buffer
,
321 (LPSTR
)&NewLmPassword
);
322 if (NT_SUCCESS(Status
))
324 NewLmPasswordPresent
= TRUE
;
328 if (OldLmPasswordPresent
&& NewLmPasswordPresent
)
330 Status
= SystemFunction012((const BYTE
*)&OldLmPassword
,
331 (const BYTE
*)&NewLmPassword
,
332 (LPBYTE
)&OldLmEncryptedWithNewLm
);
333 if (!NT_SUCCESS(Status
))
335 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
339 Status
= SystemFunction012((const BYTE
*)&NewLmPassword
,
340 (const BYTE
*)&OldLmPassword
,
341 (LPBYTE
)&NewLmEncryptedWithOldLm
);
342 if (!NT_SUCCESS(Status
))
344 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
348 pOldLmEncryptedWithNewLm
= &OldLmEncryptedWithNewLm
;
349 pNewLmEncryptedWithOldLm
= &NewLmEncryptedWithOldLm
;
352 Status
= SystemFunction012((const BYTE
*)&OldNtPassword
,
353 (const BYTE
*)&NewNtPassword
,
354 (LPBYTE
)&OldNtEncryptedWithNewNt
);
355 if (!NT_SUCCESS(Status
))
357 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
361 Status
= SystemFunction012((const BYTE
*)&NewNtPassword
,
362 (const BYTE
*)&OldNtPassword
,
363 (LPBYTE
)&NewNtEncryptedWithOldNt
);
364 if (!NT_SUCCESS(Status
))
366 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
372 Status
= SamrChangePasswordUser((SAMPR_HANDLE
)UserHandle
,
373 OldLmPasswordPresent
&& NewLmPasswordPresent
,
374 pOldLmEncryptedWithNewLm
,
375 pNewLmEncryptedWithOldLm
,
377 &OldNtEncryptedWithNewNt
,
378 &NewNtEncryptedWithOldNt
,
384 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
386 Status
= I_RpcMapWin32Status(RpcExceptionCode());
396 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
397 IN PUNICODE_STRING UserName
,
398 IN PUNICODE_STRING OldPassword
,
399 IN PUNICODE_STRING NewPassword
)
402 return STATUS_NOT_IMPLEMENTED
;
408 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
409 IN PUNICODE_STRING UserName
,
410 IN PUNICODE_STRING OldPassword
,
411 IN PUNICODE_STRING NewPassword
,
412 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
413 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
416 return STATUS_NOT_IMPLEMENTED
;
422 SamCloseHandle(IN SAM_HANDLE SamHandle
)
426 TRACE("SamCloseHandle(%p)\n", SamHandle
);
430 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
432 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
434 Status
= I_RpcMapWin32Status(RpcExceptionCode());
444 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
445 OUT PSAM_HANDLE ServerHandle
,
446 IN ACCESS_MASK DesiredAccess
,
447 IN POBJECT_ATTRIBUTES ObjectAttributes
)
451 TRACE("SamConnect(%p %p 0x%08x %p)\n",
452 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
456 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
457 (SAMPR_HANDLE
*)ServerHandle
,
460 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
462 Status
= I_RpcMapWin32Status(RpcExceptionCode());
472 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
473 IN PUNICODE_STRING AccountName
,
474 IN ACCESS_MASK DesiredAccess
,
475 OUT PSAM_HANDLE AliasHandle
,
476 OUT PULONG RelativeId
)
480 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
481 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
488 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
489 (PRPC_UNICODE_STRING
)AccountName
,
491 (SAMPR_HANDLE
*)AliasHandle
,
494 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
496 Status
= I_RpcMapWin32Status(RpcExceptionCode());
506 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
507 IN PUNICODE_STRING AccountName
,
508 IN ACCESS_MASK DesiredAccess
,
509 OUT PSAM_HANDLE GroupHandle
,
510 OUT PULONG RelativeId
)
514 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
515 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
522 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
523 (PRPC_UNICODE_STRING
)AccountName
,
525 (SAMPR_HANDLE
*)GroupHandle
,
528 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
530 Status
= I_RpcMapWin32Status(RpcExceptionCode());
540 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
541 IN PUNICODE_STRING AccountName
,
542 IN ULONG AccountType
,
543 IN ACCESS_MASK DesiredAccess
,
544 OUT PSAM_HANDLE UserHandle
,
545 OUT PULONG GrantedAccess
,
546 OUT PULONG RelativeId
)
550 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
551 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
552 UserHandle
, GrantedAccess
, RelativeId
);
559 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
560 (PRPC_UNICODE_STRING
)AccountName
,
563 (SAMPR_HANDLE
*)UserHandle
,
568 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
570 Status
= I_RpcMapWin32Status(RpcExceptionCode());
580 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
581 IN PUNICODE_STRING AccountName
,
582 IN ACCESS_MASK DesiredAccess
,
583 OUT PSAM_HANDLE UserHandle
,
584 OUT PULONG RelativeId
)
588 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
589 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
596 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
597 (PRPC_UNICODE_STRING
)AccountName
,
599 (SAMPR_HANDLE
*)UserHandle
,
602 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
604 Status
= I_RpcMapWin32Status(RpcExceptionCode());
614 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
616 SAMPR_HANDLE LocalAliasHandle
;
619 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
621 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
623 if (LocalAliasHandle
== NULL
)
624 return STATUS_INVALID_HANDLE
;
628 Status
= SamrDeleteAlias(&LocalAliasHandle
);
630 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
632 Status
= I_RpcMapWin32Status(RpcExceptionCode());
642 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
644 SAMPR_HANDLE LocalGroupHandle
;
647 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
649 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
651 if (LocalGroupHandle
== NULL
)
652 return STATUS_INVALID_HANDLE
;
656 Status
= SamrDeleteGroup(&LocalGroupHandle
);
658 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
660 Status
= I_RpcMapWin32Status(RpcExceptionCode());
670 SamDeleteUser(IN SAM_HANDLE UserHandle
)
672 SAMPR_HANDLE LocalUserHandle
;
675 TRACE("SamDeleteUser(%p)\n", UserHandle
);
677 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
679 if (LocalUserHandle
== NULL
)
680 return STATUS_INVALID_HANDLE
;
684 Status
= SamrDeleteUser(&LocalUserHandle
);
686 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
688 Status
= I_RpcMapWin32Status(RpcExceptionCode());
698 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
699 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
701 IN ULONG PreferedMaximumLength
,
702 OUT PULONG CountReturned
)
704 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
707 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
708 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
711 if ((EnumerationContext
== NULL
) ||
713 (CountReturned
== NULL
))
714 return STATUS_INVALID_PARAMETER
;
720 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
723 PreferedMaximumLength
,
726 if (EnumBuffer
!= NULL
)
728 if (EnumBuffer
->Buffer
!= NULL
)
730 *Buffer
= EnumBuffer
->Buffer
;
733 midl_user_free(EnumBuffer
);
736 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
738 Status
= I_RpcMapWin32Status(RpcExceptionCode());
748 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
749 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
751 IN ULONG PreferedMaximumLength
,
752 OUT PULONG CountReturned
)
754 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
757 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
758 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
761 if ((EnumerationContext
== NULL
) ||
763 (CountReturned
== NULL
))
764 return STATUS_INVALID_PARAMETER
;
770 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
773 PreferedMaximumLength
,
776 if (EnumBuffer
!= NULL
)
778 if (EnumBuffer
->Buffer
!= NULL
)
780 *Buffer
= EnumBuffer
->Buffer
;
783 midl_user_free(EnumBuffer
);
786 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
788 Status
= I_RpcMapWin32Status(RpcExceptionCode());
798 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
799 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
801 IN ULONG PreferedMaximumLength
,
802 OUT PULONG CountReturned
)
804 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
807 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
808 DomainHandle
, EnumerationContext
, Buffer
,
809 PreferedMaximumLength
, CountReturned
);
811 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
812 return STATUS_INVALID_PARAMETER
;
818 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
821 PreferedMaximumLength
,
823 if (EnumBuffer
!= NULL
)
825 if (EnumBuffer
->Buffer
!= NULL
)
826 *Buffer
= EnumBuffer
->Buffer
;
828 midl_user_free(EnumBuffer
);
831 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
833 Status
= I_RpcMapWin32Status(RpcExceptionCode());
843 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
844 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
845 IN ULONG UserAccountControl
,
847 IN ULONG PreferedMaximumLength
,
848 OUT PULONG CountReturned
)
850 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
853 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
854 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
855 PreferedMaximumLength
, CountReturned
);
857 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
858 return STATUS_INVALID_PARAMETER
;
864 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
868 PreferedMaximumLength
,
870 if (EnumBuffer
!= NULL
)
872 if (EnumBuffer
->Buffer
!= NULL
)
874 *Buffer
= EnumBuffer
->Buffer
;
877 midl_user_free(EnumBuffer
);
881 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
883 Status
= I_RpcMapWin32Status(RpcExceptionCode());
893 SamFreeMemory(IN PVOID Buffer
)
896 midl_user_free(Buffer
);
898 return STATUS_SUCCESS
;
904 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
905 IN ULONG PassedCount
,
907 OUT PULONG MembershipCount
,
910 SAMPR_PSID_ARRAY SidArray
;
911 SAMPR_ULONG_ARRAY Membership
;
914 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
915 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
918 MembershipCount
== NULL
||
920 return STATUS_INVALID_PARAMETER
;
922 Membership
.Element
= NULL
;
926 SidArray
.Count
= PassedCount
;
927 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
929 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
932 if (NT_SUCCESS(Status
))
934 *MembershipCount
= Membership
.Count
;
935 *Aliases
= Membership
.Element
;
939 if (Membership
.Element
!= NULL
)
940 midl_user_free(Membership
.Element
);
943 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
945 Status
= I_RpcMapWin32Status(RpcExceptionCode());
955 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
958 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
961 return STATUS_INVALID_PARAMETER
;
963 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
965 return STATUS_SUCCESS
;
971 SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle
,
972 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
973 IN PUNICODE_STRING Prefix
,
978 TRACE("(%p %lu %wZ %p)\n",
979 DomainHandle
, DisplayInformation
, Prefix
, Index
);
981 if ((Prefix
== NULL
) ||
983 return STATUS_INVALID_PARAMETER
;
987 Status
= SamrGetDisplayEnumerationIndex2((SAMPR_HANDLE
)DomainHandle
,
989 (PRPC_UNICODE_STRING
)Prefix
,
992 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
994 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1004 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
1005 OUT PGROUP_MEMBERSHIP
*Groups
,
1006 OUT PULONG MembershipCount
)
1008 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
1011 TRACE("SamGetGroupsForUser(%p %p %p)\n",
1012 UserHandle
, Groups
, MembershipCount
);
1016 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
1018 if (NT_SUCCESS(Status
))
1020 *Groups
= GroupsBuffer
->Groups
;
1021 *MembershipCount
= GroupsBuffer
->MembershipCount
;
1023 MIDL_user_free(GroupsBuffer
);
1027 if (GroupsBuffer
!= NULL
)
1029 if (GroupsBuffer
->Groups
!= NULL
)
1030 MIDL_user_free(GroupsBuffer
->Groups
);
1032 MIDL_user_free(GroupsBuffer
);
1036 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1038 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1048 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
1049 OUT PSID
**MemberIds
,
1050 OUT PULONG MemberCount
)
1052 SAMPR_PSID_ARRAY_OUT SidArray
;
1055 TRACE("SamGetMembersInAlias(%p %p %p)\n",
1056 AliasHandle
, MemberIds
, MemberCount
);
1058 if ((MemberIds
== NULL
) ||
1059 (MemberCount
== NULL
))
1060 return STATUS_INVALID_PARAMETER
;
1065 SidArray
.Sids
= NULL
;
1069 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
1071 if (NT_SUCCESS(Status
))
1073 *MemberCount
= SidArray
.Count
;
1074 *MemberIds
= (PSID
*)SidArray
.Sids
;
1078 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1080 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1090 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
1091 OUT PULONG
*MemberIds
,
1092 OUT PULONG
*Attributes
,
1093 OUT PULONG MemberCount
)
1095 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
1098 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
1099 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
1103 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
1105 if (NT_SUCCESS(Status
))
1107 *MemberIds
= MembersBuffer
->Members
;
1108 *Attributes
= MembersBuffer
->Attributes
;
1109 *MemberCount
= MembersBuffer
->MemberCount
;
1111 MIDL_user_free(MembersBuffer
);
1115 if (MembersBuffer
!= NULL
)
1117 if (MembersBuffer
->Members
!= NULL
)
1118 MIDL_user_free(MembersBuffer
->Members
);
1120 if (MembersBuffer
->Attributes
!= NULL
)
1121 MIDL_user_free(MembersBuffer
->Attributes
);
1123 MIDL_user_free(MembersBuffer
);
1127 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1129 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1139 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
1140 IN PUNICODE_STRING Name
,
1145 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1146 ServerHandle
, Name
, DomainId
);
1150 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
1151 (PRPC_UNICODE_STRING
)Name
,
1152 (PRPC_SID
*)DomainId
);
1154 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1156 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1166 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
1168 IN PULONG RelativeIds
,
1169 OUT PUNICODE_STRING
*Names
,
1170 OUT PSID_NAME_USE
*Use OPTIONAL
)
1172 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
1173 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1177 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1178 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
1187 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
1193 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1195 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1199 if (NT_SUCCESS(Status
))
1201 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
1204 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1208 for (i
= 0; i
< Count
; i
++)
1210 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
1211 if ((*Names
)[i
].Buffer
== NULL
)
1213 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1218 for (i
= 0; i
< Count
; i
++)
1220 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1221 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1223 RtlCopyMemory((*Names
)[i
].Buffer
,
1224 NamesBuffer
.Element
[i
].Buffer
,
1225 NamesBuffer
.Element
[i
].Length
);
1230 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1233 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1239 Count
* sizeof(SID_NAME_USE
));
1244 if (!NT_SUCCESS(Status
))
1248 for (i
= 0; i
< Count
; i
++)
1250 if ((*Names
)[i
].Buffer
!= NULL
)
1251 midl_user_free((*Names
)[i
].Buffer
);
1254 midl_user_free(*Names
);
1257 if (Use
!= NULL
&& *Use
!= NULL
)
1258 midl_user_free(*Use
);
1261 if (NamesBuffer
.Element
!= NULL
)
1263 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1265 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1266 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1269 midl_user_free(NamesBuffer
.Element
);
1272 if (UseBuffer
.Element
!= NULL
)
1273 midl_user_free(UseBuffer
.Element
);
1281 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1283 IN PUNICODE_STRING Names
,
1284 OUT PULONG
*RelativeIds
,
1285 OUT PSID_NAME_USE
*Use
)
1287 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1288 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1291 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1292 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1294 *RelativeIds
= NULL
;
1299 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1301 (PRPC_UNICODE_STRING
)Names
,
1305 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1307 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1311 if (NT_SUCCESS(Status
))
1313 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1314 if (*RelativeIds
== NULL
)
1316 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1320 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1323 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1327 RtlCopyMemory(*RelativeIds
,
1329 Count
* sizeof(ULONG
));
1333 Count
* sizeof(SID_NAME_USE
));
1337 if (!NT_SUCCESS(Status
))
1339 if (*RelativeIds
!= NULL
)
1340 midl_user_free(*RelativeIds
);
1343 midl_user_free(*Use
);
1346 if (RidBuffer
.Element
!= NULL
)
1347 midl_user_free(RidBuffer
.Element
);
1349 if (UseBuffer
.Element
!= NULL
)
1350 midl_user_free(UseBuffer
.Element
);
1358 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1359 IN ACCESS_MASK DesiredAccess
,
1361 OUT PSAM_HANDLE AliasHandle
)
1365 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1366 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1370 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1373 (SAMPR_HANDLE
*)AliasHandle
);
1375 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1377 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1387 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1388 IN ACCESS_MASK DesiredAccess
,
1390 OUT PSAM_HANDLE DomainHandle
)
1394 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1395 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1399 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1402 (SAMPR_HANDLE
*)DomainHandle
);
1404 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1406 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1416 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1417 IN ACCESS_MASK DesiredAccess
,
1419 OUT PSAM_HANDLE GroupHandle
)
1423 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1424 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1428 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1431 (SAMPR_HANDLE
*)GroupHandle
);
1433 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1435 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1445 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1446 IN ACCESS_MASK DesiredAccess
,
1448 OUT PSAM_HANDLE UserHandle
)
1452 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1453 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1457 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1460 (SAMPR_HANDLE
*)UserHandle
);
1462 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1464 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1474 SamQueryDisplayInformation(IN SAM_HANDLE DomainHandle
,
1475 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
1477 IN ULONG EntryCount
,
1478 IN ULONG PreferredMaximumLength
,
1479 OUT PULONG TotalAvailable
,
1480 OUT PULONG TotalReturned
,
1481 OUT PULONG ReturnedEntryCount
,
1482 OUT PVOID
*SortedBuffer
)
1484 SAMPR_DISPLAY_INFO_BUFFER LocalBuffer
;
1487 TRACE("(%p %lu %lu %lu %lu %p %p %p %p)\n",
1488 DomainHandle
, DisplayInformation
, Index
, EntryCount
,
1489 PreferredMaximumLength
, TotalAvailable
, TotalReturned
,
1490 ReturnedEntryCount
, SortedBuffer
);
1492 if ((TotalAvailable
== NULL
) ||
1493 (TotalReturned
== NULL
) ||
1494 (ReturnedEntryCount
== NULL
) ||
1495 (SortedBuffer
== NULL
))
1496 return STATUS_INVALID_PARAMETER
;
1500 Status
= SamrQueryDisplayInformation3((SAMPR_HANDLE
)DomainHandle
,
1504 PreferredMaximumLength
,
1508 if (NT_SUCCESS(Status
))
1510 switch (DisplayInformation
)
1512 case DomainDisplayUser
:
1513 *ReturnedEntryCount
= LocalBuffer
.UserInformation
.EntriesRead
;
1514 *SortedBuffer
= LocalBuffer
.UserInformation
.Buffer
;
1517 case DomainDisplayMachine
:
1518 *ReturnedEntryCount
= LocalBuffer
.MachineInformation
.EntriesRead
;
1519 *SortedBuffer
= LocalBuffer
.MachineInformation
.Buffer
;
1522 case DomainDisplayGroup
:
1523 *ReturnedEntryCount
= LocalBuffer
.GroupInformation
.EntriesRead
;
1524 *SortedBuffer
= LocalBuffer
.GroupInformation
.Buffer
;
1527 case DomainDisplayOemUser
:
1528 *ReturnedEntryCount
= LocalBuffer
.OemUserInformation
.EntriesRead
;
1529 *SortedBuffer
= LocalBuffer
.OemUserInformation
.Buffer
;
1532 case DomainDisplayOemGroup
:
1533 *ReturnedEntryCount
= LocalBuffer
.OemGroupInformation
.EntriesRead
;
1534 *SortedBuffer
= LocalBuffer
.OemGroupInformation
.Buffer
;
1537 case DomainDisplayServer
:
1544 *ReturnedEntryCount
= 0;
1545 *SortedBuffer
= NULL
;
1548 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1550 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1560 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1561 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1566 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1567 AliasHandle
, AliasInformationClass
, Buffer
);
1571 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1572 AliasInformationClass
,
1573 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1575 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1577 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1587 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1588 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1593 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1594 DomainHandle
, DomainInformationClass
, Buffer
);
1598 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1599 DomainInformationClass
,
1600 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1602 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1604 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1614 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1615 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1620 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1621 GroupHandle
, GroupInformationClass
, Buffer
);
1625 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1626 GroupInformationClass
,
1627 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1629 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1631 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1641 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1642 IN USER_INFORMATION_CLASS UserInformationClass
,
1647 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1648 UserHandle
, UserInformationClass
, Buffer
);
1652 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1653 UserInformationClass
,
1654 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1656 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1658 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1668 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1669 IN SECURITY_INFORMATION SecurityInformation
,
1670 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1672 PSAMPR_SR_SECURITY_DESCRIPTOR SamSecurityDescriptor
= NULL
;
1675 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1676 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1678 *SecurityDescriptor
= NULL
;
1682 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1683 SecurityInformation
,
1684 &SamSecurityDescriptor
);
1686 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1688 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1692 TRACE("SamSecurityDescriptor: %p\n", SamSecurityDescriptor
);
1694 if (SamSecurityDescriptor
!= NULL
)
1696 TRACE("SamSecurityDescriptor->Length: %lu\n", SamSecurityDescriptor
->Length
);
1697 TRACE("SamSecurityDescriptor->SecurityDescriptor: %p\n", SamSecurityDescriptor
->SecurityDescriptor
);
1699 *SecurityDescriptor
= SamSecurityDescriptor
->SecurityDescriptor
;
1701 midl_user_free(SamSecurityDescriptor
);
1710 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1715 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1716 AliasHandle
, MemberId
);
1720 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1723 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1725 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1735 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1740 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1741 DomainHandle
, MemberId
);
1745 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1748 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1750 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1760 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1765 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1766 GroupHandle
, MemberId
);
1770 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1773 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1775 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1785 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1787 IN ULONG MemberCount
)
1789 SAMPR_PSID_ARRAY Buffer
;
1792 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1793 AliasHandle
, MemberIds
, MemberCount
);
1795 if (MemberIds
== NULL
)
1796 return STATUS_INVALID_PARAMETER_2
;
1798 Buffer
.Count
= MemberCount
;
1799 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1803 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1806 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1808 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1818 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1823 return STATUS_NOT_IMPLEMENTED
;
1829 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1830 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1835 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1836 AliasHandle
, AliasInformationClass
, Buffer
);
1840 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1841 AliasInformationClass
,
1844 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1846 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1856 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1857 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1862 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1863 DomainHandle
, DomainInformationClass
, Buffer
);
1867 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1868 DomainInformationClass
,
1871 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1873 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1883 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1884 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1889 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1890 GroupHandle
, GroupInformationClass
, Buffer
);
1894 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1895 GroupInformationClass
,
1898 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1900 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1910 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1911 IN USER_INFORMATION_CLASS UserInformationClass
,
1914 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1915 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1916 USER_ALL_INFORMATION InternalAllBuffer
;
1917 OEM_STRING LmPwdString
;
1918 CHAR LmPwdBuffer
[15];
1921 TRACE("SamSetInformationUser(%p %lu %p)\n",
1922 UserHandle
, UserInformationClass
, Buffer
);
1924 if (UserInformationClass
== UserSetPasswordInformation
)
1926 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1928 Status
= SampCheckPassword(UserHandle
,
1929 (PUNICODE_STRING
)&PasswordBuffer
->Password
);
1930 if (!NT_SUCCESS(Status
))
1932 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1936 /* Calculate the NT hash value of the passord */
1937 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1938 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1939 if (!NT_SUCCESS(Status
))
1941 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1945 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1946 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1948 /* Build the LM password */
1949 LmPwdString
.Length
= 15;
1950 LmPwdString
.MaximumLength
= 15;
1951 LmPwdString
.Buffer
= LmPwdBuffer
;
1952 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
1954 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
1955 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
1957 if (NT_SUCCESS(Status
))
1959 /* Calculate the LM hash value of the password */
1960 Status
= SystemFunction006(LmPwdString
.Buffer
,
1961 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
1962 if (NT_SUCCESS(Status
))
1963 Internal1Buffer
.LmPasswordPresent
= TRUE
;
1966 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1970 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1971 UserInternal1Information
,
1972 (PVOID
)&Internal1Buffer
);
1974 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1976 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1980 if (!NT_SUCCESS(Status
))
1982 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1987 else if (UserInformationClass
== UserAllInformation
)
1989 RtlCopyMemory(&InternalAllBuffer
,
1991 sizeof(USER_ALL_INFORMATION
));
1993 if (InternalAllBuffer
.WhichFields
& (USER_ALL_LMPASSWORDPRESENT
| USER_ALL_NTPASSWORDPRESENT
))
1995 if (InternalAllBuffer
.WhichFields
& USER_ALL_OWFPASSWORD
)
1997 /* Check NT password hash */
1998 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
2000 if (InternalAllBuffer
.NtPassword
.Length
!= sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
2001 return STATUS_INVALID_PARAMETER
;
2004 /* Check LM password hash */
2005 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
2007 if (InternalAllBuffer
.LmPassword
.Length
!= sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
2008 return STATUS_INVALID_PARAMETER
;
2014 * Only allow the NT password to be set.
2015 * The LM password will be created here.
2017 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
2019 TRACE("Do not try to set a clear text LM password!\n");
2020 return STATUS_INVALID_PARAMETER
;
2023 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
2025 Status
= SampCheckPassword(UserHandle
,
2026 &InternalAllBuffer
.NtPassword
);
2027 if (!NT_SUCCESS(Status
))
2029 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
2033 /* Calculate the NT password hash */
2034 Status
= SystemFunction007((PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
2035 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
2036 if (!NT_SUCCESS(Status
))
2038 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
2042 InternalAllBuffer
.NtPasswordPresent
= TRUE
;
2043 InternalAllBuffer
.LmPasswordPresent
= FALSE
;
2045 InternalAllBuffer
.NtPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
2046 InternalAllBuffer
.NtPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
2047 InternalAllBuffer
.NtPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedNtOwfPassword
;
2049 /* Build the LM password */
2050 LmPwdString
.Length
= 15;
2051 LmPwdString
.MaximumLength
= 15;
2052 LmPwdString
.Buffer
= LmPwdBuffer
;
2053 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
2055 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
2056 (PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
2058 if (NT_SUCCESS(Status
))
2060 /* Calculate the LM password hash */
2061 Status
= SystemFunction006(LmPwdString
.Buffer
,
2062 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
2063 if (NT_SUCCESS(Status
))
2065 InternalAllBuffer
.WhichFields
|= USER_ALL_LMPASSWORDPRESENT
;
2066 InternalAllBuffer
.LmPasswordPresent
= TRUE
;
2068 InternalAllBuffer
.LmPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2069 InternalAllBuffer
.LmPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2070 InternalAllBuffer
.LmPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
;
2079 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2081 (PVOID
)&InternalAllBuffer
);
2083 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2085 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2089 if (!NT_SUCCESS(Status
))
2091 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
2099 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2100 UserInformationClass
,
2103 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2105 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2115 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
2117 IN ULONG Attributes
)
2121 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
2122 GroupHandle
, MemberId
, Attributes
);
2126 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
2130 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2132 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2142 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
2143 IN SECURITY_INFORMATION SecurityInformation
,
2144 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
2146 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
2150 TRACE("SamSetSecurityObject(%p %lu %p)\n",
2151 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
2153 /* Retrieve the length of the relative security descriptor */
2155 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2158 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
2159 return STATUS_INVALID_PARAMETER
;
2162 /* Allocate a buffer for the security descriptor */
2163 DescriptorToPass
.Length
= Length
;
2164 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
2165 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
2166 return STATUS_INSUFFICIENT_RESOURCES
;
2168 /* Convert the given security descriptor to a relative security descriptor */
2169 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2170 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
2172 if (!NT_SUCCESS(Status
))
2177 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
2178 SecurityInformation
,
2181 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2183 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2188 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
2189 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
2197 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
2201 TRACE("(%p)\n", ServerHandle
);
2205 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
2207 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2209 Status
= I_RpcMapWin32Status(RpcExceptionCode());