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.
19 /* $Id: samlib.c 58259 2013-02-01 22:18:28Z ekohl $
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
);
36 SystemFunction006(LPCSTR password
,
41 SystemFunction007(PUNICODE_STRING string
,
44 /* GLOBALS *******************************************************************/
47 /* FUNCTIONS *****************************************************************/
49 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
51 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
55 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
57 HeapFree(GetProcessHeap(), 0, ptr
);
62 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
64 handle_t hBinding
= NULL
;
65 LPWSTR pszStringBinding
;
68 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
70 status
= RpcStringBindingComposeW(NULL
,
78 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
82 /* Set the binding handle that will be used to bind to the server. */
83 status
= RpcBindingFromStringBindingW(pszStringBinding
,
87 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
90 status
= RpcStringFreeW(&pszStringBinding
);
93 // TRACE("RpcStringFree returned 0x%x\n", status);
101 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
106 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
108 status
= RpcBindingFree(&hBinding
);
111 TRACE("RpcBindingFree returned 0x%x\n", status
);
118 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
123 TRACE("SamAddMemberToAlias(%p %p)\n",
124 AliasHandle
, MemberId
);
128 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
131 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
133 Status
= I_RpcMapWin32Status(RpcExceptionCode());
143 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
149 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
150 GroupHandle
, MemberId
, Attributes
);
154 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
158 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
160 Status
= I_RpcMapWin32Status(RpcExceptionCode());
170 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
172 IN ULONG MemberCount
)
174 SAMPR_PSID_ARRAY Buffer
;
177 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
178 AliasHandle
, MemberIds
, MemberCount
);
180 if (MemberIds
== NULL
)
181 return STATUS_INVALID_PARAMETER_2
;
183 Buffer
.Count
= MemberCount
;
184 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
188 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
191 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
193 Status
= I_RpcMapWin32Status(RpcExceptionCode());
203 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
204 IN PUNICODE_STRING OldPassword
,
205 IN PUNICODE_STRING NewPassword
)
208 return STATUS_NOT_IMPLEMENTED
;
214 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
215 IN PUNICODE_STRING UserName
,
216 IN PUNICODE_STRING OldPassword
,
217 IN PUNICODE_STRING NewPassword
)
220 return STATUS_NOT_IMPLEMENTED
;
226 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
227 IN PUNICODE_STRING UserName
,
228 IN PUNICODE_STRING OldPassword
,
229 IN PUNICODE_STRING NewPassword
,
230 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
231 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
234 return STATUS_NOT_IMPLEMENTED
;
240 SamCloseHandle(IN SAM_HANDLE SamHandle
)
244 TRACE("SamCloseHandle(%p)\n", SamHandle
);
248 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
250 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
252 Status
= I_RpcMapWin32Status(RpcExceptionCode());
262 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
263 OUT PSAM_HANDLE ServerHandle
,
264 IN ACCESS_MASK DesiredAccess
,
265 IN POBJECT_ATTRIBUTES ObjectAttributes
)
269 TRACE("SamConnect(%p %p 0x%08x %p)\n",
270 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
274 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
275 (SAMPR_HANDLE
*)ServerHandle
,
278 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
280 Status
= I_RpcMapWin32Status(RpcExceptionCode());
290 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
291 IN PUNICODE_STRING AccountName
,
292 IN ACCESS_MASK DesiredAccess
,
293 OUT PSAM_HANDLE AliasHandle
,
294 OUT PULONG RelativeId
)
298 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
299 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
306 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
307 (PRPC_UNICODE_STRING
)AccountName
,
309 (SAMPR_HANDLE
*)AliasHandle
,
312 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
314 Status
= I_RpcMapWin32Status(RpcExceptionCode());
324 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
325 IN PUNICODE_STRING AccountName
,
326 IN ACCESS_MASK DesiredAccess
,
327 OUT PSAM_HANDLE GroupHandle
,
328 OUT PULONG RelativeId
)
332 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
333 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
340 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
341 (PRPC_UNICODE_STRING
)AccountName
,
343 (SAMPR_HANDLE
*)GroupHandle
,
346 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
348 Status
= I_RpcMapWin32Status(RpcExceptionCode());
358 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
359 IN PUNICODE_STRING AccountName
,
360 IN ULONG AccountType
,
361 IN ACCESS_MASK DesiredAccess
,
362 OUT PSAM_HANDLE UserHandle
,
363 OUT PULONG GrantedAccess
,
364 OUT PULONG RelativeId
)
368 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
369 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
370 UserHandle
, GrantedAccess
, RelativeId
);
377 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
378 (PRPC_UNICODE_STRING
)AccountName
,
381 (SAMPR_HANDLE
*)UserHandle
,
386 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
388 Status
= I_RpcMapWin32Status(RpcExceptionCode());
398 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
399 IN PUNICODE_STRING AccountName
,
400 IN ACCESS_MASK DesiredAccess
,
401 OUT PSAM_HANDLE UserHandle
,
402 OUT PULONG RelativeId
)
406 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
407 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
414 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
415 (PRPC_UNICODE_STRING
)AccountName
,
417 (SAMPR_HANDLE
*)UserHandle
,
420 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
422 Status
= I_RpcMapWin32Status(RpcExceptionCode());
432 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
434 SAMPR_HANDLE LocalAliasHandle
;
437 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
439 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
441 if (LocalAliasHandle
== NULL
)
442 return STATUS_INVALID_HANDLE
;
446 Status
= SamrDeleteAlias(&LocalAliasHandle
);
448 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
450 Status
= I_RpcMapWin32Status(RpcExceptionCode());
460 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
462 SAMPR_HANDLE LocalGroupHandle
;
465 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
467 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
469 if (LocalGroupHandle
== NULL
)
470 return STATUS_INVALID_HANDLE
;
474 Status
= SamrDeleteGroup(&LocalGroupHandle
);
476 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
478 Status
= I_RpcMapWin32Status(RpcExceptionCode());
488 SamDeleteUser(IN SAM_HANDLE UserHandle
)
490 SAMPR_HANDLE LocalUserHandle
;
493 TRACE("SamDeleteUser(%p)\n", UserHandle
);
495 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
497 if (LocalUserHandle
== NULL
)
498 return STATUS_INVALID_HANDLE
;
502 Status
= SamrDeleteUser(&LocalUserHandle
);
504 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
506 Status
= I_RpcMapWin32Status(RpcExceptionCode());
516 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
517 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
519 IN ULONG PreferedMaximumLength
,
520 OUT PULONG CountReturned
)
522 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
525 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
526 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
529 if ((EnumerationContext
== NULL
) ||
531 (CountReturned
== NULL
))
532 return STATUS_INVALID_PARAMETER
;
538 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
540 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
541 PreferedMaximumLength
,
544 if (EnumBuffer
!= NULL
)
546 if (EnumBuffer
->Buffer
!= NULL
)
548 *Buffer
= EnumBuffer
->Buffer
;
551 midl_user_free(EnumBuffer
);
554 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
556 Status
= I_RpcMapWin32Status(RpcExceptionCode());
566 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
567 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
569 IN ULONG PreferedMaximumLength
,
570 OUT PULONG CountReturned
)
572 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
575 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
576 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
579 if ((EnumerationContext
== NULL
) ||
581 (CountReturned
== NULL
))
582 return STATUS_INVALID_PARAMETER
;
588 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
590 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
591 PreferedMaximumLength
,
594 if (EnumBuffer
!= NULL
)
596 if (EnumBuffer
->Buffer
!= NULL
)
598 *Buffer
= EnumBuffer
->Buffer
;
601 midl_user_free(EnumBuffer
);
604 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
606 Status
= I_RpcMapWin32Status(RpcExceptionCode());
616 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
617 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
619 IN ULONG PreferedMaximumLength
,
620 OUT PULONG CountReturned
)
622 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
625 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
626 DomainHandle
, EnumerationContext
, Buffer
,
627 PreferedMaximumLength
, CountReturned
);
629 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
630 return STATUS_INVALID_PARAMETER
;
636 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
638 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
639 PreferedMaximumLength
,
641 if (EnumBuffer
!= NULL
)
643 if (EnumBuffer
->Buffer
!= NULL
)
644 *Buffer
= EnumBuffer
->Buffer
;
646 midl_user_free(EnumBuffer
);
649 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
651 Status
= I_RpcMapWin32Status(RpcExceptionCode());
661 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
662 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
663 IN ULONG UserAccountControl
,
665 IN ULONG PreferedMaximumLength
,
666 OUT PULONG CountReturned
)
668 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
671 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
672 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
673 PreferedMaximumLength
, CountReturned
);
675 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
676 return STATUS_INVALID_PARAMETER
;
682 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
685 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
686 PreferedMaximumLength
,
688 if (EnumBuffer
!= NULL
)
690 if (EnumBuffer
->Buffer
!= NULL
)
692 *Buffer
= EnumBuffer
->Buffer
;
695 midl_user_free(EnumBuffer
);
699 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
701 Status
= I_RpcMapWin32Status(RpcExceptionCode());
711 SamFreeMemory(IN PVOID Buffer
)
714 midl_user_free(Buffer
);
716 return STATUS_SUCCESS
;
722 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
723 IN ULONG PassedCount
,
725 OUT PULONG MembershipCount
,
728 SAMPR_PSID_ARRAY SidArray
;
729 SAMPR_ULONG_ARRAY Membership
;
732 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
733 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
736 MembershipCount
== NULL
||
738 return STATUS_INVALID_PARAMETER
;
740 Membership
.Element
= NULL
;
744 SidArray
.Count
= PassedCount
;
745 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
747 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
750 if (NT_SUCCESS(Status
))
752 *MembershipCount
= Membership
.Count
;
753 *Aliases
= Membership
.Element
;
757 if (Membership
.Element
!= NULL
)
758 midl_user_free(Membership
.Element
);
761 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
763 Status
= I_RpcMapWin32Status(RpcExceptionCode());
773 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
776 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
779 return STATUS_INVALID_PARAMETER
;
781 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
783 return STATUS_SUCCESS
;
789 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
790 OUT PGROUP_MEMBERSHIP
*Groups
,
791 OUT PULONG MembershipCount
)
793 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
796 TRACE("SamGetGroupsForUser(%p %p %p)\n",
797 UserHandle
, Groups
, MembershipCount
);
801 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
803 if (NT_SUCCESS(Status
))
805 *Groups
= GroupsBuffer
->Groups
;
806 *MembershipCount
= GroupsBuffer
->MembershipCount
;
808 MIDL_user_free(GroupsBuffer
);
812 if (GroupsBuffer
!= NULL
)
814 if (GroupsBuffer
->Groups
!= NULL
)
815 MIDL_user_free(GroupsBuffer
->Groups
);
817 MIDL_user_free(GroupsBuffer
);
821 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
823 Status
= I_RpcMapWin32Status(RpcExceptionCode());
833 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
834 OUT PSID
**MemberIds
,
835 OUT PULONG MemberCount
)
837 SAMPR_PSID_ARRAY_OUT SidArray
;
840 TRACE("SamGetMembersInAlias(%p %p %p)\n",
841 AliasHandle
, MemberIds
, MemberCount
);
843 if ((MemberIds
== NULL
) ||
844 (MemberCount
== NULL
))
845 return STATUS_INVALID_PARAMETER
;
850 SidArray
.Sids
= NULL
;
854 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
856 if (NT_SUCCESS(Status
))
858 *MemberCount
= SidArray
.Count
;
859 *MemberIds
= (PSID
*)SidArray
.Sids
;
863 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
865 Status
= I_RpcMapWin32Status(RpcExceptionCode());
875 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
876 OUT PULONG
*MemberIds
,
877 OUT PULONG
*Attributes
,
878 OUT PULONG MemberCount
)
880 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
883 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
884 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
888 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
890 if (NT_SUCCESS(Status
))
892 *MemberIds
= MembersBuffer
->Members
;
893 *Attributes
= MembersBuffer
->Attributes
;
894 *MemberCount
= MembersBuffer
->MemberCount
;
896 MIDL_user_free(MembersBuffer
);
900 if (MembersBuffer
!= NULL
)
902 if (MembersBuffer
->Members
!= NULL
)
903 MIDL_user_free(MembersBuffer
->Members
);
905 if (MembersBuffer
->Attributes
!= NULL
)
906 MIDL_user_free(MembersBuffer
->Attributes
);
908 MIDL_user_free(MembersBuffer
);
912 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
914 Status
= I_RpcMapWin32Status(RpcExceptionCode());
924 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
925 IN PUNICODE_STRING Name
,
930 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
931 ServerHandle
, Name
, DomainId
);
935 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
936 (PRPC_UNICODE_STRING
)Name
,
937 (PRPC_SID
*)DomainId
);
939 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
941 Status
= I_RpcMapWin32Status(RpcExceptionCode());
951 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
953 IN PULONG RelativeIds
,
954 OUT PUNICODE_STRING
*Names
,
955 OUT PSID_NAME_USE
*Use OPTIONAL
)
957 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
958 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
962 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
963 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
972 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
978 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
980 Status
= I_RpcMapWin32Status(RpcExceptionCode());
984 if (NT_SUCCESS(Status
))
986 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
989 Status
= STATUS_INSUFFICIENT_RESOURCES
;
993 for (i
= 0; i
< Count
; i
++)
995 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
996 if ((*Names
)[i
].Buffer
== NULL
)
998 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1003 for (i
= 0; i
< Count
; i
++)
1005 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1006 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1008 RtlCopyMemory((*Names
)[i
].Buffer
,
1009 NamesBuffer
.Element
[i
].Buffer
,
1010 NamesBuffer
.Element
[i
].Length
);
1015 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1018 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1024 Count
* sizeof(SID_NAME_USE
));
1029 if (!NT_SUCCESS(Status
))
1033 for (i
= 0; i
< Count
; i
++)
1035 if ((*Names
)[i
].Buffer
!= NULL
)
1036 midl_user_free((*Names
)[i
].Buffer
);
1039 midl_user_free(*Names
);
1042 if (Use
!= NULL
&& *Use
!= NULL
)
1043 midl_user_free(*Use
);
1046 if (NamesBuffer
.Element
!= NULL
)
1048 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1050 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1051 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1054 midl_user_free(NamesBuffer
.Element
);
1057 if (UseBuffer
.Element
!= NULL
)
1058 midl_user_free(UseBuffer
.Element
);
1066 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1068 IN PUNICODE_STRING Names
,
1069 OUT PULONG
*RelativeIds
,
1070 OUT PSID_NAME_USE
*Use
)
1072 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1073 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1076 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1077 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1079 *RelativeIds
= NULL
;
1084 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1086 (PRPC_UNICODE_STRING
)Names
,
1090 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1092 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1096 if (NT_SUCCESS(Status
))
1098 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1099 if (*RelativeIds
== NULL
)
1101 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1105 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1108 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1112 RtlCopyMemory(*RelativeIds
,
1114 Count
* sizeof(ULONG
));
1118 Count
* sizeof(SID_NAME_USE
));
1122 if (!NT_SUCCESS(Status
))
1124 if (*RelativeIds
!= NULL
)
1125 midl_user_free(*RelativeIds
);
1128 midl_user_free(*Use
);
1131 if (RidBuffer
.Element
!= NULL
)
1132 midl_user_free(RidBuffer
.Element
);
1134 if (UseBuffer
.Element
!= NULL
)
1135 midl_user_free(UseBuffer
.Element
);
1143 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1144 IN ACCESS_MASK DesiredAccess
,
1146 OUT PSAM_HANDLE AliasHandle
)
1150 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1151 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1155 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1158 (SAMPR_HANDLE
*)AliasHandle
);
1160 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1162 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1172 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1173 IN ACCESS_MASK DesiredAccess
,
1175 OUT PSAM_HANDLE DomainHandle
)
1179 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1180 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1184 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1187 (SAMPR_HANDLE
*)DomainHandle
);
1189 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1191 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1201 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1202 IN ACCESS_MASK DesiredAccess
,
1204 OUT PSAM_HANDLE GroupHandle
)
1208 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1209 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1213 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1216 (SAMPR_HANDLE
*)GroupHandle
);
1218 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1220 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1230 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1231 IN ACCESS_MASK DesiredAccess
,
1233 OUT PSAM_HANDLE UserHandle
)
1237 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1238 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1242 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1245 (SAMPR_HANDLE
*)UserHandle
);
1247 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1249 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1259 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1260 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1265 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1266 AliasHandle
, AliasInformationClass
, Buffer
);
1270 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1271 AliasInformationClass
,
1272 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1274 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1276 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1286 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1287 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1292 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1293 DomainHandle
, DomainInformationClass
, Buffer
);
1297 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1298 DomainInformationClass
,
1299 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1301 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1303 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1313 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1314 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1319 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1320 GroupHandle
, GroupInformationClass
, Buffer
);
1324 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1325 GroupInformationClass
,
1326 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1328 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1330 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1340 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1341 IN USER_INFORMATION_CLASS UserInformationClass
,
1346 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1347 UserHandle
, UserInformationClass
, Buffer
);
1351 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1352 UserInformationClass
,
1353 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1355 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1357 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1367 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1368 IN SECURITY_INFORMATION SecurityInformation
,
1369 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1371 SAMPR_SR_SECURITY_DESCRIPTOR LocalSecurityDescriptor
;
1372 PSAMPR_SR_SECURITY_DESCRIPTOR pLocalSecurityDescriptor
;
1375 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1376 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1378 LocalSecurityDescriptor
.Length
= 0;
1379 LocalSecurityDescriptor
.SecurityDescriptor
= NULL
;
1383 pLocalSecurityDescriptor
= &LocalSecurityDescriptor
;
1385 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1386 SecurityInformation
,
1387 &pLocalSecurityDescriptor
);
1389 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1391 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1395 *SecurityDescriptor
= LocalSecurityDescriptor
.SecurityDescriptor
;
1403 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1408 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1409 AliasHandle
, MemberId
);
1413 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1416 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1418 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1428 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1433 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1434 DomainHandle
, MemberId
);
1438 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1441 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1443 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1453 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1458 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1459 GroupHandle
, MemberId
);
1463 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1466 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1468 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1478 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1480 IN ULONG MemberCount
)
1482 SAMPR_PSID_ARRAY Buffer
;
1485 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1486 AliasHandle
, MemberIds
, MemberCount
);
1488 if (MemberIds
== NULL
)
1489 return STATUS_INVALID_PARAMETER_2
;
1491 Buffer
.Count
= MemberCount
;
1492 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1496 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1499 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1501 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1511 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1516 return STATUS_NOT_IMPLEMENTED
;
1522 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1523 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1528 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1529 AliasHandle
, AliasInformationClass
, Buffer
);
1533 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1534 AliasInformationClass
,
1537 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1539 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1549 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1550 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1555 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1556 DomainHandle
, DomainInformationClass
, Buffer
);
1560 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1561 DomainInformationClass
,
1564 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1566 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1576 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1577 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1582 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1583 GroupHandle
, GroupInformationClass
, Buffer
);
1587 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1588 GroupInformationClass
,
1591 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1593 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1603 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1604 IN USER_INFORMATION_CLASS UserInformationClass
,
1607 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1608 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1609 OEM_STRING LmPwdString
;
1610 CHAR LmPwdBuffer
[15];
1613 TRACE("SamSetInformationUser(%p %lu %p)\n",
1614 UserHandle
, UserInformationClass
, Buffer
);
1616 if (UserInformationClass
== UserSetPasswordInformation
)
1618 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1620 /* Calculate the NT hash value of the passord */
1621 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1622 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1623 if (!NT_SUCCESS(Status
))
1625 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1629 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1630 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1632 /* Build the LM password */
1633 LmPwdString
.Length
= 15;
1634 LmPwdString
.MaximumLength
= 15;
1635 LmPwdString
.Buffer
= LmPwdBuffer
;
1636 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
1638 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
1639 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
1641 if (NT_SUCCESS(Status
))
1643 /* Calculate the LM hash value of the password */
1644 Status
= SystemFunction006(LmPwdString
.Buffer
,
1645 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
1646 if (NT_SUCCESS(Status
))
1647 Internal1Buffer
.LmPasswordPresent
= TRUE
;
1650 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1654 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1655 UserInternal1Information
,
1656 (PVOID
)&Internal1Buffer
);
1658 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1660 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1664 if (!NT_SUCCESS(Status
))
1666 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1673 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1674 UserInformationClass
,
1677 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1679 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1689 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
1691 IN ULONG Attributes
)
1695 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
1696 GroupHandle
, MemberId
, Attributes
);
1700 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
1704 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1706 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1716 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
1717 IN SECURITY_INFORMATION SecurityInformation
,
1718 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
1720 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
1724 TRACE("SamSetSecurityObject(%p %lu %p)\n",
1725 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1727 /* Retrieve the length of the relative security descriptor */
1729 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1732 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
1733 return STATUS_INVALID_PARAMETER
;
1736 /* Allocate a buffer for the security descriptor */
1737 DescriptorToPass
.Length
= Length
;
1738 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
1739 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
1740 return STATUS_INSUFFICIENT_RESOURCES
;
1742 /* Convert the given security descriptor to a relative security descriptor */
1743 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1744 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
1746 if (!NT_SUCCESS(Status
))
1751 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1752 SecurityInformation
,
1755 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1757 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1762 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
1763 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
1771 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
1775 TRACE("(%p)\n", ServerHandle
);
1779 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
1781 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1783 Status
= I_RpcMapWin32Status(RpcExceptionCode());