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
);
34 /* GLOBALS *******************************************************************/
37 /* FUNCTIONS *****************************************************************/
39 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
41 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
45 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
47 HeapFree(GetProcessHeap(), 0, ptr
);
52 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
54 handle_t hBinding
= NULL
;
55 LPWSTR pszStringBinding
;
58 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
60 status
= RpcStringBindingComposeW(NULL
,
68 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
72 /* Set the binding handle that will be used to bind to the server. */
73 status
= RpcBindingFromStringBindingW(pszStringBinding
,
77 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
80 status
= RpcStringFreeW(&pszStringBinding
);
83 // TRACE("RpcStringFree returned 0x%x\n", status);
91 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
96 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
98 status
= RpcBindingFree(&hBinding
);
101 TRACE("RpcBindingFree returned 0x%x\n", status
);
108 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
113 TRACE("SamAddMemberToAlias(%p %p)\n",
114 AliasHandle
, MemberId
);
118 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
121 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
123 Status
= I_RpcMapWin32Status(RpcExceptionCode());
133 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
139 TRACE("SamAddMemberToGroup(%p %lu %lx)",
140 GroupHandle
, MemberId
, Attributes
);
144 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
148 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
150 Status
= I_RpcMapWin32Status(RpcExceptionCode());
160 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
162 IN ULONG MemberCount
)
164 SAMPR_PSID_ARRAY Buffer
;
167 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
168 AliasHandle
, MemberIds
, MemberCount
);
170 if (MemberIds
== NULL
)
171 return STATUS_INVALID_PARAMETER_2
;
173 Buffer
.Count
= MemberCount
;
174 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
178 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
181 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
183 Status
= I_RpcMapWin32Status(RpcExceptionCode());
193 SamCloseHandle(IN SAM_HANDLE SamHandle
)
197 TRACE("SamCloseHandle(%p)\n", SamHandle
);
201 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
203 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
205 Status
= I_RpcMapWin32Status(RpcExceptionCode());
215 SamConnect(IN OUT PUNICODE_STRING ServerName
,
216 OUT PSAM_HANDLE ServerHandle
,
217 IN ACCESS_MASK DesiredAccess
,
218 IN POBJECT_ATTRIBUTES ObjectAttributes
)
222 TRACE("SamConnect(%p %p 0x%08x %p)\n",
223 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
227 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
228 (SAMPR_HANDLE
*)ServerHandle
,
231 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
233 Status
= I_RpcMapWin32Status(RpcExceptionCode());
243 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
244 IN PUNICODE_STRING AccountName
,
245 IN ACCESS_MASK DesiredAccess
,
246 OUT PSAM_HANDLE AliasHandle
,
247 OUT PULONG RelativeId
)
251 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
252 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
259 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
260 (PRPC_UNICODE_STRING
)AccountName
,
262 (SAMPR_HANDLE
*)AliasHandle
,
265 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
267 Status
= I_RpcMapWin32Status(RpcExceptionCode());
277 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
278 IN PUNICODE_STRING AccountName
,
279 IN ACCESS_MASK DesiredAccess
,
280 OUT PSAM_HANDLE GroupHandle
,
281 OUT PULONG RelativeId
)
285 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
286 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
293 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
294 (PRPC_UNICODE_STRING
)AccountName
,
296 (SAMPR_HANDLE
*)GroupHandle
,
299 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
301 Status
= I_RpcMapWin32Status(RpcExceptionCode());
311 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
312 IN PUNICODE_STRING AccountName
,
313 IN ULONG AccountType
,
314 IN ACCESS_MASK DesiredAccess
,
315 OUT PSAM_HANDLE UserHandle
,
316 OUT PULONG GrantedAccess
,
317 OUT PULONG RelativeId
)
321 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
322 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
323 UserHandle
, GrantedAccess
, RelativeId
);
330 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
331 (PRPC_UNICODE_STRING
)AccountName
,
334 (SAMPR_HANDLE
*)UserHandle
,
339 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
341 Status
= I_RpcMapWin32Status(RpcExceptionCode());
351 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
352 IN PUNICODE_STRING AccountName
,
353 IN ACCESS_MASK DesiredAccess
,
354 OUT PSAM_HANDLE UserHandle
,
355 OUT PULONG RelativeId
)
359 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
360 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
367 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
368 (PRPC_UNICODE_STRING
)AccountName
,
370 (SAMPR_HANDLE
*)UserHandle
,
373 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
375 Status
= I_RpcMapWin32Status(RpcExceptionCode());
385 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
387 SAMPR_HANDLE LocalAliasHandle
;
390 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
392 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
394 if (LocalAliasHandle
== NULL
)
395 return STATUS_INVALID_HANDLE
;
399 Status
= SamrDeleteAlias(&LocalAliasHandle
);
401 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
403 Status
= I_RpcMapWin32Status(RpcExceptionCode());
413 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
415 SAMPR_HANDLE LocalGroupHandle
;
418 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
420 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
422 if (LocalGroupHandle
== NULL
)
423 return STATUS_INVALID_HANDLE
;
427 Status
= SamrDeleteGroup(&LocalGroupHandle
);
429 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
431 Status
= I_RpcMapWin32Status(RpcExceptionCode());
441 SamDeleteUser(IN SAM_HANDLE UserHandle
)
443 SAMPR_HANDLE LocalUserHandle
;
446 TRACE("SamDeleteUser(%p)\n", UserHandle
);
448 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
450 if (LocalUserHandle
== NULL
)
451 return STATUS_INVALID_HANDLE
;
455 Status
= SamrDeleteUser(&LocalUserHandle
);
457 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
459 Status
= I_RpcMapWin32Status(RpcExceptionCode());
469 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
470 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
472 IN ULONG PreferedMaximumLength
,
473 OUT PULONG CountReturned
)
475 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
478 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
479 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
482 if ((EnumerationContext
== NULL
) ||
484 (CountReturned
== NULL
))
485 return STATUS_INVALID_PARAMETER
;
491 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
493 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
494 PreferedMaximumLength
,
497 if (EnumBuffer
!= NULL
)
499 if (EnumBuffer
->Buffer
!= NULL
)
501 *Buffer
= EnumBuffer
->Buffer
;
504 midl_user_free(EnumBuffer
);
507 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
509 Status
= I_RpcMapWin32Status(RpcExceptionCode());
519 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
520 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
522 IN ULONG PreferedMaximumLength
,
523 OUT PULONG CountReturned
)
525 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
528 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
529 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
532 if ((EnumerationContext
== NULL
) ||
534 (CountReturned
== NULL
))
535 return STATUS_INVALID_PARAMETER
;
541 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
543 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
544 PreferedMaximumLength
,
547 if (EnumBuffer
!= NULL
)
549 if (EnumBuffer
->Buffer
!= NULL
)
551 *Buffer
= EnumBuffer
->Buffer
;
554 midl_user_free(EnumBuffer
);
557 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
559 Status
= I_RpcMapWin32Status(RpcExceptionCode());
569 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
570 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
572 IN ULONG PreferedMaximumLength
,
573 OUT PULONG CountReturned
)
575 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
578 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
579 DomainHandle
, EnumerationContext
, Buffer
,
580 PreferedMaximumLength
, CountReturned
);
582 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
583 return STATUS_INVALID_PARAMETER
;
589 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
591 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
592 PreferedMaximumLength
,
594 if (EnumBuffer
!= NULL
)
596 if (EnumBuffer
->Buffer
!= NULL
)
597 *Buffer
= EnumBuffer
->Buffer
;
599 midl_user_free(EnumBuffer
);
602 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
604 Status
= I_RpcMapWin32Status(RpcExceptionCode());
614 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
615 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
616 IN ULONG UserAccountControl
,
618 IN ULONG PreferedMaximumLength
,
619 OUT PULONG CountReturned
)
621 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
624 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
625 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
626 PreferedMaximumLength
, CountReturned
);
628 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
629 return STATUS_INVALID_PARAMETER
;
635 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
638 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
639 PreferedMaximumLength
,
641 if (EnumBuffer
!= NULL
)
643 if (EnumBuffer
->Buffer
!= NULL
)
645 *Buffer
= EnumBuffer
->Buffer
;
648 midl_user_free(EnumBuffer
);
652 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
654 Status
= I_RpcMapWin32Status(RpcExceptionCode());
664 SamFreeMemory(IN PVOID Buffer
)
667 midl_user_free(Buffer
);
669 return STATUS_SUCCESS
;
675 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
676 IN ULONG PassedCount
,
678 OUT PULONG MembershipCount
,
681 SAMPR_PSID_ARRAY SidArray
;
682 SAMPR_ULONG_ARRAY Membership
;
685 TRACE("SamAliasMembership(%p %ul %p %p %p)\n",
686 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
689 MembershipCount
== NULL
||
691 return STATUS_INVALID_PARAMETER
;
693 Membership
.Element
= NULL
;
697 SidArray
.Count
= PassedCount
;
698 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
700 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
703 if (NT_SUCCESS(Status
))
705 *MembershipCount
= Membership
.Count
;
706 *Aliases
= Membership
.Element
;
710 if (Membership
.Element
!= NULL
)
711 midl_user_free(Membership
.Element
);
714 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
716 Status
= I_RpcMapWin32Status(RpcExceptionCode());
726 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
729 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
732 return STATUS_INVALID_PARAMETER
;
734 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
736 return STATUS_SUCCESS
;
742 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
743 OUT PGROUP_MEMBERSHIP
*Groups
,
744 OUT PULONG MembershipCount
)
746 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
749 TRACE("SamGetGroupsForUser(%p %p %p)\n",
750 UserHandle
, Groups
, MembershipCount
);
754 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
756 if (NT_SUCCESS(Status
))
758 *Groups
= GroupsBuffer
->Groups
;
759 *MembershipCount
= GroupsBuffer
->MembershipCount
;
761 MIDL_user_free(GroupsBuffer
);
765 if (GroupsBuffer
!= NULL
)
767 if (GroupsBuffer
->Groups
!= NULL
)
768 MIDL_user_free(GroupsBuffer
->Groups
);
770 MIDL_user_free(GroupsBuffer
);
774 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
776 Status
= I_RpcMapWin32Status(RpcExceptionCode());
786 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
787 OUT PSID
**MemberIds
,
788 OUT PULONG MemberCount
)
790 SAMPR_PSID_ARRAY_OUT SidArray
;
793 TRACE("SamGetMembersInAlias(%p %p %p)\n",
794 AliasHandle
, MemberIds
, MemberCount
);
796 if ((MemberIds
== NULL
) ||
797 (MemberCount
== NULL
))
798 return STATUS_INVALID_PARAMETER
;
803 SidArray
.Sids
= NULL
;
807 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
809 if (NT_SUCCESS(Status
))
811 *MemberCount
= SidArray
.Count
;
812 *MemberIds
= (PSID
*)SidArray
.Sids
;
816 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
818 Status
= I_RpcMapWin32Status(RpcExceptionCode());
828 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
829 OUT PULONG
*MemberIds
,
830 OUT PULONG
*Attributes
,
831 OUT PULONG MemberCount
)
833 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
836 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
837 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
841 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
843 if (NT_SUCCESS(Status
))
845 *MemberIds
= MembersBuffer
->Members
;
846 *Attributes
= MembersBuffer
->Attributes
;
847 *MemberCount
= MembersBuffer
->MemberCount
;
849 MIDL_user_free(MembersBuffer
);
853 if (MembersBuffer
!= NULL
)
855 if (MembersBuffer
->Members
!= NULL
)
856 MIDL_user_free(MembersBuffer
->Members
);
858 if (MembersBuffer
->Attributes
!= NULL
)
859 MIDL_user_free(MembersBuffer
->Attributes
);
861 MIDL_user_free(MembersBuffer
);
865 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
867 Status
= I_RpcMapWin32Status(RpcExceptionCode());
877 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
878 IN PUNICODE_STRING Name
,
883 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
884 ServerHandle
, Name
, DomainId
);
888 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
889 (PRPC_UNICODE_STRING
)Name
,
890 (PRPC_SID
*)DomainId
);
892 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
894 Status
= I_RpcMapWin32Status(RpcExceptionCode());
904 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
906 IN PULONG RelativeIds
,
907 OUT PUNICODE_STRING
*Names
,
908 OUT PSID_NAME_USE
*Use
)
910 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
911 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
915 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
916 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
923 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
929 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
931 Status
= I_RpcMapWin32Status(RpcExceptionCode());
935 if (NT_SUCCESS(Status
))
937 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
940 Status
= STATUS_INSUFFICIENT_RESOURCES
;
944 for (i
= 0; i
< Count
; i
++)
946 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
947 if ((*Names
)[i
].Buffer
== NULL
)
949 Status
= STATUS_INSUFFICIENT_RESOURCES
;
954 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
957 Status
= STATUS_INSUFFICIENT_RESOURCES
;
961 for (i
= 0; i
< Count
; i
++)
963 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
964 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
966 RtlCopyMemory((*Names
)[i
].Buffer
,
967 NamesBuffer
.Element
[i
].Buffer
,
968 NamesBuffer
.Element
[i
].Length
);
973 Count
* sizeof(SID_NAME_USE
));
977 if (!NT_SUCCESS(Status
))
981 for (i
= 0; i
< Count
; i
++)
983 if ((*Names
)[i
].Buffer
!= NULL
)
984 midl_user_free((*Names
)[i
].Buffer
);
987 midl_user_free(*Names
);
991 midl_user_free(*Use
);
994 if (NamesBuffer
.Element
!= NULL
)
996 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
998 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
999 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1002 midl_user_free(NamesBuffer
.Element
);
1005 if (UseBuffer
.Element
!= NULL
)
1006 midl_user_free(UseBuffer
.Element
);
1014 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1016 IN PUNICODE_STRING Names
,
1017 OUT PULONG
*RelativeIds
,
1018 OUT PSID_NAME_USE
*Use
)
1020 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1021 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1024 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1025 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1027 *RelativeIds
= NULL
;
1032 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1034 (PRPC_UNICODE_STRING
)Names
,
1038 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1040 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1044 if (NT_SUCCESS(Status
))
1046 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1047 if (*RelativeIds
== NULL
)
1049 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1053 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1056 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1060 RtlCopyMemory(*RelativeIds
,
1062 Count
* sizeof(ULONG
));
1066 Count
* sizeof(SID_NAME_USE
));
1070 if (!NT_SUCCESS(Status
))
1072 if (*RelativeIds
!= NULL
)
1073 midl_user_free(*RelativeIds
);
1076 midl_user_free(*Use
);
1079 if (RidBuffer
.Element
!= NULL
)
1080 midl_user_free(RidBuffer
.Element
);
1082 if (UseBuffer
.Element
!= NULL
)
1083 midl_user_free(UseBuffer
.Element
);
1091 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1092 IN ACCESS_MASK DesiredAccess
,
1094 OUT PSAM_HANDLE AliasHandle
)
1098 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1099 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1103 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1106 (SAMPR_HANDLE
*)AliasHandle
);
1108 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1110 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1120 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1121 IN ACCESS_MASK DesiredAccess
,
1123 OUT PSAM_HANDLE DomainHandle
)
1127 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1128 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1132 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1135 (SAMPR_HANDLE
*)DomainHandle
);
1137 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1139 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1149 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1150 IN ACCESS_MASK DesiredAccess
,
1152 OUT PSAM_HANDLE GroupHandle
)
1156 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1157 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1161 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1164 (SAMPR_HANDLE
*)GroupHandle
);
1166 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1168 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1178 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1179 IN ACCESS_MASK DesiredAccess
,
1181 OUT PSAM_HANDLE UserHandle
)
1185 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1186 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1190 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1193 (SAMPR_HANDLE
*)UserHandle
);
1195 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1197 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1207 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1208 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1213 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1214 AliasHandle
, AliasInformationClass
, Buffer
);
1218 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1219 AliasInformationClass
,
1220 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1222 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1224 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1234 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1235 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1240 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1241 DomainHandle
, DomainInformationClass
, Buffer
);
1245 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1246 DomainInformationClass
,
1247 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1249 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1251 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1261 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1262 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1267 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1268 GroupHandle
, GroupInformationClass
, Buffer
);
1272 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1273 GroupInformationClass
,
1274 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1276 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1278 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1288 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1289 IN USER_INFORMATION_CLASS UserInformationClass
,
1294 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1295 UserHandle
, UserInformationClass
, Buffer
);
1299 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1300 UserInformationClass
,
1301 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1303 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1305 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1315 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1316 IN SECURITY_INFORMATION SecurityInformation
,
1317 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1319 SAMPR_SR_SECURITY_DESCRIPTOR LocalSecurityDescriptor
;
1320 PSAMPR_SR_SECURITY_DESCRIPTOR pLocalSecurityDescriptor
;
1323 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1324 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1326 LocalSecurityDescriptor
.Length
= 0;
1327 LocalSecurityDescriptor
.SecurityDescriptor
= NULL
;
1331 pLocalSecurityDescriptor
= &LocalSecurityDescriptor
;
1333 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1334 SecurityInformation
,
1335 &pLocalSecurityDescriptor
);
1337 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1339 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1343 *SecurityDescriptor
= LocalSecurityDescriptor
.SecurityDescriptor
;
1351 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1356 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1357 AliasHandle
, MemberId
);
1361 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1364 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1366 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1376 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1381 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1382 DomainHandle
, MemberId
);
1386 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1389 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1391 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1401 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1406 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1407 GroupHandle
, MemberId
);
1411 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1414 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1416 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1426 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1428 IN ULONG MemberCount
)
1430 SAMPR_PSID_ARRAY Buffer
;
1433 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1434 AliasHandle
, MemberIds
, MemberCount
);
1436 if (MemberIds
== NULL
)
1437 return STATUS_INVALID_PARAMETER_2
;
1439 Buffer
.Count
= MemberCount
;
1440 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1444 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1447 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1449 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1459 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1464 return STATUS_NOT_IMPLEMENTED
;
1470 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1471 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1476 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1477 AliasHandle
, AliasInformationClass
, Buffer
);
1481 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1482 AliasInformationClass
,
1485 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1487 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1497 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1498 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1503 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1504 DomainHandle
, DomainInformationClass
, Buffer
);
1508 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1509 DomainInformationClass
,
1512 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1514 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1524 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1525 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1530 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1531 GroupHandle
, GroupInformationClass
, Buffer
);
1535 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1536 GroupInformationClass
,
1539 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1541 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1551 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1552 IN USER_INFORMATION_CLASS UserInformationClass
,
1557 TRACE("SamSetInformationUser(%p %lu %p)\n",
1558 UserHandle
, UserInformationClass
, Buffer
);
1562 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1563 UserInformationClass
,
1566 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1568 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1578 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
1580 IN ULONG Attributes
)
1584 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
1585 GroupHandle
, MemberId
, Attributes
);
1589 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
1593 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1595 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1605 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
1606 IN SECURITY_INFORMATION SecurityInformation
,
1607 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
1609 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
1613 TRACE("SamSetSecurityObject(%p %lu %p)\n",
1614 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1616 /* Retrieve the length of the relative security descriptor */
1618 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1621 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
1622 return STATUS_INVALID_PARAMETER
;
1625 /* Allocate a buffer for the security descriptor */
1626 DescriptorToPass
.Length
= Length
;
1627 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
1628 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
1629 return STATUS_INSUFFICIENT_RESOURCES
;
1631 /* Convert the given security descriptor to a relative security descriptor */
1632 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1633 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
1635 if (!NT_SUCCESS(Status
))
1640 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1641 SecurityInformation
,
1644 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1646 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1651 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
1652 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
1660 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
1663 return STATUS_NOT_IMPLEMENTED
;