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.
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS system libraries
23 * PURPOSE: SAM interface library
24 * FILE: lib/samlib/samlib.c
25 * PROGRAMER: Eric Kohl
28 /* INCLUDES *****************************************************************/
32 WINE_DEFAULT_DEBUG_CHANNEL(samlib
);
37 SystemFunction007(PUNICODE_STRING string
,
40 /* GLOBALS *******************************************************************/
43 /* FUNCTIONS *****************************************************************/
45 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
47 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
51 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
53 HeapFree(GetProcessHeap(), 0, ptr
);
58 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
60 handle_t hBinding
= NULL
;
61 LPWSTR pszStringBinding
;
64 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
66 status
= RpcStringBindingComposeW(NULL
,
74 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
78 /* Set the binding handle that will be used to bind to the server. */
79 status
= RpcBindingFromStringBindingW(pszStringBinding
,
83 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
86 status
= RpcStringFreeW(&pszStringBinding
);
89 // TRACE("RpcStringFree returned 0x%x\n", status);
97 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
102 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
104 status
= RpcBindingFree(&hBinding
);
107 TRACE("RpcBindingFree returned 0x%x\n", status
);
114 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
119 TRACE("SamAddMemberToAlias(%p %p)\n",
120 AliasHandle
, MemberId
);
124 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
127 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
129 Status
= I_RpcMapWin32Status(RpcExceptionCode());
139 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
145 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
146 GroupHandle
, MemberId
, Attributes
);
150 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
154 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
156 Status
= I_RpcMapWin32Status(RpcExceptionCode());
166 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
168 IN ULONG MemberCount
)
170 SAMPR_PSID_ARRAY Buffer
;
173 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
174 AliasHandle
, MemberIds
, MemberCount
);
176 if (MemberIds
== NULL
)
177 return STATUS_INVALID_PARAMETER_2
;
179 Buffer
.Count
= MemberCount
;
180 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
184 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
187 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
189 Status
= I_RpcMapWin32Status(RpcExceptionCode());
199 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
200 IN PUNICODE_STRING OldPassword
,
201 IN PUNICODE_STRING NewPassword
)
204 return STATUS_NOT_IMPLEMENTED
;
210 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
211 IN PUNICODE_STRING UserName
,
212 IN PUNICODE_STRING OldPassword
,
213 IN PUNICODE_STRING NewPassword
)
216 return STATUS_NOT_IMPLEMENTED
;
222 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
223 IN PUNICODE_STRING UserName
,
224 IN PUNICODE_STRING OldPassword
,
225 IN PUNICODE_STRING NewPassword
,
226 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
227 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
230 return STATUS_NOT_IMPLEMENTED
;
236 SamCloseHandle(IN SAM_HANDLE SamHandle
)
240 TRACE("SamCloseHandle(%p)\n", SamHandle
);
244 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
246 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
248 Status
= I_RpcMapWin32Status(RpcExceptionCode());
258 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
259 OUT PSAM_HANDLE ServerHandle
,
260 IN ACCESS_MASK DesiredAccess
,
261 IN POBJECT_ATTRIBUTES ObjectAttributes
)
265 TRACE("SamConnect(%p %p 0x%08x %p)\n",
266 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
270 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
271 (SAMPR_HANDLE
*)ServerHandle
,
274 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
276 Status
= I_RpcMapWin32Status(RpcExceptionCode());
286 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
287 IN PUNICODE_STRING AccountName
,
288 IN ACCESS_MASK DesiredAccess
,
289 OUT PSAM_HANDLE AliasHandle
,
290 OUT PULONG RelativeId
)
294 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
295 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
302 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
303 (PRPC_UNICODE_STRING
)AccountName
,
305 (SAMPR_HANDLE
*)AliasHandle
,
308 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
310 Status
= I_RpcMapWin32Status(RpcExceptionCode());
320 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
321 IN PUNICODE_STRING AccountName
,
322 IN ACCESS_MASK DesiredAccess
,
323 OUT PSAM_HANDLE GroupHandle
,
324 OUT PULONG RelativeId
)
328 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
329 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
336 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
337 (PRPC_UNICODE_STRING
)AccountName
,
339 (SAMPR_HANDLE
*)GroupHandle
,
342 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
344 Status
= I_RpcMapWin32Status(RpcExceptionCode());
354 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
355 IN PUNICODE_STRING AccountName
,
356 IN ULONG AccountType
,
357 IN ACCESS_MASK DesiredAccess
,
358 OUT PSAM_HANDLE UserHandle
,
359 OUT PULONG GrantedAccess
,
360 OUT PULONG RelativeId
)
364 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
365 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
366 UserHandle
, GrantedAccess
, RelativeId
);
373 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
374 (PRPC_UNICODE_STRING
)AccountName
,
377 (SAMPR_HANDLE
*)UserHandle
,
382 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
384 Status
= I_RpcMapWin32Status(RpcExceptionCode());
394 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
395 IN PUNICODE_STRING AccountName
,
396 IN ACCESS_MASK DesiredAccess
,
397 OUT PSAM_HANDLE UserHandle
,
398 OUT PULONG RelativeId
)
402 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
403 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
410 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
411 (PRPC_UNICODE_STRING
)AccountName
,
413 (SAMPR_HANDLE
*)UserHandle
,
416 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
418 Status
= I_RpcMapWin32Status(RpcExceptionCode());
428 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
430 SAMPR_HANDLE LocalAliasHandle
;
433 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
435 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
437 if (LocalAliasHandle
== NULL
)
438 return STATUS_INVALID_HANDLE
;
442 Status
= SamrDeleteAlias(&LocalAliasHandle
);
444 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
446 Status
= I_RpcMapWin32Status(RpcExceptionCode());
456 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
458 SAMPR_HANDLE LocalGroupHandle
;
461 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
463 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
465 if (LocalGroupHandle
== NULL
)
466 return STATUS_INVALID_HANDLE
;
470 Status
= SamrDeleteGroup(&LocalGroupHandle
);
472 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
474 Status
= I_RpcMapWin32Status(RpcExceptionCode());
484 SamDeleteUser(IN SAM_HANDLE UserHandle
)
486 SAMPR_HANDLE LocalUserHandle
;
489 TRACE("SamDeleteUser(%p)\n", UserHandle
);
491 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
493 if (LocalUserHandle
== NULL
)
494 return STATUS_INVALID_HANDLE
;
498 Status
= SamrDeleteUser(&LocalUserHandle
);
500 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
502 Status
= I_RpcMapWin32Status(RpcExceptionCode());
512 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
513 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
515 IN ULONG PreferedMaximumLength
,
516 OUT PULONG CountReturned
)
518 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
521 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
522 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
525 if ((EnumerationContext
== NULL
) ||
527 (CountReturned
== NULL
))
528 return STATUS_INVALID_PARAMETER
;
534 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
536 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
537 PreferedMaximumLength
,
540 if (EnumBuffer
!= NULL
)
542 if (EnumBuffer
->Buffer
!= NULL
)
544 *Buffer
= EnumBuffer
->Buffer
;
547 midl_user_free(EnumBuffer
);
550 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
552 Status
= I_RpcMapWin32Status(RpcExceptionCode());
562 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
563 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
565 IN ULONG PreferedMaximumLength
,
566 OUT PULONG CountReturned
)
568 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
571 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
572 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
575 if ((EnumerationContext
== NULL
) ||
577 (CountReturned
== NULL
))
578 return STATUS_INVALID_PARAMETER
;
584 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
586 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
587 PreferedMaximumLength
,
590 if (EnumBuffer
!= NULL
)
592 if (EnumBuffer
->Buffer
!= NULL
)
594 *Buffer
= EnumBuffer
->Buffer
;
597 midl_user_free(EnumBuffer
);
600 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
602 Status
= I_RpcMapWin32Status(RpcExceptionCode());
612 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
613 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
615 IN ULONG PreferedMaximumLength
,
616 OUT PULONG CountReturned
)
618 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
621 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
622 DomainHandle
, EnumerationContext
, Buffer
,
623 PreferedMaximumLength
, CountReturned
);
625 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
626 return STATUS_INVALID_PARAMETER
;
632 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
634 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
635 PreferedMaximumLength
,
637 if (EnumBuffer
!= NULL
)
639 if (EnumBuffer
->Buffer
!= NULL
)
640 *Buffer
= EnumBuffer
->Buffer
;
642 midl_user_free(EnumBuffer
);
645 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
647 Status
= I_RpcMapWin32Status(RpcExceptionCode());
657 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
658 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
659 IN ULONG UserAccountControl
,
661 IN ULONG PreferedMaximumLength
,
662 OUT PULONG CountReturned
)
664 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
667 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
668 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
669 PreferedMaximumLength
, CountReturned
);
671 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
672 return STATUS_INVALID_PARAMETER
;
678 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
681 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
682 PreferedMaximumLength
,
684 if (EnumBuffer
!= NULL
)
686 if (EnumBuffer
->Buffer
!= NULL
)
688 *Buffer
= EnumBuffer
->Buffer
;
691 midl_user_free(EnumBuffer
);
695 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
697 Status
= I_RpcMapWin32Status(RpcExceptionCode());
707 SamFreeMemory(IN PVOID Buffer
)
710 midl_user_free(Buffer
);
712 return STATUS_SUCCESS
;
718 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
719 IN ULONG PassedCount
,
721 OUT PULONG MembershipCount
,
724 SAMPR_PSID_ARRAY SidArray
;
725 SAMPR_ULONG_ARRAY Membership
;
728 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
729 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
732 MembershipCount
== NULL
||
734 return STATUS_INVALID_PARAMETER
;
736 Membership
.Element
= NULL
;
740 SidArray
.Count
= PassedCount
;
741 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
743 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
746 if (NT_SUCCESS(Status
))
748 *MembershipCount
= Membership
.Count
;
749 *Aliases
= Membership
.Element
;
753 if (Membership
.Element
!= NULL
)
754 midl_user_free(Membership
.Element
);
757 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
759 Status
= I_RpcMapWin32Status(RpcExceptionCode());
769 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
772 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
775 return STATUS_INVALID_PARAMETER
;
777 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
779 return STATUS_SUCCESS
;
785 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
786 OUT PGROUP_MEMBERSHIP
*Groups
,
787 OUT PULONG MembershipCount
)
789 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
792 TRACE("SamGetGroupsForUser(%p %p %p)\n",
793 UserHandle
, Groups
, MembershipCount
);
797 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
799 if (NT_SUCCESS(Status
))
801 *Groups
= GroupsBuffer
->Groups
;
802 *MembershipCount
= GroupsBuffer
->MembershipCount
;
804 MIDL_user_free(GroupsBuffer
);
808 if (GroupsBuffer
!= NULL
)
810 if (GroupsBuffer
->Groups
!= NULL
)
811 MIDL_user_free(GroupsBuffer
->Groups
);
813 MIDL_user_free(GroupsBuffer
);
817 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
819 Status
= I_RpcMapWin32Status(RpcExceptionCode());
829 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
830 OUT PSID
**MemberIds
,
831 OUT PULONG MemberCount
)
833 SAMPR_PSID_ARRAY_OUT SidArray
;
836 TRACE("SamGetMembersInAlias(%p %p %p)\n",
837 AliasHandle
, MemberIds
, MemberCount
);
839 if ((MemberIds
== NULL
) ||
840 (MemberCount
== NULL
))
841 return STATUS_INVALID_PARAMETER
;
846 SidArray
.Sids
= NULL
;
850 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
852 if (NT_SUCCESS(Status
))
854 *MemberCount
= SidArray
.Count
;
855 *MemberIds
= (PSID
*)SidArray
.Sids
;
859 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
861 Status
= I_RpcMapWin32Status(RpcExceptionCode());
871 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
872 OUT PULONG
*MemberIds
,
873 OUT PULONG
*Attributes
,
874 OUT PULONG MemberCount
)
876 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
879 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
880 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
884 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
886 if (NT_SUCCESS(Status
))
888 *MemberIds
= MembersBuffer
->Members
;
889 *Attributes
= MembersBuffer
->Attributes
;
890 *MemberCount
= MembersBuffer
->MemberCount
;
892 MIDL_user_free(MembersBuffer
);
896 if (MembersBuffer
!= NULL
)
898 if (MembersBuffer
->Members
!= NULL
)
899 MIDL_user_free(MembersBuffer
->Members
);
901 if (MembersBuffer
->Attributes
!= NULL
)
902 MIDL_user_free(MembersBuffer
->Attributes
);
904 MIDL_user_free(MembersBuffer
);
908 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
910 Status
= I_RpcMapWin32Status(RpcExceptionCode());
920 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
921 IN PUNICODE_STRING Name
,
926 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
927 ServerHandle
, Name
, DomainId
);
931 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
932 (PRPC_UNICODE_STRING
)Name
,
933 (PRPC_SID
*)DomainId
);
935 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
937 Status
= I_RpcMapWin32Status(RpcExceptionCode());
947 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
949 IN PULONG RelativeIds
,
950 OUT PUNICODE_STRING
*Names
,
951 OUT PSID_NAME_USE
*Use OPTIONAL
)
953 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
954 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
958 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
959 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
968 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
974 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
976 Status
= I_RpcMapWin32Status(RpcExceptionCode());
980 if (NT_SUCCESS(Status
))
982 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
985 Status
= STATUS_INSUFFICIENT_RESOURCES
;
989 for (i
= 0; i
< Count
; i
++)
991 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
992 if ((*Names
)[i
].Buffer
== NULL
)
994 Status
= STATUS_INSUFFICIENT_RESOURCES
;
999 for (i
= 0; i
< Count
; i
++)
1001 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1002 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1004 RtlCopyMemory((*Names
)[i
].Buffer
,
1005 NamesBuffer
.Element
[i
].Buffer
,
1006 NamesBuffer
.Element
[i
].Length
);
1011 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1014 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1020 Count
* sizeof(SID_NAME_USE
));
1025 if (!NT_SUCCESS(Status
))
1029 for (i
= 0; i
< Count
; i
++)
1031 if ((*Names
)[i
].Buffer
!= NULL
)
1032 midl_user_free((*Names
)[i
].Buffer
);
1035 midl_user_free(*Names
);
1038 if (Use
!= NULL
&& *Use
!= NULL
)
1039 midl_user_free(*Use
);
1042 if (NamesBuffer
.Element
!= NULL
)
1044 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1046 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1047 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1050 midl_user_free(NamesBuffer
.Element
);
1053 if (UseBuffer
.Element
!= NULL
)
1054 midl_user_free(UseBuffer
.Element
);
1062 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1064 IN PUNICODE_STRING Names
,
1065 OUT PULONG
*RelativeIds
,
1066 OUT PSID_NAME_USE
*Use
)
1068 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1069 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1072 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1073 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1075 *RelativeIds
= NULL
;
1080 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1082 (PRPC_UNICODE_STRING
)Names
,
1086 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1088 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1092 if (NT_SUCCESS(Status
))
1094 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1095 if (*RelativeIds
== NULL
)
1097 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1101 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1104 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1108 RtlCopyMemory(*RelativeIds
,
1110 Count
* sizeof(ULONG
));
1114 Count
* sizeof(SID_NAME_USE
));
1118 if (!NT_SUCCESS(Status
))
1120 if (*RelativeIds
!= NULL
)
1121 midl_user_free(*RelativeIds
);
1124 midl_user_free(*Use
);
1127 if (RidBuffer
.Element
!= NULL
)
1128 midl_user_free(RidBuffer
.Element
);
1130 if (UseBuffer
.Element
!= NULL
)
1131 midl_user_free(UseBuffer
.Element
);
1139 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1140 IN ACCESS_MASK DesiredAccess
,
1142 OUT PSAM_HANDLE AliasHandle
)
1146 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1147 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1151 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1154 (SAMPR_HANDLE
*)AliasHandle
);
1156 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1158 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1168 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1169 IN ACCESS_MASK DesiredAccess
,
1171 OUT PSAM_HANDLE DomainHandle
)
1175 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1176 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1180 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1183 (SAMPR_HANDLE
*)DomainHandle
);
1185 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1187 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1197 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1198 IN ACCESS_MASK DesiredAccess
,
1200 OUT PSAM_HANDLE GroupHandle
)
1204 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1205 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1209 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1212 (SAMPR_HANDLE
*)GroupHandle
);
1214 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1216 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1226 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1227 IN ACCESS_MASK DesiredAccess
,
1229 OUT PSAM_HANDLE UserHandle
)
1233 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1234 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1238 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1241 (SAMPR_HANDLE
*)UserHandle
);
1243 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1245 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1255 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1256 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1261 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1262 AliasHandle
, AliasInformationClass
, Buffer
);
1266 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1267 AliasInformationClass
,
1268 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1270 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1272 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1282 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1283 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1288 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1289 DomainHandle
, DomainInformationClass
, Buffer
);
1293 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1294 DomainInformationClass
,
1295 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1297 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1299 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1309 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1310 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1315 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1316 GroupHandle
, GroupInformationClass
, Buffer
);
1320 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1321 GroupInformationClass
,
1322 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1324 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1326 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1336 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1337 IN USER_INFORMATION_CLASS UserInformationClass
,
1342 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1343 UserHandle
, UserInformationClass
, Buffer
);
1347 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1348 UserInformationClass
,
1349 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1351 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1353 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1363 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1364 IN SECURITY_INFORMATION SecurityInformation
,
1365 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1367 SAMPR_SR_SECURITY_DESCRIPTOR LocalSecurityDescriptor
;
1368 PSAMPR_SR_SECURITY_DESCRIPTOR pLocalSecurityDescriptor
;
1371 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1372 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1374 LocalSecurityDescriptor
.Length
= 0;
1375 LocalSecurityDescriptor
.SecurityDescriptor
= NULL
;
1379 pLocalSecurityDescriptor
= &LocalSecurityDescriptor
;
1381 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1382 SecurityInformation
,
1383 &pLocalSecurityDescriptor
);
1385 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1387 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1391 *SecurityDescriptor
= LocalSecurityDescriptor
.SecurityDescriptor
;
1399 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1404 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1405 AliasHandle
, MemberId
);
1409 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1412 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1414 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1424 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1429 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1430 DomainHandle
, MemberId
);
1434 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1437 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1439 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1449 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1454 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1455 GroupHandle
, MemberId
);
1459 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1462 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1464 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1474 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1476 IN ULONG MemberCount
)
1478 SAMPR_PSID_ARRAY Buffer
;
1481 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1482 AliasHandle
, MemberIds
, MemberCount
);
1484 if (MemberIds
== NULL
)
1485 return STATUS_INVALID_PARAMETER_2
;
1487 Buffer
.Count
= MemberCount
;
1488 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1492 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1495 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1497 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1507 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1512 return STATUS_NOT_IMPLEMENTED
;
1518 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1519 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1524 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1525 AliasHandle
, AliasInformationClass
, Buffer
);
1529 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1530 AliasInformationClass
,
1533 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1535 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1545 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1546 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1551 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1552 DomainHandle
, DomainInformationClass
, Buffer
);
1556 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1557 DomainInformationClass
,
1560 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1562 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1572 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1573 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1578 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1579 GroupHandle
, GroupInformationClass
, Buffer
);
1583 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1584 GroupInformationClass
,
1587 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1589 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1599 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1600 IN USER_INFORMATION_CLASS UserInformationClass
,
1603 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1604 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1608 TRACE("SamSetInformationUser(%p %lu %p)\n",
1609 UserHandle
, UserInformationClass
, Buffer
);
1611 if (UserInformationClass
== UserSetPasswordInformation
)
1613 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1615 /* Calculate the NT hash value of the passord */
1616 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1617 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1618 if (!NT_SUCCESS(Status
))
1620 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1624 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1625 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1626 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1630 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1631 UserInternal1Information
,
1632 (PVOID
)&Internal1Buffer
);
1634 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1636 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1640 if (!NT_SUCCESS(Status
))
1642 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1649 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1650 UserInformationClass
,
1653 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1655 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1665 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
1667 IN ULONG Attributes
)
1671 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
1672 GroupHandle
, MemberId
, Attributes
);
1676 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
1680 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1682 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1692 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
1693 IN SECURITY_INFORMATION SecurityInformation
,
1694 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
1696 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
1700 TRACE("SamSetSecurityObject(%p %lu %p)\n",
1701 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1703 /* Retrieve the length of the relative security descriptor */
1705 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1708 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
1709 return STATUS_INVALID_PARAMETER
;
1712 /* Allocate a buffer for the security descriptor */
1713 DescriptorToPass
.Length
= Length
;
1714 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
1715 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
1716 return STATUS_INSUFFICIENT_RESOURCES
;
1718 /* Convert the given security descriptor to a relative security descriptor */
1719 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1720 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
1722 if (!NT_SUCCESS(Status
))
1727 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1728 SecurityInformation
,
1731 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1733 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1738 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
1739 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
1747 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
1751 TRACE("(%p)\n", ServerHandle
);
1755 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
1757 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1759 Status
= I_RpcMapWin32Status(RpcExceptionCode());