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 SamCloseHandle(IN SAM_HANDLE SamHandle
)
137 TRACE("SamCloseHandle(%p)\n", SamHandle
);
141 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
143 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
145 Status
= I_RpcMapWin32Status(RpcExceptionCode());
155 SamConnect(IN OUT PUNICODE_STRING ServerName
,
156 OUT PSAM_HANDLE ServerHandle
,
157 IN ACCESS_MASK DesiredAccess
,
158 IN POBJECT_ATTRIBUTES ObjectAttributes
)
162 TRACE("SamConnect(%p %p 0x%08x %p)\n",
163 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
167 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
168 (SAMPR_HANDLE
*)ServerHandle
,
171 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
173 Status
= I_RpcMapWin32Status(RpcExceptionCode());
183 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
184 IN PUNICODE_STRING AccountName
,
185 IN ACCESS_MASK DesiredAccess
,
186 OUT PSAM_HANDLE AliasHandle
,
187 OUT PULONG RelativeId
)
191 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
192 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
196 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
197 (PRPC_UNICODE_STRING
)AccountName
,
199 (SAMPR_HANDLE
*)AliasHandle
,
202 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
204 Status
= I_RpcMapWin32Status(RpcExceptionCode());
214 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
215 IN PUNICODE_STRING AccountName
,
216 IN ACCESS_MASK DesiredAccess
,
217 OUT PSAM_HANDLE GroupHandle
,
218 OUT PULONG RelativeId
)
222 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
223 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
227 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
228 (PRPC_UNICODE_STRING
)AccountName
,
230 (SAMPR_HANDLE
*)GroupHandle
,
233 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
235 Status
= I_RpcMapWin32Status(RpcExceptionCode());
245 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
246 IN PUNICODE_STRING AccountName
,
247 IN ACCESS_MASK DesiredAccess
,
248 OUT PSAM_HANDLE UserHandle
,
249 OUT PULONG RelativeId
)
253 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
254 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
258 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
259 (PRPC_UNICODE_STRING
)AccountName
,
261 (SAMPR_HANDLE
*)UserHandle
,
264 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
266 Status
= I_RpcMapWin32Status(RpcExceptionCode());
276 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
277 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
279 IN ULONG PreferedMaximumLength
,
280 OUT PULONG CountReturned
)
282 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
285 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
286 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
289 if ((EnumerationContext
== NULL
) ||
291 (CountReturned
== NULL
))
292 return STATUS_INVALID_PARAMETER
;
298 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
300 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
301 PreferedMaximumLength
,
304 if (EnumBuffer
!= NULL
)
306 if (EnumBuffer
->Buffer
!= NULL
)
308 *Buffer
= EnumBuffer
->Buffer
;
311 midl_user_free(EnumBuffer
);
314 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
316 Status
= I_RpcMapWin32Status(RpcExceptionCode());
326 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
327 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
329 IN ULONG PreferedMaximumLength
,
330 OUT PULONG CountReturned
)
332 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
335 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
336 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
339 if ((EnumerationContext
== NULL
) ||
341 (CountReturned
== NULL
))
342 return STATUS_INVALID_PARAMETER
;
348 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
350 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
351 PreferedMaximumLength
,
354 if (EnumBuffer
!= NULL
)
356 if (EnumBuffer
->Buffer
!= NULL
)
358 *Buffer
= EnumBuffer
->Buffer
;
361 midl_user_free(EnumBuffer
);
364 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
366 Status
= I_RpcMapWin32Status(RpcExceptionCode());
376 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
377 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
379 IN ULONG PreferedMaximumLength
,
380 OUT PULONG CountReturned
)
382 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
385 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
386 DomainHandle
, EnumerationContext
, Buffer
,
387 PreferedMaximumLength
, CountReturned
);
389 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
390 return STATUS_INVALID_PARAMETER
;
396 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
398 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
399 PreferedMaximumLength
,
401 if (EnumBuffer
!= NULL
)
403 if (EnumBuffer
->Buffer
!= NULL
)
404 *Buffer
= EnumBuffer
->Buffer
;
406 midl_user_free(EnumBuffer
);
409 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
411 Status
= I_RpcMapWin32Status(RpcExceptionCode());
421 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
422 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
423 IN ULONG UserAccountControl
,
425 IN ULONG PreferedMaximumLength
,
426 OUT PULONG CountReturned
)
428 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
431 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
432 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
433 PreferedMaximumLength
, CountReturned
);
435 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
436 return STATUS_INVALID_PARAMETER
;
442 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
445 (PSAMPR_ENUMERATION_BUFFER
*)&EnumBuffer
,
446 PreferedMaximumLength
,
448 if (EnumBuffer
!= NULL
)
450 if (EnumBuffer
->Buffer
!= NULL
)
452 *Buffer
= EnumBuffer
->Buffer
;
455 midl_user_free(EnumBuffer
);
459 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
461 Status
= I_RpcMapWin32Status(RpcExceptionCode());
471 SamFreeMemory(IN PVOID Buffer
)
474 midl_user_free(Buffer
);
476 return STATUS_SUCCESS
;
482 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
483 IN ULONG PassedCount
,
485 OUT PULONG MembershipCount
,
488 SAMPR_PSID_ARRAY SidArray
;
489 SAMPR_ULONG_ARRAY Membership
;
492 TRACE("SamAliasMembership(%p %ul %p %p %p)\n",
493 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
496 MembershipCount
== NULL
||
498 return STATUS_INVALID_PARAMETER
;
500 Membership
.Element
= NULL
;
504 SidArray
.Count
= PassedCount
;
505 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
507 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
510 if (NT_SUCCESS(Status
))
512 *MembershipCount
= Membership
.Count
;
513 *Aliases
= Membership
.Element
;
517 if (Membership
.Element
!= NULL
)
518 midl_user_free(Membership
.Element
);
521 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
523 Status
= I_RpcMapWin32Status(RpcExceptionCode());
533 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
534 OUT PSID
**MemberIds
,
535 OUT PULONG MemberCount
)
537 SAMPR_PSID_ARRAY_OUT SidArray
;
540 TRACE("SamGetMembersInAlias(%p %p %p)\n",
541 AliasHandle
, MemberIds
, MemberCount
);
543 if ((MemberIds
== NULL
) ||
544 (MemberCount
== NULL
))
545 return STATUS_INVALID_PARAMETER
;
550 SidArray
.Sids
= NULL
;
554 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
556 if (NT_SUCCESS(Status
))
558 *MemberCount
= SidArray
.Count
;
559 *MemberIds
= (PSID
*)SidArray
.Sids
;
563 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
565 Status
= I_RpcMapWin32Status(RpcExceptionCode());
575 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
576 IN PUNICODE_STRING Name
,
581 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
582 ServerHandle
, Name
, DomainId
);
586 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
587 (PRPC_UNICODE_STRING
)Name
,
588 (PRPC_SID
*)DomainId
);
590 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
592 Status
= I_RpcMapWin32Status(RpcExceptionCode());
602 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
604 IN PUNICODE_STRING Names
,
605 OUT PULONG
*RelativeIds
,
606 OUT PSID_NAME_USE
*Use
)
609 return STATUS_NOT_IMPLEMENTED
;
615 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
616 IN ACCESS_MASK DesiredAccess
,
618 OUT PSAM_HANDLE AliasHandle
)
622 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
623 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
627 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
630 (SAMPR_HANDLE
*)AliasHandle
);
632 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
634 Status
= I_RpcMapWin32Status(RpcExceptionCode());
644 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
645 IN ACCESS_MASK DesiredAccess
,
647 OUT PSAM_HANDLE DomainHandle
)
651 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
652 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
656 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
659 (SAMPR_HANDLE
*)DomainHandle
);
661 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
663 Status
= I_RpcMapWin32Status(RpcExceptionCode());
673 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
674 IN ACCESS_MASK DesiredAccess
,
676 OUT PSAM_HANDLE GroupHandle
)
680 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
681 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
685 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
688 (SAMPR_HANDLE
*)GroupHandle
);
690 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
692 Status
= I_RpcMapWin32Status(RpcExceptionCode());
702 SamOpenUser(IN SAM_HANDLE DomainHandle
,
703 IN ACCESS_MASK DesiredAccess
,
705 OUT PSAM_HANDLE UserHandle
)
709 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
710 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
714 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
717 (SAMPR_HANDLE
*)UserHandle
);
719 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
721 Status
= I_RpcMapWin32Status(RpcExceptionCode());
731 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
732 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
737 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
738 AliasHandle
, AliasInformationClass
, Buffer
);
742 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
743 AliasInformationClass
,
744 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
746 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
748 Status
= I_RpcMapWin32Status(RpcExceptionCode());
758 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
759 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
764 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
765 DomainHandle
, DomainInformationClass
, Buffer
);
769 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
770 DomainInformationClass
,
771 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
773 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
775 Status
= I_RpcMapWin32Status(RpcExceptionCode());
785 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
786 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
791 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
792 GroupHandle
, GroupInformationClass
, Buffer
);
796 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
797 GroupInformationClass
,
798 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
800 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
802 Status
= I_RpcMapWin32Status(RpcExceptionCode());
812 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
813 IN USER_INFORMATION_CLASS UserInformationClass
,
818 TRACE("SamQueryInformationUser(%p %lu %p)\n",
819 UserHandle
, UserInformationClass
, Buffer
);
823 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
824 UserInformationClass
,
825 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
827 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
829 Status
= I_RpcMapWin32Status(RpcExceptionCode());
839 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
840 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
845 TRACE("SamSetInformationAlias(%p %lu %p)\n",
846 AliasHandle
, AliasInformationClass
, Buffer
);
850 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
851 AliasInformationClass
,
854 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
856 Status
= I_RpcMapWin32Status(RpcExceptionCode());
866 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
867 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
872 TRACE("SamSetInformationDomain(%p %lu %p)\n",
873 DomainHandle
, DomainInformationClass
, Buffer
);
877 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
878 DomainInformationClass
,
881 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
883 Status
= I_RpcMapWin32Status(RpcExceptionCode());
893 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
894 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
899 TRACE("SamSetInformationGroup(%p %lu %p)\n",
900 GroupHandle
, GroupInformationClass
, Buffer
);
904 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
905 GroupInformationClass
,
908 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
910 Status
= I_RpcMapWin32Status(RpcExceptionCode());
920 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
921 IN USER_INFORMATION_CLASS UserInformationClass
,
926 TRACE("SamSetInformationUser(%p %lu %p)\n",
927 UserHandle
, UserInformationClass
, Buffer
);
931 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
932 UserInformationClass
,
935 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
937 Status
= I_RpcMapWin32Status(RpcExceptionCode());
947 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
950 return STATUS_NOT_IMPLEMENTED
;