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
27 /* INCLUDES *****************************************************************/
31 WINE_DEFAULT_DEBUG_CHANNEL(samlib
);
35 SystemFunction006(LPCSTR password
,
40 SystemFunction007(PUNICODE_STRING string
,
43 /* GLOBALS *******************************************************************/
46 /* FUNCTIONS *****************************************************************/
48 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
50 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
54 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
56 HeapFree(GetProcessHeap(), 0, ptr
);
61 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
63 handle_t hBinding
= NULL
;
64 LPWSTR pszStringBinding
;
67 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
69 status
= RpcStringBindingComposeW(NULL
,
77 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
81 /* Set the binding handle that will be used to bind to the server. */
82 status
= RpcBindingFromStringBindingW(pszStringBinding
,
86 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
89 status
= RpcStringFreeW(&pszStringBinding
);
92 // TRACE("RpcStringFree returned 0x%x\n", status);
100 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
105 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
107 status
= RpcBindingFree(&hBinding
);
110 TRACE("RpcBindingFree returned 0x%x\n", status
);
117 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
122 TRACE("SamAddMemberToAlias(%p %p)\n",
123 AliasHandle
, MemberId
);
127 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
130 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
132 Status
= I_RpcMapWin32Status(RpcExceptionCode());
142 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
148 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
149 GroupHandle
, MemberId
, Attributes
);
153 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
157 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
159 Status
= I_RpcMapWin32Status(RpcExceptionCode());
169 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
171 IN ULONG MemberCount
)
173 SAMPR_PSID_ARRAY Buffer
;
176 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
177 AliasHandle
, MemberIds
, MemberCount
);
179 if (MemberIds
== NULL
)
180 return STATUS_INVALID_PARAMETER_2
;
182 Buffer
.Count
= MemberCount
;
183 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
187 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
190 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
192 Status
= I_RpcMapWin32Status(RpcExceptionCode());
202 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
203 IN PUNICODE_STRING OldPassword
,
204 IN PUNICODE_STRING NewPassword
)
206 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
207 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
208 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
209 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
210 OEM_STRING LmPwdString
;
211 CHAR LmPwdBuffer
[15];
212 BOOLEAN OldLmPasswordPresent
= FALSE
;
213 BOOLEAN NewLmPasswordPresent
= FALSE
;
216 /* Calculate the NT hash for the old password */
217 Status
= SystemFunction007(OldPassword
,
218 (LPBYTE
)&OldNtPassword
);
219 if (!NT_SUCCESS(Status
))
221 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
225 /* Calculate the NT hash for the new password */
226 Status
= SystemFunction007(NewPassword
,
227 (LPBYTE
)&NewNtPassword
);
228 if (!NT_SUCCESS(Status
))
230 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
234 /* Calculate the LM password and hash for the old password */
235 LmPwdString
.Length
= 15;
236 LmPwdString
.MaximumLength
= 15;
237 LmPwdString
.Buffer
= LmPwdBuffer
;
238 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
240 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
243 if (NT_SUCCESS(Status
))
245 /* Calculate the LM hash value of the password */
246 Status
= SystemFunction006(LmPwdString
.Buffer
,
247 (LPSTR
)&OldLmPassword
);
248 if (NT_SUCCESS(Status
))
250 OldLmPasswordPresent
= TRUE
;
254 /* Calculate the LM password and hash for the new password */
255 LmPwdString
.Length
= 15;
256 LmPwdString
.MaximumLength
= 15;
257 LmPwdString
.Buffer
= LmPwdBuffer
;
258 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
260 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
263 if (NT_SUCCESS(Status
))
265 /* Calculate the LM hash value of the password */
266 Status
= SystemFunction006(LmPwdString
.Buffer
,
267 (LPSTR
)&NewLmPassword
);
268 if (NT_SUCCESS(Status
))
270 NewLmPasswordPresent
= TRUE
;
276 Status
= SamrChangePasswordUser((SAMPR_HANDLE
)UserHandle
,
277 OldLmPasswordPresent
&& NewLmPasswordPresent
,
288 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
290 Status
= I_RpcMapWin32Status(RpcExceptionCode());
300 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
301 IN PUNICODE_STRING UserName
,
302 IN PUNICODE_STRING OldPassword
,
303 IN PUNICODE_STRING NewPassword
)
306 return STATUS_NOT_IMPLEMENTED
;
312 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
313 IN PUNICODE_STRING UserName
,
314 IN PUNICODE_STRING OldPassword
,
315 IN PUNICODE_STRING NewPassword
,
316 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
317 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
320 return STATUS_NOT_IMPLEMENTED
;
326 SamCloseHandle(IN SAM_HANDLE SamHandle
)
330 TRACE("SamCloseHandle(%p)\n", SamHandle
);
334 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
336 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
338 Status
= I_RpcMapWin32Status(RpcExceptionCode());
348 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
349 OUT PSAM_HANDLE ServerHandle
,
350 IN ACCESS_MASK DesiredAccess
,
351 IN POBJECT_ATTRIBUTES ObjectAttributes
)
355 TRACE("SamConnect(%p %p 0x%08x %p)\n",
356 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
360 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
361 (SAMPR_HANDLE
*)ServerHandle
,
364 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
366 Status
= I_RpcMapWin32Status(RpcExceptionCode());
376 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
377 IN PUNICODE_STRING AccountName
,
378 IN ACCESS_MASK DesiredAccess
,
379 OUT PSAM_HANDLE AliasHandle
,
380 OUT PULONG RelativeId
)
384 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
385 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
392 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
393 (PRPC_UNICODE_STRING
)AccountName
,
395 (SAMPR_HANDLE
*)AliasHandle
,
398 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
400 Status
= I_RpcMapWin32Status(RpcExceptionCode());
410 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
411 IN PUNICODE_STRING AccountName
,
412 IN ACCESS_MASK DesiredAccess
,
413 OUT PSAM_HANDLE GroupHandle
,
414 OUT PULONG RelativeId
)
418 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
419 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
426 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
427 (PRPC_UNICODE_STRING
)AccountName
,
429 (SAMPR_HANDLE
*)GroupHandle
,
432 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
434 Status
= I_RpcMapWin32Status(RpcExceptionCode());
444 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
445 IN PUNICODE_STRING AccountName
,
446 IN ULONG AccountType
,
447 IN ACCESS_MASK DesiredAccess
,
448 OUT PSAM_HANDLE UserHandle
,
449 OUT PULONG GrantedAccess
,
450 OUT PULONG RelativeId
)
454 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
455 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
456 UserHandle
, GrantedAccess
, RelativeId
);
463 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
464 (PRPC_UNICODE_STRING
)AccountName
,
467 (SAMPR_HANDLE
*)UserHandle
,
472 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
474 Status
= I_RpcMapWin32Status(RpcExceptionCode());
484 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
485 IN PUNICODE_STRING AccountName
,
486 IN ACCESS_MASK DesiredAccess
,
487 OUT PSAM_HANDLE UserHandle
,
488 OUT PULONG RelativeId
)
492 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
493 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
500 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
501 (PRPC_UNICODE_STRING
)AccountName
,
503 (SAMPR_HANDLE
*)UserHandle
,
506 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
508 Status
= I_RpcMapWin32Status(RpcExceptionCode());
518 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
520 SAMPR_HANDLE LocalAliasHandle
;
523 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
525 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
527 if (LocalAliasHandle
== NULL
)
528 return STATUS_INVALID_HANDLE
;
532 Status
= SamrDeleteAlias(&LocalAliasHandle
);
534 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
536 Status
= I_RpcMapWin32Status(RpcExceptionCode());
546 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
548 SAMPR_HANDLE LocalGroupHandle
;
551 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
553 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
555 if (LocalGroupHandle
== NULL
)
556 return STATUS_INVALID_HANDLE
;
560 Status
= SamrDeleteGroup(&LocalGroupHandle
);
562 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
564 Status
= I_RpcMapWin32Status(RpcExceptionCode());
574 SamDeleteUser(IN SAM_HANDLE UserHandle
)
576 SAMPR_HANDLE LocalUserHandle
;
579 TRACE("SamDeleteUser(%p)\n", UserHandle
);
581 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
583 if (LocalUserHandle
== NULL
)
584 return STATUS_INVALID_HANDLE
;
588 Status
= SamrDeleteUser(&LocalUserHandle
);
590 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
592 Status
= I_RpcMapWin32Status(RpcExceptionCode());
602 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
603 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
605 IN ULONG PreferedMaximumLength
,
606 OUT PULONG CountReturned
)
608 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
611 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
612 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
615 if ((EnumerationContext
== NULL
) ||
617 (CountReturned
== NULL
))
618 return STATUS_INVALID_PARAMETER
;
624 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
627 PreferedMaximumLength
,
630 if (EnumBuffer
!= NULL
)
632 if (EnumBuffer
->Buffer
!= NULL
)
634 *Buffer
= EnumBuffer
->Buffer
;
637 midl_user_free(EnumBuffer
);
640 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
642 Status
= I_RpcMapWin32Status(RpcExceptionCode());
652 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
653 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
655 IN ULONG PreferedMaximumLength
,
656 OUT PULONG CountReturned
)
658 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
661 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
662 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
665 if ((EnumerationContext
== NULL
) ||
667 (CountReturned
== NULL
))
668 return STATUS_INVALID_PARAMETER
;
674 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
677 PreferedMaximumLength
,
680 if (EnumBuffer
!= NULL
)
682 if (EnumBuffer
->Buffer
!= NULL
)
684 *Buffer
= EnumBuffer
->Buffer
;
687 midl_user_free(EnumBuffer
);
690 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
692 Status
= I_RpcMapWin32Status(RpcExceptionCode());
702 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
703 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
705 IN ULONG PreferedMaximumLength
,
706 OUT PULONG CountReturned
)
708 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
711 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
712 DomainHandle
, EnumerationContext
, Buffer
,
713 PreferedMaximumLength
, CountReturned
);
715 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
716 return STATUS_INVALID_PARAMETER
;
722 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
725 PreferedMaximumLength
,
727 if (EnumBuffer
!= NULL
)
729 if (EnumBuffer
->Buffer
!= NULL
)
730 *Buffer
= EnumBuffer
->Buffer
;
732 midl_user_free(EnumBuffer
);
735 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
737 Status
= I_RpcMapWin32Status(RpcExceptionCode());
747 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
748 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
749 IN ULONG UserAccountControl
,
751 IN ULONG PreferedMaximumLength
,
752 OUT PULONG CountReturned
)
754 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
757 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
758 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
759 PreferedMaximumLength
, CountReturned
);
761 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
762 return STATUS_INVALID_PARAMETER
;
768 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
772 PreferedMaximumLength
,
774 if (EnumBuffer
!= NULL
)
776 if (EnumBuffer
->Buffer
!= NULL
)
778 *Buffer
= EnumBuffer
->Buffer
;
781 midl_user_free(EnumBuffer
);
785 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
787 Status
= I_RpcMapWin32Status(RpcExceptionCode());
797 SamFreeMemory(IN PVOID Buffer
)
800 midl_user_free(Buffer
);
802 return STATUS_SUCCESS
;
808 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
809 IN ULONG PassedCount
,
811 OUT PULONG MembershipCount
,
814 SAMPR_PSID_ARRAY SidArray
;
815 SAMPR_ULONG_ARRAY Membership
;
818 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
819 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
822 MembershipCount
== NULL
||
824 return STATUS_INVALID_PARAMETER
;
826 Membership
.Element
= NULL
;
830 SidArray
.Count
= PassedCount
;
831 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
833 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
836 if (NT_SUCCESS(Status
))
838 *MembershipCount
= Membership
.Count
;
839 *Aliases
= Membership
.Element
;
843 if (Membership
.Element
!= NULL
)
844 midl_user_free(Membership
.Element
);
847 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
849 Status
= I_RpcMapWin32Status(RpcExceptionCode());
859 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
862 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
865 return STATUS_INVALID_PARAMETER
;
867 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
869 return STATUS_SUCCESS
;
875 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
876 OUT PGROUP_MEMBERSHIP
*Groups
,
877 OUT PULONG MembershipCount
)
879 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
882 TRACE("SamGetGroupsForUser(%p %p %p)\n",
883 UserHandle
, Groups
, MembershipCount
);
887 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
889 if (NT_SUCCESS(Status
))
891 *Groups
= GroupsBuffer
->Groups
;
892 *MembershipCount
= GroupsBuffer
->MembershipCount
;
894 MIDL_user_free(GroupsBuffer
);
898 if (GroupsBuffer
!= NULL
)
900 if (GroupsBuffer
->Groups
!= NULL
)
901 MIDL_user_free(GroupsBuffer
->Groups
);
903 MIDL_user_free(GroupsBuffer
);
907 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
909 Status
= I_RpcMapWin32Status(RpcExceptionCode());
919 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
920 OUT PSID
**MemberIds
,
921 OUT PULONG MemberCount
)
923 SAMPR_PSID_ARRAY_OUT SidArray
;
926 TRACE("SamGetMembersInAlias(%p %p %p)\n",
927 AliasHandle
, MemberIds
, MemberCount
);
929 if ((MemberIds
== NULL
) ||
930 (MemberCount
== NULL
))
931 return STATUS_INVALID_PARAMETER
;
936 SidArray
.Sids
= NULL
;
940 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
942 if (NT_SUCCESS(Status
))
944 *MemberCount
= SidArray
.Count
;
945 *MemberIds
= (PSID
*)SidArray
.Sids
;
949 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
951 Status
= I_RpcMapWin32Status(RpcExceptionCode());
961 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
962 OUT PULONG
*MemberIds
,
963 OUT PULONG
*Attributes
,
964 OUT PULONG MemberCount
)
966 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
969 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
970 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
974 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
976 if (NT_SUCCESS(Status
))
978 *MemberIds
= MembersBuffer
->Members
;
979 *Attributes
= MembersBuffer
->Attributes
;
980 *MemberCount
= MembersBuffer
->MemberCount
;
982 MIDL_user_free(MembersBuffer
);
986 if (MembersBuffer
!= NULL
)
988 if (MembersBuffer
->Members
!= NULL
)
989 MIDL_user_free(MembersBuffer
->Members
);
991 if (MembersBuffer
->Attributes
!= NULL
)
992 MIDL_user_free(MembersBuffer
->Attributes
);
994 MIDL_user_free(MembersBuffer
);
998 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1000 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1010 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
1011 IN PUNICODE_STRING Name
,
1016 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1017 ServerHandle
, Name
, DomainId
);
1021 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
1022 (PRPC_UNICODE_STRING
)Name
,
1023 (PRPC_SID
*)DomainId
);
1025 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1027 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1037 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
1039 IN PULONG RelativeIds
,
1040 OUT PUNICODE_STRING
*Names
,
1041 OUT PSID_NAME_USE
*Use OPTIONAL
)
1043 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
1044 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1048 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1049 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
1058 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
1064 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1066 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1070 if (NT_SUCCESS(Status
))
1072 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
1075 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1079 for (i
= 0; i
< Count
; i
++)
1081 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
1082 if ((*Names
)[i
].Buffer
== NULL
)
1084 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1089 for (i
= 0; i
< Count
; i
++)
1091 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1092 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1094 RtlCopyMemory((*Names
)[i
].Buffer
,
1095 NamesBuffer
.Element
[i
].Buffer
,
1096 NamesBuffer
.Element
[i
].Length
);
1101 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1104 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1110 Count
* sizeof(SID_NAME_USE
));
1115 if (!NT_SUCCESS(Status
))
1119 for (i
= 0; i
< Count
; i
++)
1121 if ((*Names
)[i
].Buffer
!= NULL
)
1122 midl_user_free((*Names
)[i
].Buffer
);
1125 midl_user_free(*Names
);
1128 if (Use
!= NULL
&& *Use
!= NULL
)
1129 midl_user_free(*Use
);
1132 if (NamesBuffer
.Element
!= NULL
)
1134 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1136 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1137 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1140 midl_user_free(NamesBuffer
.Element
);
1143 if (UseBuffer
.Element
!= NULL
)
1144 midl_user_free(UseBuffer
.Element
);
1152 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1154 IN PUNICODE_STRING Names
,
1155 OUT PULONG
*RelativeIds
,
1156 OUT PSID_NAME_USE
*Use
)
1158 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1159 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1162 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1163 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1165 *RelativeIds
= NULL
;
1170 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1172 (PRPC_UNICODE_STRING
)Names
,
1176 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1178 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1182 if (NT_SUCCESS(Status
))
1184 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1185 if (*RelativeIds
== NULL
)
1187 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1191 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1194 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1198 RtlCopyMemory(*RelativeIds
,
1200 Count
* sizeof(ULONG
));
1204 Count
* sizeof(SID_NAME_USE
));
1208 if (!NT_SUCCESS(Status
))
1210 if (*RelativeIds
!= NULL
)
1211 midl_user_free(*RelativeIds
);
1214 midl_user_free(*Use
);
1217 if (RidBuffer
.Element
!= NULL
)
1218 midl_user_free(RidBuffer
.Element
);
1220 if (UseBuffer
.Element
!= NULL
)
1221 midl_user_free(UseBuffer
.Element
);
1229 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1230 IN ACCESS_MASK DesiredAccess
,
1232 OUT PSAM_HANDLE AliasHandle
)
1236 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1237 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1241 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1244 (SAMPR_HANDLE
*)AliasHandle
);
1246 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1248 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1258 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1259 IN ACCESS_MASK DesiredAccess
,
1261 OUT PSAM_HANDLE DomainHandle
)
1265 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1266 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1270 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1273 (SAMPR_HANDLE
*)DomainHandle
);
1275 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1277 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1287 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1288 IN ACCESS_MASK DesiredAccess
,
1290 OUT PSAM_HANDLE GroupHandle
)
1294 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1295 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1299 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1302 (SAMPR_HANDLE
*)GroupHandle
);
1304 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1306 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1316 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1317 IN ACCESS_MASK DesiredAccess
,
1319 OUT PSAM_HANDLE UserHandle
)
1323 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1324 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1328 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1331 (SAMPR_HANDLE
*)UserHandle
);
1333 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1335 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1345 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1346 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1351 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1352 AliasHandle
, AliasInformationClass
, Buffer
);
1356 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1357 AliasInformationClass
,
1358 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1360 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1362 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1372 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1373 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1378 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1379 DomainHandle
, DomainInformationClass
, Buffer
);
1383 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1384 DomainInformationClass
,
1385 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1387 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1389 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1399 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1400 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1405 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1406 GroupHandle
, GroupInformationClass
, Buffer
);
1410 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1411 GroupInformationClass
,
1412 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1414 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1416 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1426 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1427 IN USER_INFORMATION_CLASS UserInformationClass
,
1432 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1433 UserHandle
, UserInformationClass
, Buffer
);
1437 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1438 UserInformationClass
,
1439 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1441 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1443 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1453 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1454 IN SECURITY_INFORMATION SecurityInformation
,
1455 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1457 SAMPR_SR_SECURITY_DESCRIPTOR LocalSecurityDescriptor
;
1458 PSAMPR_SR_SECURITY_DESCRIPTOR pLocalSecurityDescriptor
;
1461 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1462 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1464 LocalSecurityDescriptor
.Length
= 0;
1465 LocalSecurityDescriptor
.SecurityDescriptor
= NULL
;
1469 pLocalSecurityDescriptor
= &LocalSecurityDescriptor
;
1471 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1472 SecurityInformation
,
1473 &pLocalSecurityDescriptor
);
1475 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1477 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1481 *SecurityDescriptor
= LocalSecurityDescriptor
.SecurityDescriptor
;
1489 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1494 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1495 AliasHandle
, MemberId
);
1499 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1502 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1504 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1514 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1519 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1520 DomainHandle
, MemberId
);
1524 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1527 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1529 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1539 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1544 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1545 GroupHandle
, MemberId
);
1549 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1552 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1554 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1564 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1566 IN ULONG MemberCount
)
1568 SAMPR_PSID_ARRAY Buffer
;
1571 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1572 AliasHandle
, MemberIds
, MemberCount
);
1574 if (MemberIds
== NULL
)
1575 return STATUS_INVALID_PARAMETER_2
;
1577 Buffer
.Count
= MemberCount
;
1578 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1582 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1585 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1587 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1597 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1602 return STATUS_NOT_IMPLEMENTED
;
1608 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1609 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1614 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1615 AliasHandle
, AliasInformationClass
, Buffer
);
1619 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1620 AliasInformationClass
,
1623 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1625 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1635 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1636 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1641 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1642 DomainHandle
, DomainInformationClass
, Buffer
);
1646 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1647 DomainInformationClass
,
1650 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1652 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1662 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1663 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1668 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1669 GroupHandle
, GroupInformationClass
, Buffer
);
1673 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1674 GroupInformationClass
,
1677 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1679 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1689 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1690 IN USER_INFORMATION_CLASS UserInformationClass
,
1693 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1694 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1695 OEM_STRING LmPwdString
;
1696 CHAR LmPwdBuffer
[15];
1699 TRACE("SamSetInformationUser(%p %lu %p)\n",
1700 UserHandle
, UserInformationClass
, Buffer
);
1702 if (UserInformationClass
== UserSetPasswordInformation
)
1704 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1706 /* Calculate the NT hash value of the passord */
1707 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1708 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1709 if (!NT_SUCCESS(Status
))
1711 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1715 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1716 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1718 /* Build the LM password */
1719 LmPwdString
.Length
= 15;
1720 LmPwdString
.MaximumLength
= 15;
1721 LmPwdString
.Buffer
= LmPwdBuffer
;
1722 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
1724 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
1725 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
1727 if (NT_SUCCESS(Status
))
1729 /* Calculate the LM hash value of the password */
1730 Status
= SystemFunction006(LmPwdString
.Buffer
,
1731 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
1732 if (NT_SUCCESS(Status
))
1733 Internal1Buffer
.LmPasswordPresent
= TRUE
;
1736 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1740 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1741 UserInternal1Information
,
1742 (PVOID
)&Internal1Buffer
);
1744 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1746 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1750 if (!NT_SUCCESS(Status
))
1752 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1759 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1760 UserInformationClass
,
1763 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1765 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1775 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
1777 IN ULONG Attributes
)
1781 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
1782 GroupHandle
, MemberId
, Attributes
);
1786 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
1790 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1792 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1802 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
1803 IN SECURITY_INFORMATION SecurityInformation
,
1804 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
1806 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
1810 TRACE("SamSetSecurityObject(%p %lu %p)\n",
1811 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1813 /* Retrieve the length of the relative security descriptor */
1815 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1818 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
1819 return STATUS_INVALID_PARAMETER
;
1822 /* Allocate a buffer for the security descriptor */
1823 DescriptorToPass
.Length
= Length
;
1824 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
1825 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
1826 return STATUS_INSUFFICIENT_RESOURCES
;
1828 /* Convert the given security descriptor to a relative security descriptor */
1829 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1830 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
1832 if (!NT_SUCCESS(Status
))
1837 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1838 SecurityInformation
,
1841 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1843 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1848 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
1849 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
1857 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
1861 TRACE("(%p)\n", ServerHandle
);
1865 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
1867 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1869 Status
= I_RpcMapWin32Status(RpcExceptionCode());