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 SamFreeMemory(IN PVOID Buffer
)
379 midl_user_free(Buffer
);
381 return STATUS_SUCCESS
;
387 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
388 IN ULONG PassedCount
,
390 OUT PULONG MembershipCount
,
393 SAMPR_PSID_ARRAY SidArray
;
394 SAMPR_ULONG_ARRAY Membership
;
397 TRACE("SamAliasMembership(%p %ul %p %p %p)\n",
398 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
401 MembershipCount
== NULL
||
403 return STATUS_INVALID_PARAMETER
;
405 Membership
.Element
= NULL
;
409 SidArray
.Count
= PassedCount
;
410 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
412 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
415 if (NT_SUCCESS(Status
))
417 *MembershipCount
= Membership
.Count
;
418 *Aliases
= Membership
.Element
;
422 if (Membership
.Element
!= NULL
)
423 midl_user_free(Membership
.Element
);
426 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
428 Status
= I_RpcMapWin32Status(RpcExceptionCode());
438 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
439 OUT PSID
**MemberIds
,
440 OUT PULONG MemberCount
)
442 SAMPR_PSID_ARRAY_OUT SidArray
;
445 TRACE("SamGetMembersInAlias(%p %p %p)\n",
446 AliasHandle
, MemberIds
, MemberCount
);
448 if ((MemberIds
== NULL
) ||
449 (MemberCount
== NULL
))
450 return STATUS_INVALID_PARAMETER
;
455 SidArray
.Sids
= NULL
;
459 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
461 if (NT_SUCCESS(Status
))
463 *MemberCount
= SidArray
.Count
;
464 *MemberIds
= (PSID
*)SidArray
.Sids
;
468 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
470 Status
= I_RpcMapWin32Status(RpcExceptionCode());
480 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
481 IN PUNICODE_STRING Name
,
486 TRACE("SamLookupDomainInSamServer(%p,%p,%p)\n",
487 ServerHandle
, Name
, DomainId
);
491 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
492 (PRPC_UNICODE_STRING
)Name
,
493 (PRPC_SID
*)DomainId
);
495 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
497 Status
= I_RpcMapWin32Status(RpcExceptionCode());
507 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
509 IN PUNICODE_STRING Names
,
510 OUT PULONG
*RelativeIds
,
511 OUT PSID_NAME_USE
*Use
)
514 return STATUS_NOT_IMPLEMENTED
;
520 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
521 IN ACCESS_MASK DesiredAccess
,
523 OUT PSAM_HANDLE AliasHandle
)
527 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
528 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
532 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
535 (SAMPR_HANDLE
*)AliasHandle
);
537 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
539 Status
= I_RpcMapWin32Status(RpcExceptionCode());
549 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
550 IN ACCESS_MASK DesiredAccess
,
552 OUT PSAM_HANDLE DomainHandle
)
556 TRACE("SamOpenDomain(%p,0x%08x,%p,%p)\n",
557 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
561 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
564 (SAMPR_HANDLE
*)DomainHandle
);
566 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
568 Status
= I_RpcMapWin32Status(RpcExceptionCode());
578 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
579 IN ACCESS_MASK DesiredAccess
,
581 OUT PSAM_HANDLE GroupHandle
)
585 TRACE("SamOpenGroup(%p,0x%08x,%p,%p)\n",
586 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
590 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
593 (SAMPR_HANDLE
*)GroupHandle
);
595 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
597 Status
= I_RpcMapWin32Status(RpcExceptionCode());
607 SamOpenUser(IN SAM_HANDLE DomainHandle
,
608 IN ACCESS_MASK DesiredAccess
,
610 OUT PSAM_HANDLE UserHandle
)
614 TRACE("SamOpenUser(%p,0x%08x,%lx,%p)\n",
615 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
619 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
622 (SAMPR_HANDLE
*)UserHandle
);
624 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
626 Status
= I_RpcMapWin32Status(RpcExceptionCode());
636 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
637 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
642 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
643 AliasHandle
, AliasInformationClass
, Buffer
);
647 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
648 AliasInformationClass
,
649 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
651 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
653 Status
= I_RpcMapWin32Status(RpcExceptionCode());
663 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
664 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
669 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
670 DomainHandle
, DomainInformationClass
, Buffer
);
674 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
675 DomainInformationClass
,
676 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
680 Status
= I_RpcMapWin32Status(RpcExceptionCode());
690 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
691 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
696 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
697 GroupHandle
, GroupInformationClass
, Buffer
);
701 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
702 GroupInformationClass
,
703 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
705 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
707 Status
= I_RpcMapWin32Status(RpcExceptionCode());
717 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
718 IN USER_INFORMATION_CLASS UserInformationClass
,
723 TRACE("SamQueryInformationUser(%p %lu %p)\n",
724 UserHandle
, UserInformationClass
, Buffer
);
728 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
729 UserInformationClass
,
730 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
732 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
734 Status
= I_RpcMapWin32Status(RpcExceptionCode());
744 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
745 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
750 TRACE("SamSetInformationAlias(%p %lu %p)\n",
751 AliasHandle
, AliasInformationClass
, Buffer
);
755 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
756 AliasInformationClass
,
759 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
761 Status
= I_RpcMapWin32Status(RpcExceptionCode());
771 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
772 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
773 IN PVOID DomainInformation
)
777 TRACE("SamSetInformationDomain(%p %lu %p)\n",
778 DomainHandle
, DomainInformationClass
, DomainInformation
);
782 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
783 DomainInformationClass
,
786 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
788 Status
= I_RpcMapWin32Status(RpcExceptionCode());
798 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
799 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
804 TRACE("SamSetInformationGroup(%p %lu %p)\n",
805 GroupHandle
, GroupInformationClass
, Buffer
);
809 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
810 GroupInformationClass
,
813 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
815 Status
= I_RpcMapWin32Status(RpcExceptionCode());
825 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
826 IN USER_INFORMATION_CLASS UserInformationClass
,
831 TRACE("SamSetInformationUser(%p %lu %p)\n",
832 UserHandle
, UserInformationClass
, Buffer
);
836 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
837 UserInformationClass
,
840 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
842 Status
= I_RpcMapWin32Status(RpcExceptionCode());
852 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
855 return STATUS_NOT_IMPLEMENTED
;