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.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS system libraries
22 * PURPOSE: SAM interface library
23 * FILE: lib/samlib/samlib.c
24 * PROGRAMER: Eric Kohl
27 /* INCLUDES *****************************************************************/
31 WINE_DEFAULT_DEBUG_CHANNEL(samlib
);
35 SystemFunction006(LPCSTR password
,
40 SystemFunction007(PUNICODE_STRING string
,
43 /* GLOBALS *******************************************************************/
46 /* FUNCTIONS *****************************************************************/
48 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
50 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
54 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
56 HeapFree(GetProcessHeap(), 0, ptr
);
61 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
63 handle_t hBinding
= NULL
;
64 LPWSTR pszStringBinding
;
67 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
69 status
= RpcStringBindingComposeW(NULL
,
77 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
81 /* Set the binding handle that will be used to bind to the server. */
82 status
= RpcBindingFromStringBindingW(pszStringBinding
,
86 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
89 status
= RpcStringFreeW(&pszStringBinding
);
92 // TRACE("RpcStringFree returned 0x%x\n", status);
100 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
105 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
107 status
= RpcBindingFree(&hBinding
);
110 TRACE("RpcBindingFree returned 0x%x\n", status
);
116 SampCheckPassword(IN SAMPR_HANDLE UserHandle
,
117 IN PUNICODE_STRING Password
)
119 USER_DOMAIN_PASSWORD_INFORMATION DomainPasswordInformation
;
120 ULONG PasswordLength
;
123 TRACE("(%p %p)\n", UserHandle
, Password
);
125 /* Get the domain password information */
126 Status
= SamrGetUserDomainPasswordInformation(UserHandle
,
127 &DomainPasswordInformation
);
128 if (!NT_SUCCESS(Status
))
130 TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status
);
134 PasswordLength
= (ULONG
)(Password
->Length
/ sizeof(WCHAR
));
136 /* Fail if the password is too short or too long */
137 if ((PasswordLength
< DomainPasswordInformation
.MinPasswordLength
) ||
138 (PasswordLength
> 256))
139 return STATUS_PASSWORD_RESTRICTION
;
141 /* Check the password complexity */
142 if (DomainPasswordInformation
.PasswordProperties
& DOMAIN_PASSWORD_COMPLEX
)
147 return STATUS_SUCCESS
;
153 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
158 TRACE("SamAddMemberToAlias(%p %p)\n",
159 AliasHandle
, MemberId
);
163 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
166 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
168 Status
= I_RpcMapWin32Status(RpcExceptionCode());
178 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
184 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
185 GroupHandle
, MemberId
, Attributes
);
189 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
193 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
195 Status
= I_RpcMapWin32Status(RpcExceptionCode());
205 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
207 IN ULONG MemberCount
)
209 SAMPR_PSID_ARRAY Buffer
;
212 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
213 AliasHandle
, MemberIds
, MemberCount
);
215 if (MemberIds
== NULL
)
216 return STATUS_INVALID_PARAMETER_2
;
218 Buffer
.Count
= MemberCount
;
219 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
223 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
226 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
228 Status
= I_RpcMapWin32Status(RpcExceptionCode());
238 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
239 IN PUNICODE_STRING OldPassword
,
240 IN PUNICODE_STRING NewPassword
)
242 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
243 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
244 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
245 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
246 OEM_STRING LmPwdString
;
247 CHAR LmPwdBuffer
[15];
248 BOOLEAN OldLmPasswordPresent
= FALSE
;
249 BOOLEAN NewLmPasswordPresent
= FALSE
;
252 /* Calculate the NT hash for the old password */
253 Status
= SystemFunction007(OldPassword
,
254 (LPBYTE
)&OldNtPassword
);
255 if (!NT_SUCCESS(Status
))
257 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
261 /* Calculate the NT hash for the new password */
262 Status
= SystemFunction007(NewPassword
,
263 (LPBYTE
)&NewNtPassword
);
264 if (!NT_SUCCESS(Status
))
266 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
270 /* Calculate the LM password and hash for the old password */
271 LmPwdString
.Length
= 15;
272 LmPwdString
.MaximumLength
= 15;
273 LmPwdString
.Buffer
= LmPwdBuffer
;
274 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
276 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
279 if (NT_SUCCESS(Status
))
281 /* Calculate the LM hash value of the password */
282 Status
= SystemFunction006(LmPwdString
.Buffer
,
283 (LPSTR
)&OldLmPassword
);
284 if (NT_SUCCESS(Status
))
286 OldLmPasswordPresent
= TRUE
;
290 /* Calculate the LM password and hash for the new password */
291 LmPwdString
.Length
= 15;
292 LmPwdString
.MaximumLength
= 15;
293 LmPwdString
.Buffer
= LmPwdBuffer
;
294 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
296 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
299 if (NT_SUCCESS(Status
))
301 /* Calculate the LM hash value of the password */
302 Status
= SystemFunction006(LmPwdString
.Buffer
,
303 (LPSTR
)&NewLmPassword
);
304 if (NT_SUCCESS(Status
))
306 NewLmPasswordPresent
= TRUE
;
312 Status
= SamrChangePasswordUser((SAMPR_HANDLE
)UserHandle
,
313 OldLmPasswordPresent
&& NewLmPasswordPresent
,
324 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
326 Status
= I_RpcMapWin32Status(RpcExceptionCode());
336 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
337 IN PUNICODE_STRING UserName
,
338 IN PUNICODE_STRING OldPassword
,
339 IN PUNICODE_STRING NewPassword
)
342 return STATUS_NOT_IMPLEMENTED
;
348 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
349 IN PUNICODE_STRING UserName
,
350 IN PUNICODE_STRING OldPassword
,
351 IN PUNICODE_STRING NewPassword
,
352 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
353 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
356 return STATUS_NOT_IMPLEMENTED
;
362 SamCloseHandle(IN SAM_HANDLE SamHandle
)
366 TRACE("SamCloseHandle(%p)\n", SamHandle
);
370 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
372 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
374 Status
= I_RpcMapWin32Status(RpcExceptionCode());
384 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
385 OUT PSAM_HANDLE ServerHandle
,
386 IN ACCESS_MASK DesiredAccess
,
387 IN POBJECT_ATTRIBUTES ObjectAttributes
)
391 TRACE("SamConnect(%p %p 0x%08x %p)\n",
392 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
396 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
397 (SAMPR_HANDLE
*)ServerHandle
,
400 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
402 Status
= I_RpcMapWin32Status(RpcExceptionCode());
412 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
413 IN PUNICODE_STRING AccountName
,
414 IN ACCESS_MASK DesiredAccess
,
415 OUT PSAM_HANDLE AliasHandle
,
416 OUT PULONG RelativeId
)
420 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
421 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
428 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
429 (PRPC_UNICODE_STRING
)AccountName
,
431 (SAMPR_HANDLE
*)AliasHandle
,
434 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
436 Status
= I_RpcMapWin32Status(RpcExceptionCode());
446 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
447 IN PUNICODE_STRING AccountName
,
448 IN ACCESS_MASK DesiredAccess
,
449 OUT PSAM_HANDLE GroupHandle
,
450 OUT PULONG RelativeId
)
454 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
455 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
462 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
463 (PRPC_UNICODE_STRING
)AccountName
,
465 (SAMPR_HANDLE
*)GroupHandle
,
468 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
470 Status
= I_RpcMapWin32Status(RpcExceptionCode());
480 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
481 IN PUNICODE_STRING AccountName
,
482 IN ULONG AccountType
,
483 IN ACCESS_MASK DesiredAccess
,
484 OUT PSAM_HANDLE UserHandle
,
485 OUT PULONG GrantedAccess
,
486 OUT PULONG RelativeId
)
490 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
491 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
492 UserHandle
, GrantedAccess
, RelativeId
);
499 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
500 (PRPC_UNICODE_STRING
)AccountName
,
503 (SAMPR_HANDLE
*)UserHandle
,
508 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
510 Status
= I_RpcMapWin32Status(RpcExceptionCode());
520 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
521 IN PUNICODE_STRING AccountName
,
522 IN ACCESS_MASK DesiredAccess
,
523 OUT PSAM_HANDLE UserHandle
,
524 OUT PULONG RelativeId
)
528 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
529 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
536 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
537 (PRPC_UNICODE_STRING
)AccountName
,
539 (SAMPR_HANDLE
*)UserHandle
,
542 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
544 Status
= I_RpcMapWin32Status(RpcExceptionCode());
554 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
556 SAMPR_HANDLE LocalAliasHandle
;
559 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
561 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
563 if (LocalAliasHandle
== NULL
)
564 return STATUS_INVALID_HANDLE
;
568 Status
= SamrDeleteAlias(&LocalAliasHandle
);
570 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
572 Status
= I_RpcMapWin32Status(RpcExceptionCode());
582 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
584 SAMPR_HANDLE LocalGroupHandle
;
587 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
589 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
591 if (LocalGroupHandle
== NULL
)
592 return STATUS_INVALID_HANDLE
;
596 Status
= SamrDeleteGroup(&LocalGroupHandle
);
598 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
600 Status
= I_RpcMapWin32Status(RpcExceptionCode());
610 SamDeleteUser(IN SAM_HANDLE UserHandle
)
612 SAMPR_HANDLE LocalUserHandle
;
615 TRACE("SamDeleteUser(%p)\n", UserHandle
);
617 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
619 if (LocalUserHandle
== NULL
)
620 return STATUS_INVALID_HANDLE
;
624 Status
= SamrDeleteUser(&LocalUserHandle
);
626 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
628 Status
= I_RpcMapWin32Status(RpcExceptionCode());
638 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
639 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
641 IN ULONG PreferedMaximumLength
,
642 OUT PULONG CountReturned
)
644 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
647 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
648 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
651 if ((EnumerationContext
== NULL
) ||
653 (CountReturned
== NULL
))
654 return STATUS_INVALID_PARAMETER
;
660 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
663 PreferedMaximumLength
,
666 if (EnumBuffer
!= NULL
)
668 if (EnumBuffer
->Buffer
!= NULL
)
670 *Buffer
= EnumBuffer
->Buffer
;
673 midl_user_free(EnumBuffer
);
676 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
678 Status
= I_RpcMapWin32Status(RpcExceptionCode());
688 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
689 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
691 IN ULONG PreferedMaximumLength
,
692 OUT PULONG CountReturned
)
694 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
697 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
698 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
701 if ((EnumerationContext
== NULL
) ||
703 (CountReturned
== NULL
))
704 return STATUS_INVALID_PARAMETER
;
710 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
713 PreferedMaximumLength
,
716 if (EnumBuffer
!= NULL
)
718 if (EnumBuffer
->Buffer
!= NULL
)
720 *Buffer
= EnumBuffer
->Buffer
;
723 midl_user_free(EnumBuffer
);
726 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
728 Status
= I_RpcMapWin32Status(RpcExceptionCode());
738 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
739 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
741 IN ULONG PreferedMaximumLength
,
742 OUT PULONG CountReturned
)
744 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
747 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
748 DomainHandle
, EnumerationContext
, Buffer
,
749 PreferedMaximumLength
, CountReturned
);
751 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
752 return STATUS_INVALID_PARAMETER
;
758 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
761 PreferedMaximumLength
,
763 if (EnumBuffer
!= NULL
)
765 if (EnumBuffer
->Buffer
!= NULL
)
766 *Buffer
= EnumBuffer
->Buffer
;
768 midl_user_free(EnumBuffer
);
771 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
773 Status
= I_RpcMapWin32Status(RpcExceptionCode());
783 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
784 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
785 IN ULONG UserAccountControl
,
787 IN ULONG PreferedMaximumLength
,
788 OUT PULONG CountReturned
)
790 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
793 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
794 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
795 PreferedMaximumLength
, CountReturned
);
797 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
798 return STATUS_INVALID_PARAMETER
;
804 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
808 PreferedMaximumLength
,
810 if (EnumBuffer
!= NULL
)
812 if (EnumBuffer
->Buffer
!= NULL
)
814 *Buffer
= EnumBuffer
->Buffer
;
817 midl_user_free(EnumBuffer
);
821 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
823 Status
= I_RpcMapWin32Status(RpcExceptionCode());
833 SamFreeMemory(IN PVOID Buffer
)
836 midl_user_free(Buffer
);
838 return STATUS_SUCCESS
;
844 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
845 IN ULONG PassedCount
,
847 OUT PULONG MembershipCount
,
850 SAMPR_PSID_ARRAY SidArray
;
851 SAMPR_ULONG_ARRAY Membership
;
854 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
855 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
858 MembershipCount
== NULL
||
860 return STATUS_INVALID_PARAMETER
;
862 Membership
.Element
= NULL
;
866 SidArray
.Count
= PassedCount
;
867 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
869 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
872 if (NT_SUCCESS(Status
))
874 *MembershipCount
= Membership
.Count
;
875 *Aliases
= Membership
.Element
;
879 if (Membership
.Element
!= NULL
)
880 midl_user_free(Membership
.Element
);
883 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
885 Status
= I_RpcMapWin32Status(RpcExceptionCode());
895 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
898 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
901 return STATUS_INVALID_PARAMETER
;
903 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
905 return STATUS_SUCCESS
;
911 SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle
,
912 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
913 IN PUNICODE_STRING Prefix
,
918 TRACE("(%p %lu %wZ %p)\n",
919 DomainHandle
, DisplayInformation
, Prefix
, Index
);
921 if ((Prefix
== NULL
) ||
923 return STATUS_INVALID_PARAMETER
;
927 Status
= SamrGetDisplayEnumerationIndex2((SAMPR_HANDLE
)DomainHandle
,
929 (PRPC_UNICODE_STRING
)Prefix
,
932 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
934 Status
= I_RpcMapWin32Status(RpcExceptionCode());
944 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
945 OUT PGROUP_MEMBERSHIP
*Groups
,
946 OUT PULONG MembershipCount
)
948 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
951 TRACE("SamGetGroupsForUser(%p %p %p)\n",
952 UserHandle
, Groups
, MembershipCount
);
956 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
958 if (NT_SUCCESS(Status
))
960 *Groups
= GroupsBuffer
->Groups
;
961 *MembershipCount
= GroupsBuffer
->MembershipCount
;
963 MIDL_user_free(GroupsBuffer
);
967 if (GroupsBuffer
!= NULL
)
969 if (GroupsBuffer
->Groups
!= NULL
)
970 MIDL_user_free(GroupsBuffer
->Groups
);
972 MIDL_user_free(GroupsBuffer
);
976 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
978 Status
= I_RpcMapWin32Status(RpcExceptionCode());
988 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
989 OUT PSID
**MemberIds
,
990 OUT PULONG MemberCount
)
992 SAMPR_PSID_ARRAY_OUT SidArray
;
995 TRACE("SamGetMembersInAlias(%p %p %p)\n",
996 AliasHandle
, MemberIds
, MemberCount
);
998 if ((MemberIds
== NULL
) ||
999 (MemberCount
== NULL
))
1000 return STATUS_INVALID_PARAMETER
;
1005 SidArray
.Sids
= NULL
;
1009 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
1011 if (NT_SUCCESS(Status
))
1013 *MemberCount
= SidArray
.Count
;
1014 *MemberIds
= (PSID
*)SidArray
.Sids
;
1018 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1020 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1030 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
1031 OUT PULONG
*MemberIds
,
1032 OUT PULONG
*Attributes
,
1033 OUT PULONG MemberCount
)
1035 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
1038 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
1039 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
1043 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
1045 if (NT_SUCCESS(Status
))
1047 *MemberIds
= MembersBuffer
->Members
;
1048 *Attributes
= MembersBuffer
->Attributes
;
1049 *MemberCount
= MembersBuffer
->MemberCount
;
1051 MIDL_user_free(MembersBuffer
);
1055 if (MembersBuffer
!= NULL
)
1057 if (MembersBuffer
->Members
!= NULL
)
1058 MIDL_user_free(MembersBuffer
->Members
);
1060 if (MembersBuffer
->Attributes
!= NULL
)
1061 MIDL_user_free(MembersBuffer
->Attributes
);
1063 MIDL_user_free(MembersBuffer
);
1067 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1069 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1079 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
1080 IN PUNICODE_STRING Name
,
1085 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1086 ServerHandle
, Name
, DomainId
);
1090 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
1091 (PRPC_UNICODE_STRING
)Name
,
1092 (PRPC_SID
*)DomainId
);
1094 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1096 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1106 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
1108 IN PULONG RelativeIds
,
1109 OUT PUNICODE_STRING
*Names
,
1110 OUT PSID_NAME_USE
*Use OPTIONAL
)
1112 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
1113 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1117 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1118 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
1127 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
1133 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1135 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1139 if (NT_SUCCESS(Status
))
1141 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
1144 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1148 for (i
= 0; i
< Count
; i
++)
1150 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
1151 if ((*Names
)[i
].Buffer
== NULL
)
1153 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1158 for (i
= 0; i
< Count
; i
++)
1160 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1161 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1163 RtlCopyMemory((*Names
)[i
].Buffer
,
1164 NamesBuffer
.Element
[i
].Buffer
,
1165 NamesBuffer
.Element
[i
].Length
);
1170 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1173 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1179 Count
* sizeof(SID_NAME_USE
));
1184 if (!NT_SUCCESS(Status
))
1188 for (i
= 0; i
< Count
; i
++)
1190 if ((*Names
)[i
].Buffer
!= NULL
)
1191 midl_user_free((*Names
)[i
].Buffer
);
1194 midl_user_free(*Names
);
1197 if (Use
!= NULL
&& *Use
!= NULL
)
1198 midl_user_free(*Use
);
1201 if (NamesBuffer
.Element
!= NULL
)
1203 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1205 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1206 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1209 midl_user_free(NamesBuffer
.Element
);
1212 if (UseBuffer
.Element
!= NULL
)
1213 midl_user_free(UseBuffer
.Element
);
1221 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1223 IN PUNICODE_STRING Names
,
1224 OUT PULONG
*RelativeIds
,
1225 OUT PSID_NAME_USE
*Use
)
1227 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1228 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1231 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1232 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1234 *RelativeIds
= NULL
;
1239 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1241 (PRPC_UNICODE_STRING
)Names
,
1245 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1247 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1251 if (NT_SUCCESS(Status
))
1253 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1254 if (*RelativeIds
== NULL
)
1256 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1260 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1263 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1267 RtlCopyMemory(*RelativeIds
,
1269 Count
* sizeof(ULONG
));
1273 Count
* sizeof(SID_NAME_USE
));
1277 if (!NT_SUCCESS(Status
))
1279 if (*RelativeIds
!= NULL
)
1280 midl_user_free(*RelativeIds
);
1283 midl_user_free(*Use
);
1286 if (RidBuffer
.Element
!= NULL
)
1287 midl_user_free(RidBuffer
.Element
);
1289 if (UseBuffer
.Element
!= NULL
)
1290 midl_user_free(UseBuffer
.Element
);
1298 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1299 IN ACCESS_MASK DesiredAccess
,
1301 OUT PSAM_HANDLE AliasHandle
)
1305 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1306 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1310 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1313 (SAMPR_HANDLE
*)AliasHandle
);
1315 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1317 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1327 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1328 IN ACCESS_MASK DesiredAccess
,
1330 OUT PSAM_HANDLE DomainHandle
)
1334 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1335 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1339 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1342 (SAMPR_HANDLE
*)DomainHandle
);
1344 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1346 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1356 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1357 IN ACCESS_MASK DesiredAccess
,
1359 OUT PSAM_HANDLE GroupHandle
)
1363 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1364 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1368 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1371 (SAMPR_HANDLE
*)GroupHandle
);
1373 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1375 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1385 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1386 IN ACCESS_MASK DesiredAccess
,
1388 OUT PSAM_HANDLE UserHandle
)
1392 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1393 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1397 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1400 (SAMPR_HANDLE
*)UserHandle
);
1402 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1404 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1414 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1415 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1420 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1421 AliasHandle
, AliasInformationClass
, Buffer
);
1425 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1426 AliasInformationClass
,
1427 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1429 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1431 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1441 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1442 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1447 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1448 DomainHandle
, DomainInformationClass
, Buffer
);
1452 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1453 DomainInformationClass
,
1454 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1456 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1458 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1468 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1469 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1474 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1475 GroupHandle
, GroupInformationClass
, Buffer
);
1479 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1480 GroupInformationClass
,
1481 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1483 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1485 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1495 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1496 IN USER_INFORMATION_CLASS UserInformationClass
,
1501 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1502 UserHandle
, UserInformationClass
, Buffer
);
1506 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1507 UserInformationClass
,
1508 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1510 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1512 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1522 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1523 IN SECURITY_INFORMATION SecurityInformation
,
1524 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1526 SAMPR_SR_SECURITY_DESCRIPTOR LocalSecurityDescriptor
;
1527 PSAMPR_SR_SECURITY_DESCRIPTOR pLocalSecurityDescriptor
;
1530 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1531 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1533 LocalSecurityDescriptor
.Length
= 0;
1534 LocalSecurityDescriptor
.SecurityDescriptor
= NULL
;
1538 pLocalSecurityDescriptor
= &LocalSecurityDescriptor
;
1540 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1541 SecurityInformation
,
1542 &pLocalSecurityDescriptor
);
1544 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1546 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1550 *SecurityDescriptor
= LocalSecurityDescriptor
.SecurityDescriptor
;
1558 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1563 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1564 AliasHandle
, MemberId
);
1568 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1571 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1573 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1583 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1588 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1589 DomainHandle
, MemberId
);
1593 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1596 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1598 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1608 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1613 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1614 GroupHandle
, MemberId
);
1618 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1621 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1623 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1633 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1635 IN ULONG MemberCount
)
1637 SAMPR_PSID_ARRAY Buffer
;
1640 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1641 AliasHandle
, MemberIds
, MemberCount
);
1643 if (MemberIds
== NULL
)
1644 return STATUS_INVALID_PARAMETER_2
;
1646 Buffer
.Count
= MemberCount
;
1647 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1651 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1654 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1656 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1666 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1671 return STATUS_NOT_IMPLEMENTED
;
1677 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1678 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1683 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1684 AliasHandle
, AliasInformationClass
, Buffer
);
1688 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1689 AliasInformationClass
,
1692 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1694 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1704 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1705 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1710 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1711 DomainHandle
, DomainInformationClass
, Buffer
);
1715 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1716 DomainInformationClass
,
1719 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1721 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1731 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1732 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1737 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1738 GroupHandle
, GroupInformationClass
, Buffer
);
1742 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1743 GroupInformationClass
,
1746 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1748 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1758 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1759 IN USER_INFORMATION_CLASS UserInformationClass
,
1762 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1763 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1764 PUSER_ALL_INFORMATION AllBuffer
;
1765 OEM_STRING LmPwdString
;
1766 CHAR LmPwdBuffer
[15];
1769 TRACE("SamSetInformationUser(%p %lu %p)\n",
1770 UserHandle
, UserInformationClass
, Buffer
);
1772 if (UserInformationClass
== UserSetPasswordInformation
)
1774 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1776 Status
= SampCheckPassword(UserHandle
,
1777 (PUNICODE_STRING
)&PasswordBuffer
->Password
);
1778 if (!NT_SUCCESS(Status
))
1780 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1784 /* Calculate the NT hash value of the passord */
1785 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1786 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1787 if (!NT_SUCCESS(Status
))
1789 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1793 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1794 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1796 /* Build the LM password */
1797 LmPwdString
.Length
= 15;
1798 LmPwdString
.MaximumLength
= 15;
1799 LmPwdString
.Buffer
= LmPwdBuffer
;
1800 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
1802 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
1803 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
1805 if (NT_SUCCESS(Status
))
1807 /* Calculate the LM hash value of the password */
1808 Status
= SystemFunction006(LmPwdString
.Buffer
,
1809 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
1810 if (NT_SUCCESS(Status
))
1811 Internal1Buffer
.LmPasswordPresent
= TRUE
;
1814 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
1818 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1819 UserInternal1Information
,
1820 (PVOID
)&Internal1Buffer
);
1822 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1824 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1828 if (!NT_SUCCESS(Status
))
1830 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
1834 else if (UserInformationClass
== UserAllInformation
)
1836 AllBuffer
= (PUSER_ALL_INFORMATION
)Buffer
;
1838 if (AllBuffer
->WhichFields
& (USER_ALL_LMPASSWORDPRESENT
| USER_ALL_NTPASSWORDPRESENT
))
1840 Status
= SampCheckPassword(UserHandle
,
1841 &AllBuffer
->NtPassword
);
1842 if (!NT_SUCCESS(Status
))
1844 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1852 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
1853 UserInformationClass
,
1856 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1858 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1868 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
1870 IN ULONG Attributes
)
1874 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
1875 GroupHandle
, MemberId
, Attributes
);
1879 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
1883 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1885 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1895 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
1896 IN SECURITY_INFORMATION SecurityInformation
,
1897 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
1899 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
1903 TRACE("SamSetSecurityObject(%p %lu %p)\n",
1904 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1906 /* Retrieve the length of the relative security descriptor */
1908 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1911 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
1912 return STATUS_INVALID_PARAMETER
;
1915 /* Allocate a buffer for the security descriptor */
1916 DescriptorToPass
.Length
= Length
;
1917 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
1918 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
1919 return STATUS_INSUFFICIENT_RESOURCES
;
1921 /* Convert the given security descriptor to a relative security descriptor */
1922 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
1923 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
1925 if (!NT_SUCCESS(Status
))
1930 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1931 SecurityInformation
,
1934 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1936 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1941 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
1942 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
1950 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
1954 TRACE("(%p)\n", ServerHandle
);
1958 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
1960 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1962 Status
= I_RpcMapWin32Status(RpcExceptionCode());