ReactOS 0.4.17-dev-1321-g5c122a9
samlib.c
Go to the documentation of this file.
1/*
2 * ReactOS kernel
3 * Copyright (C) 2004 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19/*
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
25 */
26
27#include "precomp.h"
28
29#define NTOS_MODE_USER
30#include <ndk/rtlfuncs.h>
31#include <ntsam.h>
32#include <sam_c.h>
33
34#include <wine/debug.h>
35
37
41 LPSTR hash);
42
46 LPBYTE hash);
47
51 const BYTE *key,
52 LPBYTE out);
53
54/* GLOBALS *******************************************************************/
55
56
57/* FUNCTIONS *****************************************************************/
58
60{
62}
63
64
66{
68}
69
70
73{
75 LPWSTR pszStringBinding;
77
78 TRACE("PSAMPR_SERVER_NAME_bind(%S)\n", pszSystemName);
79
80 /* Check the server name prefix and server name length */
81 if (pszSystemName != NULL)
82 {
83 int nLength = wcslen(pszSystemName);
84 int nNameLength = nLength;
85
86 if (nLength >= 1 && pszSystemName[0] == L'\\')
87 nNameLength--;
88
89 if (nLength >= 2 && pszSystemName[1] == L'\\')
90 nNameLength--;
91
92 if (((nLength - nNameLength != 0) &&
93 (nLength - nNameLength != 2)) ||
94 (nNameLength == 0))
95 {
96 WARN("Invalid server name %S\n", pszSystemName);
98 }
99 }
100
102 L"ncacn_np",
103 pszSystemName,
104 L"\\pipe\\samr",
105 NULL,
106 &pszStringBinding);
107 if (status)
108 {
109 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
110 return NULL;
111 }
112
113 /* Set the binding handle that will be used to bind to the server. */
114 status = RpcBindingFromStringBindingW(pszStringBinding,
115 &hBinding);
116 if (status)
117 {
118 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
119 }
120
121 status = RpcStringFreeW(&pszStringBinding);
122 if (status)
123 {
124// TRACE("RpcStringFree returned 0x%x\n", status);
125 }
126
127 return hBinding;
128}
129
130
131void __RPC_USER
134{
136
137 TRACE("PSAMPR_SERVER_NAME_unbind(%S)\n", pszSystemName);
138
140 if (status)
141 {
142 TRACE("RpcBindingFree returned 0x%x\n", status);
143 }
144}
145
146
150{
152 LPWORD CharTypeBuffer = NULL;
153 ULONG PasswordLength;
154 ULONG i;
155 ULONG Upper = 0, Lower = 0, Digit = 0, Punct = 0, Alpha = 0;
157
158 TRACE("SampCheckPassword(%p %p)\n", UserHandle, Password);
159
160 /* Get the domain password information */
163 if (!NT_SUCCESS(Status))
164 {
165 TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status);
166 return Status;
167 }
168
169 PasswordLength = (ULONG)(Password->Length / sizeof(WCHAR));
170
171 /* Fail if the password is too short or too long */
172 if ((PasswordLength < DomainPasswordInformation.MinPasswordLength) ||
173 (PasswordLength > 256))
175
176 /* Check the password complexity */
177 if (DomainPasswordInformation.PasswordProperties & DOMAIN_PASSWORD_COMPLEX)
178 {
179 CharTypeBuffer = midl_user_allocate(PasswordLength * sizeof(WORD));
180 if (CharTypeBuffer == NULL)
182
184 Password->Buffer,
185 PasswordLength,
186 CharTypeBuffer);
187
188 for (i = 0; i < PasswordLength; i++)
189 {
190 TRACE("%lu: %C %s %s %s %s\n", i, Password->Buffer[i],
191 (CharTypeBuffer[i] & C1_UPPER) ? "C1_UPPER" : " ",
192 (CharTypeBuffer[i] & C1_LOWER) ? "C1_LOWER" : " ",
193 (CharTypeBuffer[i] & C1_DIGIT) ? "C1_DIGIT" : " ",
194 (CharTypeBuffer[i] & C1_PUNCT) ? "C1_PUNCT" : " ",
195 (CharTypeBuffer[i] & C1_ALPHA) ? "C1_ALPHA" : " ");
196
197 if (CharTypeBuffer[i] & C1_UPPER)
198 Upper = 1;
199
200 if (CharTypeBuffer[i] & C1_LOWER)
201 Lower = 1;
202
203 if (CharTypeBuffer[i] & C1_DIGIT)
204 Digit = 1;
205
206 if (CharTypeBuffer[i] & C1_PUNCT)
207 Punct = 1;
208
209 if ((CharTypeBuffer[i] & C1_ALPHA) &&
210 !(CharTypeBuffer[i] & C1_UPPER) &&
211 !(CharTypeBuffer[i] & C1_LOWER))
212 Alpha = 1;
213 }
214
215 TRACE("Upper: %lu\n", Upper);
216 TRACE("Lower: %lu\n", Lower);
217 TRACE("Digit: %lu\n", Digit);
218 TRACE("Punct: %lu\n", Punct);
219 TRACE("Alpha: %lu\n", Alpha);
220
221 TRACE("Total: %lu\n", Upper + Lower + Digit + Punct + Alpha);
222 if (Upper + Lower + Digit + Punct + Alpha < 3)
224 }
225
226 if (CharTypeBuffer != NULL)
227 midl_user_free(CharTypeBuffer);
228
229 return Status;
230}
231
232
234NTAPI
236 IN PSID MemberId)
237{
239
240 TRACE("SamAddMemberToAlias(%p %p)\n",
241 AliasHandle, MemberId);
242
244 {
246 (PRPC_SID)MemberId);
247 }
249 {
251 }
253
254 return Status;
255}
256
257
259NTAPI
261 IN ULONG MemberId,
263{
265
266 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
267 GroupHandle, MemberId, Attributes);
268
270 {
272 MemberId,
273 Attributes);
274 }
276 {
278 }
280
281 return Status;
282}
283
284
286NTAPI
288 IN PSID *MemberIds,
289 IN ULONG MemberCount)
290{
293
294 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
295 AliasHandle, MemberIds, MemberCount);
296
297 if (MemberIds == NULL)
299
300 Buffer.Count = MemberCount;
301 Buffer.Sids = (PSAMPR_SID_INFORMATION)MemberIds;
302
304 {
306 &Buffer);
307 }
309 {
311 }
313
314 return Status;
315}
316
317
319NTAPI
321 IN PUNICODE_STRING OldPassword,
322 IN PUNICODE_STRING NewPassword)
323{
324 NT_OWF_PASSWORD OldNtPassword;
325 NT_OWF_PASSWORD NewNtPassword;
326 LM_OWF_PASSWORD OldLmPassword;
327 LM_OWF_PASSWORD NewLmPassword;
328 OEM_STRING LmPwdString;
329 CHAR LmPwdBuffer[15];
330 BOOLEAN OldLmPasswordPresent = FALSE;
331 BOOLEAN NewLmPasswordPresent = FALSE;
333
334 ENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm;
335 ENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm;
336 ENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt;
337 ENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt;
338 PENCRYPTED_LM_OWF_PASSWORD pOldLmEncryptedWithNewLm = NULL;
339 PENCRYPTED_LM_OWF_PASSWORD pNewLmEncryptedWithOldLm = NULL;
340
341 /* Calculate the NT hash for the old password */
342 Status = SystemFunction007(OldPassword,
343 (LPBYTE)&OldNtPassword);
344 if (!NT_SUCCESS(Status))
345 {
346 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status);
347 goto done;
348 }
349
350 /* Calculate the NT hash for the new password */
351 Status = SystemFunction007(NewPassword,
352 (LPBYTE)&NewNtPassword);
353 if (!NT_SUCCESS(Status))
354 {
355 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status);
356 goto done;
357 }
358
359 /* Calculate the LM password and hash for the old password */
360 LmPwdString.Length = 15;
361 LmPwdString.MaximumLength = 15;
362 LmPwdString.Buffer = LmPwdBuffer;
363 ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
364
366 OldPassword,
367 FALSE);
368 if (NT_SUCCESS(Status))
369 {
370 /* Calculate the LM hash value of the password */
371 Status = SystemFunction006(LmPwdString.Buffer,
372 (LPSTR)&OldLmPassword);
373 if (NT_SUCCESS(Status))
374 {
375 OldLmPasswordPresent = TRUE;
376 }
377 }
378
379 /* Calculate the LM password and hash for the new password */
380 LmPwdString.Length = 15;
381 LmPwdString.MaximumLength = 15;
382 LmPwdString.Buffer = LmPwdBuffer;
383 ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
384
386 NewPassword,
387 FALSE);
388 if (NT_SUCCESS(Status))
389 {
390 /* Calculate the LM hash value of the password */
391 Status = SystemFunction006(LmPwdString.Buffer,
392 (LPSTR)&NewLmPassword);
393 if (NT_SUCCESS(Status))
394 {
395 NewLmPasswordPresent = TRUE;
396 }
397 }
398
399 if (OldLmPasswordPresent && NewLmPasswordPresent)
400 {
401 /* Encrypt the old LM hash with the new LM hash */
402 Status = SystemFunction012((const BYTE *)&OldLmPassword,
403 (const BYTE *)&NewLmPassword,
404 (LPBYTE)&OldLmEncryptedWithNewLm);
405 if (!NT_SUCCESS(Status))
406 {
407 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status);
408 goto done;
409 }
410
411 /* Encrypt the new LM hash with the old LM hash */
412 Status = SystemFunction012((const BYTE *)&NewLmPassword,
413 (const BYTE *)&OldLmPassword,
414 (LPBYTE)&NewLmEncryptedWithOldLm);
415 if (!NT_SUCCESS(Status))
416 {
417 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status);
418 goto done;
419 }
420
421 pOldLmEncryptedWithNewLm = &OldLmEncryptedWithNewLm;
422 pNewLmEncryptedWithOldLm = &NewLmEncryptedWithOldLm;
423 }
424
425 /* Encrypt the old NT hash with the new NT hash */
426 Status = SystemFunction012((const BYTE *)&OldNtPassword,
427 (const BYTE *)&NewNtPassword,
428 (LPBYTE)&OldNtEncryptedWithNewNt);
429 if (!NT_SUCCESS(Status))
430 {
431 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status);
432 goto done;
433 }
434
435 /* Encrypt the new NT hash with the old NT hash */
436 Status = SystemFunction012((const BYTE *)&NewNtPassword,
437 (const BYTE *)&OldNtPassword,
438 (LPBYTE)&NewNtEncryptedWithOldNt);
439 if (!NT_SUCCESS(Status))
440 {
441 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status);
442 goto done;
443 }
444
446 {
448 OldLmPasswordPresent && NewLmPasswordPresent,
449 pOldLmEncryptedWithNewLm,
450 pNewLmEncryptedWithOldLm,
451 TRUE,
452 &OldNtEncryptedWithNewNt,
453 &NewNtEncryptedWithOldNt,
454 FALSE,
455 NULL,
456 FALSE,
457 NULL);
458 }
460 {
462 }
464
465done:
466 SecureZeroMemory(&OldLmPassword, sizeof(OldLmPassword));
467 SecureZeroMemory(&NewLmPassword, sizeof(NewLmPassword));
468 SecureZeroMemory(&OldNtPassword, sizeof(OldNtPassword));
469 SecureZeroMemory(&NewNtPassword, sizeof(NewNtPassword));
470
471 return Status;
472}
473
474
476NTAPI
478 IN PUNICODE_STRING UserName,
479 IN PUNICODE_STRING OldPassword,
480 IN PUNICODE_STRING NewPassword)
481{
484}
485
486
488NTAPI
490 IN PUNICODE_STRING UserName,
491 IN PUNICODE_STRING OldPassword,
492 IN PUNICODE_STRING NewPassword,
493 OUT PDOMAIN_PASSWORD_INFORMATION *EffectivePasswordPolicy,
494 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION *PasswordChangeFailureInfo)
495{
498}
499
500
502NTAPI
504{
506
507 TRACE("SamCloseHandle(%p)\n", SamHandle);
508
510 {
511 Status = SamrCloseHandle((SAMPR_HANDLE *)&SamHandle);
512 }
514 {
516 }
518
519 return Status;
520}
521
522
524NTAPI
526 OUT PSAM_HANDLE ServerHandle,
529{
530 PSAMPR_SERVER_NAME pServerName = NULL;
532
533 TRACE("SamConnect(%p %p 0x%08x %p)\n",
534 ServerName, ServerHandle, DesiredAccess, ObjectAttributes);
535
536 if (ServerName != NULL && ServerName->Length > 0 && ServerName->Buffer != NULL)
537 {
538 /* Create a zero-terminated server name */
539 pServerName = midl_user_allocate(ServerName->Length + sizeof(WCHAR));
540 if (pServerName == NULL)
542
543 CopyMemory(pServerName, ServerName->Buffer, ServerName->Length);
544 pServerName[ServerName->Length / sizeof(WCHAR)] = UNICODE_NULL;
545 }
546
548 {
549 Status = SamrConnect(pServerName,
550 (SAMPR_HANDLE *)ServerHandle,
552 }
554 {
556 }
558
559 if (pServerName)
560 midl_user_free(pServerName);
561
562 return Status;
563}
564
565
567NTAPI
569 IN PUNICODE_STRING AccountName,
571 OUT PSAM_HANDLE AliasHandle,
572 OUT PULONG RelativeId)
573{
575
576 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
577 DomainHandle, AccountName, DesiredAccess, AliasHandle, RelativeId);
578
579 *AliasHandle = NULL;
580 *RelativeId = 0;
581
583 {
585 (PRPC_UNICODE_STRING)AccountName,
587 (SAMPR_HANDLE *)AliasHandle,
588 RelativeId);
589 }
591 {
593 }
595
596 return Status;
597}
598
599
601NTAPI
603 IN PUNICODE_STRING AccountName,
605 OUT PSAM_HANDLE GroupHandle,
606 OUT PULONG RelativeId)
607{
609
610 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
611 DomainHandle, AccountName, DesiredAccess, GroupHandle, RelativeId);
612
613 *GroupHandle = NULL;
614 *RelativeId = 0;
615
617 {
619 (PRPC_UNICODE_STRING)AccountName,
621 (SAMPR_HANDLE *)GroupHandle,
622 RelativeId);
623 }
625 {
627 }
629
630 return Status;
631}
632
633
635NTAPI
637 IN PUNICODE_STRING AccountName,
638 IN ULONG AccountType,
640 OUT PSAM_HANDLE UserHandle,
642 OUT PULONG RelativeId)
643{
645
646 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
647 DomainHandle, AccountName, AccountType, DesiredAccess,
648 UserHandle, GrantedAccess, RelativeId);
649
650 *UserHandle = NULL;
651 *RelativeId = 0;
652
654 {
656 (PRPC_UNICODE_STRING)AccountName,
657 AccountType,
659 (SAMPR_HANDLE *)UserHandle,
661 RelativeId);
662
663 }
665 {
667 }
669
670 return Status;
671}
672
673
675NTAPI
677 IN PUNICODE_STRING AccountName,
679 OUT PSAM_HANDLE UserHandle,
680 OUT PULONG RelativeId)
681{
683
684 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
685 DomainHandle, AccountName, DesiredAccess, UserHandle, RelativeId);
686
687 *UserHandle = NULL;
688 *RelativeId = 0;
689
691 {
693 (PRPC_UNICODE_STRING)AccountName,
695 (SAMPR_HANDLE *)UserHandle,
696 RelativeId);
697 }
699 {
701 }
703
704 return Status;
705}
706
707
709NTAPI
711{
712 SAMPR_HANDLE LocalAliasHandle;
714
715 TRACE("SamDeleteAlias(%p)\n", AliasHandle);
716
717 LocalAliasHandle = (SAMPR_HANDLE)AliasHandle;
718
719 if (LocalAliasHandle == NULL)
721
723 {
724 Status = SamrDeleteAlias(&LocalAliasHandle);
725 }
727 {
729 }
731
732 return Status;
733}
734
735
737NTAPI
739{
740 SAMPR_HANDLE LocalGroupHandle;
742
743 TRACE("SamDeleteGroup(%p)\n", GroupHandle);
744
745 LocalGroupHandle = (SAMPR_HANDLE)GroupHandle;
746
747 if (LocalGroupHandle == NULL)
749
751 {
752 Status = SamrDeleteGroup(&LocalGroupHandle);
753 }
755 {
757 }
759
760 return Status;
761}
762
763
765NTAPI
767{
768 SAMPR_HANDLE LocalUserHandle;
770
771 TRACE("SamDeleteUser(%p)\n", UserHandle);
772
773 LocalUserHandle = (SAMPR_HANDLE)UserHandle;
774
775 if (LocalUserHandle == NULL)
777
779 {
780 Status = SamrDeleteUser(&LocalUserHandle);
781 }
783 {
785 }
787
788 return Status;
789}
790
791
793NTAPI
795 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
797 IN ULONG PreferedMaximumLength,
798 OUT PULONG CountReturned)
799{
800 PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL;
802
803 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
804 DomainHandle, EnumerationContext, Buffer, PreferedMaximumLength,
805 CountReturned);
806
807 if ((EnumerationContext == NULL) ||
808 (Buffer == NULL) ||
809 (CountReturned == NULL))
811
812 *Buffer = NULL;
813
815 {
817 EnumerationContext,
818 &EnumBuffer,
819 PreferedMaximumLength,
820 CountReturned);
821
822 if (EnumBuffer != NULL)
823 {
824 if (EnumBuffer->Buffer != NULL)
825 {
826 *Buffer = EnumBuffer->Buffer;
827 }
828
829 midl_user_free(EnumBuffer);
830 }
831 }
833 {
835 }
837
838 return Status;
839}
840
841
843NTAPI
845 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
847 IN ULONG PreferedMaximumLength,
848 OUT PULONG CountReturned)
849{
850 PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL;
852
853 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
854 ServerHandle, EnumerationContext, Buffer, PreferedMaximumLength,
855 CountReturned);
856
857 if ((EnumerationContext == NULL) ||
858 (Buffer == NULL) ||
859 (CountReturned == NULL))
861
862 *Buffer = NULL;
863
865 {
867 EnumerationContext,
868 &EnumBuffer,
869 PreferedMaximumLength,
870 CountReturned);
871
872 if (EnumBuffer != NULL)
873 {
874 if (EnumBuffer->Buffer != NULL)
875 {
876 *Buffer = EnumBuffer->Buffer;
877 }
878
879 midl_user_free(EnumBuffer);
880 }
881 }
883 {
885 }
887
888 return Status;
889}
890
891
893NTAPI
895 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
896 IN PVOID *Buffer,
897 IN ULONG PreferedMaximumLength,
898 OUT PULONG CountReturned)
899{
900 PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL;
902
903 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
904 DomainHandle, EnumerationContext, Buffer,
905 PreferedMaximumLength, CountReturned);
906
907 if (EnumerationContext == NULL || Buffer == NULL || CountReturned == NULL)
909
910 *Buffer = NULL;
911
913 {
915 EnumerationContext,
916 &EnumBuffer,
917 PreferedMaximumLength,
918 CountReturned);
919 if (EnumBuffer != NULL)
920 {
921 if (EnumBuffer->Buffer != NULL)
922 *Buffer = EnumBuffer->Buffer;
923
924 midl_user_free(EnumBuffer);
925 }
926 }
928 {
930 }
932
933 return Status;
934}
935
936
938NTAPI
940 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
941 IN ULONG UserAccountControl,
943 IN ULONG PreferedMaximumLength,
944 OUT PULONG CountReturned)
945{
946 PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL;
948
949 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
950 DomainHandle, EnumerationContext, UserAccountControl, Buffer,
951 PreferedMaximumLength, CountReturned);
952
953 if (EnumerationContext == NULL || Buffer == NULL || CountReturned == NULL)
955
956 *Buffer = NULL;
957
959 {
961 EnumerationContext,
962 UserAccountControl,
963 &EnumBuffer,
964 PreferedMaximumLength,
965 CountReturned);
966 if (EnumBuffer != NULL)
967 {
968 if (EnumBuffer->Buffer != NULL)
969 {
970 *Buffer = EnumBuffer->Buffer;
971 }
972
973 midl_user_free(EnumBuffer);
974 }
975
976 }
978 {
980 }
982
983 return Status;
984}
985
986
988NTAPI
990{
991 if (Buffer != NULL)
993
994 return STATUS_SUCCESS;
995}
996
997
999NTAPI
1001 IN ULONG PassedCount,
1002 IN PSID *Sids,
1003 OUT PULONG MembershipCount,
1004 OUT PULONG *Aliases)
1005{
1006 SAMPR_PSID_ARRAY SidArray;
1007 SAMPR_ULONG_ARRAY Membership;
1009
1010 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
1011 DomainHandle, PassedCount, Sids, MembershipCount, Aliases);
1012
1013 if (Sids == NULL ||
1014 MembershipCount == NULL ||
1015 Aliases == NULL)
1017
1018 Membership.Element = NULL;
1019
1021 {
1022 SidArray.Count = PassedCount;
1023 SidArray.Sids = (PSAMPR_SID_INFORMATION)Sids;
1024
1026 &SidArray,
1027 &Membership);
1028 if (NT_SUCCESS(Status))
1029 {
1030 *MembershipCount = Membership.Count;
1031 *Aliases = Membership.Element;
1032 }
1033 else
1034 {
1035 if (Membership.Element != NULL)
1036 midl_user_free(Membership.Element);
1037 }
1038 }
1040 {
1042 }
1044
1045 return Status;
1046}
1047
1048
1050NTAPI
1052 OUT PULONG Mode)
1053{
1054 TRACE("SamGetCompatibilityMode(%p %p)\n", ObjectHandle, Mode);
1055
1056 if (Mode == NULL)
1058
1060
1061 return STATUS_SUCCESS;
1062}
1063
1064
1066NTAPI
1068 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
1071{
1073
1074 TRACE("SamGetDisplayEnumerationIndex(%p %lu %wZ %p)\n",
1075 DomainHandle, DisplayInformation, Prefix, Index);
1076
1077 if ((Prefix == NULL) ||
1078 (Index == NULL))
1080
1082 {
1084 DisplayInformation,
1086 Index);
1087 }
1089 {
1091 }
1093
1094 return Status;
1095}
1096
1097
1099NTAPI
1101 OUT PGROUP_MEMBERSHIP *Groups,
1102 OUT PULONG MembershipCount)
1103{
1104 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer = NULL;
1106
1107 TRACE("SamGetGroupsForUser(%p %p %p)\n",
1108 UserHandle, Groups, MembershipCount);
1109
1111 {
1113 &GroupsBuffer);
1114 if (NT_SUCCESS(Status))
1115 {
1116 *Groups = GroupsBuffer->Groups;
1117 *MembershipCount = GroupsBuffer->MembershipCount;
1118
1119 MIDL_user_free(GroupsBuffer);
1120 }
1121 else
1122 {
1123 if (GroupsBuffer != NULL)
1124 {
1125 if (GroupsBuffer->Groups != NULL)
1126 MIDL_user_free(GroupsBuffer->Groups);
1127
1128 MIDL_user_free(GroupsBuffer);
1129 }
1130 }
1131 }
1133 {
1135 }
1137
1138 return Status;
1139}
1140
1141
1143NTAPI
1145 OUT PSID **MemberIds,
1146 OUT PULONG MemberCount)
1147{
1148 SAMPR_PSID_ARRAY_OUT SidArray;
1150
1151 TRACE("SamGetMembersInAlias(%p %p %p)\n",
1152 AliasHandle, MemberIds, MemberCount);
1153
1154 if ((MemberIds == NULL) ||
1155 (MemberCount == NULL))
1157
1158 *MemberIds = NULL;
1159 *MemberCount = 0;
1160
1161 SidArray.Sids = NULL;
1162
1164 {
1166 &SidArray);
1167 if (NT_SUCCESS(Status))
1168 {
1169 *MemberCount = SidArray.Count;
1170 *MemberIds = (PSID *)SidArray.Sids;
1171 }
1172
1173 }
1175 {
1177 }
1179
1180 return Status;
1181}
1182
1183
1185NTAPI
1187 OUT PULONG *MemberIds,
1189 OUT PULONG MemberCount)
1190{
1191 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer = NULL;
1193
1194 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
1195 GroupHandle, MemberIds, Attributes, MemberCount);
1196
1198 {
1200 &MembersBuffer);
1201 if (NT_SUCCESS(Status))
1202 {
1203 *MemberIds = MembersBuffer->Members;
1204 *Attributes = MembersBuffer->Attributes;
1205 *MemberCount = MembersBuffer->MemberCount;
1206
1207 MIDL_user_free(MembersBuffer);
1208 }
1209 else
1210 {
1211 if (MembersBuffer != NULL)
1212 {
1213 if (MembersBuffer->Members != NULL)
1214 MIDL_user_free(MembersBuffer->Members);
1215
1216 if (MembersBuffer->Attributes != NULL)
1217 MIDL_user_free(MembersBuffer->Attributes);
1218
1219 MIDL_user_free(MembersBuffer);
1220 }
1221 }
1222 }
1224 {
1226 }
1228
1229 return Status;
1230}
1231
1232
1234NTAPI
1237 OUT PSID *DomainId)
1238{
1240
1241 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1242 ServerHandle, Name, DomainId);
1243
1245 {
1248 (PRPC_SID *)DomainId);
1249 }
1251 {
1253 }
1255
1256 return Status;
1257}
1258
1259
1261NTAPI
1263 IN ULONG Count,
1264 IN PULONG RelativeIds,
1267{
1268 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer = {0, NULL};
1269 SAMPR_ULONG_ARRAY UseBuffer = {0, NULL};
1270 ULONG i;
1272
1273 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1274 DomainHandle, Count, RelativeIds, Names, Use);
1275
1276 *Names = NULL;
1277
1278 if (Use != NULL)
1279 *Use = NULL;
1280
1282 {
1284 Count,
1285 RelativeIds,
1286 &NamesBuffer,
1287 &UseBuffer);
1288 }
1290 {
1292 }
1294
1295 if (NT_SUCCESS(Status))
1296 {
1298 if (*Names == NULL)
1299 {
1301 goto done;
1302 }
1303
1304 for (i = 0; i < Count; i++)
1305 {
1306 (*Names)[i].Buffer = midl_user_allocate(NamesBuffer.Element[i].MaximumLength);
1307 if ((*Names)[i].Buffer == NULL)
1308 {
1310 goto done;
1311 }
1312 }
1313
1314 for (i = 0; i < Count; i++)
1315 {
1316 (*Names)[i].Length = NamesBuffer.Element[i].Length;
1317 (*Names)[i].MaximumLength = NamesBuffer.Element[i].MaximumLength;
1318
1320 NamesBuffer.Element[i].Buffer,
1321 NamesBuffer.Element[i].Length);
1322 }
1323
1324 if (Use != NULL)
1325 {
1326 *Use = midl_user_allocate(Count * sizeof(SID_NAME_USE));
1327 if (*Use == NULL)
1328 {
1330 goto done;
1331 }
1332
1333 RtlCopyMemory(*Use,
1334 UseBuffer.Element,
1335 Count * sizeof(SID_NAME_USE));
1336 }
1337 }
1338
1339done:
1340 if (!NT_SUCCESS(Status))
1341 {
1342 if (*Names != NULL)
1343 {
1344 for (i = 0; i < Count; i++)
1345 {
1346 if ((*Names)[i].Buffer != NULL)
1348 }
1349
1351 }
1352
1353 if (Use != NULL && *Use != NULL)
1354 midl_user_free(*Use);
1355 }
1356
1357 if (NamesBuffer.Element != NULL)
1358 {
1359 for (i = 0; i < NamesBuffer.Count; i++)
1360 {
1361 if (NamesBuffer.Element[i].Buffer != NULL)
1362 midl_user_free(NamesBuffer.Element[i].Buffer);
1363 }
1364
1365 midl_user_free(NamesBuffer.Element);
1366 }
1367
1368 if (UseBuffer.Element != NULL)
1369 midl_user_free(UseBuffer.Element);
1370
1371 return 0;
1372}
1373
1374
1376NTAPI
1378 IN ULONG Count,
1380 OUT PULONG *RelativeIds,
1381 OUT PSID_NAME_USE *Use)
1382{
1383 SAMPR_ULONG_ARRAY RidBuffer = {0, NULL};
1384 SAMPR_ULONG_ARRAY UseBuffer = {0, NULL};
1386
1387 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1388 DomainHandle, Count, Names, RelativeIds, Use);
1389
1390 *RelativeIds = NULL;
1391 *Use = NULL;
1392
1394 {
1396 Count,
1398 &RidBuffer,
1399 &UseBuffer);
1400 }
1402 {
1404 }
1406
1407 if (NT_SUCCESS(Status))
1408 {
1409 *RelativeIds = midl_user_allocate(Count * sizeof(ULONG));
1410 if (*RelativeIds == NULL)
1411 {
1413 goto done;
1414 }
1415
1416 *Use = midl_user_allocate(Count * sizeof(SID_NAME_USE));
1417 if (*Use == NULL)
1418 {
1420 goto done;
1421 }
1422
1423 RtlCopyMemory(*RelativeIds,
1424 RidBuffer.Element,
1425 Count * sizeof(ULONG));
1426
1427 RtlCopyMemory(*Use,
1428 UseBuffer.Element,
1429 Count * sizeof(SID_NAME_USE));
1430 }
1431
1432done:
1433 if (!NT_SUCCESS(Status))
1434 {
1435 if (*RelativeIds != NULL)
1436 midl_user_free(*RelativeIds);
1437
1438 if (*Use != NULL)
1439 midl_user_free(*Use);
1440 }
1441
1442 if (RidBuffer.Element != NULL)
1443 midl_user_free(RidBuffer.Element);
1444
1445 if (UseBuffer.Element != NULL)
1446 midl_user_free(UseBuffer.Element);
1447
1448 return Status;
1449}
1450
1451
1453NTAPI
1456 IN ULONG AliasId,
1457 OUT PSAM_HANDLE AliasHandle)
1458{
1460
1461 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1462 DomainHandle, DesiredAccess, AliasId, AliasHandle);
1463
1465 {
1466 Status = SamrOpenAlias((SAMPR_HANDLE)DomainHandle,
1468 AliasId,
1469 (SAMPR_HANDLE *)AliasHandle);
1470 }
1472 {
1474 }
1476
1477 return Status;
1478}
1479
1480
1482NTAPI
1485 IN PSID DomainId,
1486 OUT PSAM_HANDLE DomainHandle)
1487{
1489
1490 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1491 ServerHandle, DesiredAccess, DomainId, DomainHandle);
1492
1494 {
1495 Status = SamrOpenDomain((SAMPR_HANDLE)ServerHandle,
1497 (PRPC_SID)DomainId,
1498 (SAMPR_HANDLE *)DomainHandle);
1499 }
1501 {
1503 }
1505
1506 return Status;
1507}
1508
1509
1511NTAPI
1514 IN ULONG GroupId,
1515 OUT PSAM_HANDLE GroupHandle)
1516{
1518
1519 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1520 DomainHandle, DesiredAccess, GroupId, GroupHandle);
1521
1523 {
1524 Status = SamrOpenGroup((SAMPR_HANDLE)DomainHandle,
1526 GroupId,
1527 (SAMPR_HANDLE *)GroupHandle);
1528 }
1530 {
1532 }
1534
1535 return Status;
1536}
1537
1538
1540NTAPI
1543 IN ULONG UserId,
1544 OUT PSAM_HANDLE UserHandle)
1545{
1547
1548 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1549 DomainHandle, DesiredAccess, UserId, UserHandle);
1550
1552 {
1553 Status = SamrOpenUser((SAMPR_HANDLE)DomainHandle,
1555 UserId,
1556 (SAMPR_HANDLE *)UserHandle);
1557 }
1559 {
1561 }
1563
1564 return Status;
1565}
1566
1567
1569NTAPI
1571 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
1572 IN ULONG Index,
1573 IN ULONG EntryCount,
1574 IN ULONG PreferredMaximumLength,
1575 OUT PULONG TotalAvailable,
1576 OUT PULONG TotalReturned,
1577 OUT PULONG ReturnedEntryCount,
1578 OUT PVOID *SortedBuffer)
1579{
1580 SAMPR_DISPLAY_INFO_BUFFER LocalBuffer;
1582
1583 TRACE("SamQueryDisplayInformation(%p %lu %lu %lu %lu %p %p %p %p)\n",
1584 DomainHandle, DisplayInformation, Index, EntryCount,
1585 PreferredMaximumLength, TotalAvailable, TotalReturned,
1586 ReturnedEntryCount, SortedBuffer);
1587
1588 if ((TotalAvailable == NULL) ||
1589 (TotalReturned == NULL) ||
1590 (ReturnedEntryCount == NULL) ||
1591 (SortedBuffer == NULL))
1593
1595 {
1597 DisplayInformation,
1598 Index,
1599 EntryCount,
1600 PreferredMaximumLength,
1601 TotalAvailable,
1602 TotalReturned,
1603 &LocalBuffer);
1604 if (NT_SUCCESS(Status))
1605 {
1606 switch (DisplayInformation)
1607 {
1608 case DomainDisplayUser:
1609 *ReturnedEntryCount = LocalBuffer.UserInformation.EntriesRead;
1610 *SortedBuffer = LocalBuffer.UserInformation.Buffer;
1611 break;
1612
1614 *ReturnedEntryCount = LocalBuffer.MachineInformation.EntriesRead;
1615 *SortedBuffer = LocalBuffer.MachineInformation.Buffer;
1616 break;
1617
1618 case DomainDisplayGroup:
1619 *ReturnedEntryCount = LocalBuffer.GroupInformation.EntriesRead;
1620 *SortedBuffer = LocalBuffer.GroupInformation.Buffer;
1621 break;
1622
1624 *ReturnedEntryCount = LocalBuffer.OemUserInformation.EntriesRead;
1625 *SortedBuffer = LocalBuffer.OemUserInformation.Buffer;
1626 break;
1627
1629 *ReturnedEntryCount = LocalBuffer.OemGroupInformation.EntriesRead;
1630 *SortedBuffer = LocalBuffer.OemGroupInformation.Buffer;
1631 break;
1632
1634 /* FIXME */
1635 break;
1636 }
1637 }
1638 else
1639 {
1640 *ReturnedEntryCount = 0;
1641 *SortedBuffer = NULL;
1642 }
1643 }
1645 {
1647 }
1649
1650 return Status;
1651}
1652
1653
1655NTAPI
1657 IN ALIAS_INFORMATION_CLASS AliasInformationClass,
1658 OUT PVOID *Buffer)
1659{
1661
1662 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1663 AliasHandle, AliasInformationClass, Buffer);
1664
1666 {
1668 AliasInformationClass,
1670 }
1672 {
1674 }
1676
1677 return Status;
1678}
1679
1680
1682NTAPI
1684 IN DOMAIN_INFORMATION_CLASS DomainInformationClass,
1685 OUT PVOID *Buffer)
1686{
1688
1689 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1690 DomainHandle, DomainInformationClass, Buffer);
1691
1693 {
1695 DomainInformationClass,
1697 }
1699 {
1701 }
1703
1704 return Status;
1705}
1706
1707
1709NTAPI
1711 IN GROUP_INFORMATION_CLASS GroupInformationClass,
1712 OUT PVOID *Buffer)
1713{
1715
1716 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1717 GroupHandle, GroupInformationClass, Buffer);
1718
1720 {
1722 GroupInformationClass,
1724 }
1726 {
1728 }
1730
1731 return Status;
1732}
1733
1734
1736NTAPI
1738 IN USER_INFORMATION_CLASS UserInformationClass,
1739 OUT PVOID *Buffer)
1740{
1742
1743 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1744 UserHandle, UserInformationClass, Buffer);
1745
1747 {
1749 UserInformationClass,
1751 }
1753 {
1755 }
1757
1758 return Status;
1759}
1760
1761
1763NTAPI
1767{
1768 PSAMPR_SR_SECURITY_DESCRIPTOR SamSecurityDescriptor = NULL;
1770
1771 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1773
1775
1777 {
1780 &SamSecurityDescriptor);
1781 }
1783 {
1785 }
1787
1788 TRACE("SamSecurityDescriptor: %p\n", SamSecurityDescriptor);
1789
1790 if (SamSecurityDescriptor != NULL)
1791 {
1792 TRACE("SamSecurityDescriptor->Length: %lu\n", SamSecurityDescriptor->Length);
1793 TRACE("SamSecurityDescriptor->SecurityDescriptor: %p\n", SamSecurityDescriptor->SecurityDescriptor);
1794
1795 *SecurityDescriptor = SamSecurityDescriptor->SecurityDescriptor;
1796
1797 midl_user_free(SamSecurityDescriptor);
1798 }
1799
1800 return Status;
1801}
1802
1803
1805NTAPI
1807 IN PSID MemberId)
1808{
1810
1811 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1812 AliasHandle, MemberId);
1813
1815 {
1817 MemberId);
1818 }
1820 {
1822 }
1824
1825 return Status;
1826}
1827
1828
1830NTAPI
1832 IN PSID MemberId)
1833{
1835
1836 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1837 DomainHandle, MemberId);
1838
1840 {
1842 MemberId);
1843 }
1845 {
1847 }
1849
1850 return Status;
1851}
1852
1853
1855NTAPI
1857 IN ULONG MemberId)
1858{
1860
1861 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1862 GroupHandle, MemberId);
1863
1865 {
1867 MemberId);
1868 }
1870 {
1872 }
1874
1875 return Status;
1876}
1877
1878
1880NTAPI
1882 IN PSID *MemberIds,
1883 IN ULONG MemberCount)
1884{
1887
1888 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1889 AliasHandle, MemberIds, MemberCount);
1890
1891 if (MemberIds == NULL)
1893
1894 Buffer.Count = MemberCount;
1895 Buffer.Sids = (PSAMPR_SID_INFORMATION)MemberIds;
1896
1898 {
1900 &Buffer);
1901 }
1903 {
1905 }
1907
1908 return Status;
1909}
1910
1911
1913NTAPI
1915 IN ULONG Rid,
1916 OUT PSID *Sid)
1917{
1920}
1921
1922
1924NTAPI
1926 IN ALIAS_INFORMATION_CLASS AliasInformationClass,
1927 IN PVOID Buffer)
1928{
1930
1931 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1932 AliasHandle, AliasInformationClass, Buffer);
1933
1935 {
1937 AliasInformationClass,
1938 Buffer);
1939 }
1941 {
1943 }
1945
1946 return Status;
1947}
1948
1949
1951NTAPI
1953 IN DOMAIN_INFORMATION_CLASS DomainInformationClass,
1954 IN PVOID Buffer)
1955{
1957
1958 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1959 DomainHandle, DomainInformationClass, Buffer);
1960
1962 {
1964 DomainInformationClass,
1965 Buffer);
1966 }
1968 {
1970 }
1972
1973 return Status;
1974}
1975
1976
1978NTAPI
1980 IN GROUP_INFORMATION_CLASS GroupInformationClass,
1981 IN PVOID Buffer)
1982{
1984
1985 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1986 GroupHandle, GroupInformationClass, Buffer);
1987
1989 {
1991 GroupInformationClass,
1992 Buffer);
1993 }
1995 {
1997 }
1999
2000 return Status;
2001}
2002
2003
2005NTAPI
2007 IN USER_INFORMATION_CLASS UserInformationClass,
2008 IN PVOID Buffer)
2009{
2011 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer;
2012 USER_ALL_INFORMATION InternalAllBuffer;
2013 OEM_STRING LmPwdString;
2014 CHAR LmPwdBuffer[15];
2016
2017 TRACE("SamSetInformationUser(%p %lu %p)\n",
2018 UserHandle, UserInformationClass, Buffer);
2019
2020 if (UserInformationClass == UserSetPasswordInformation)
2021 {
2023
2024 Status = SampCheckPassword(UserHandle,
2025 (PUNICODE_STRING)&PasswordBuffer->Password);
2026 if (!NT_SUCCESS(Status))
2027 {
2028 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status);
2029 return Status;
2030 }
2031
2032 /* Calculate the NT hash value of the password */
2034 (LPBYTE)&Internal1Buffer.EncryptedNtOwfPassword);
2035 if (!NT_SUCCESS(Status))
2036 {
2037 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status);
2038 return Status;
2039 }
2040
2041 Internal1Buffer.NtPasswordPresent = TRUE;
2042 Internal1Buffer.LmPasswordPresent = FALSE;
2043
2044 /* Build the LM password */
2045 LmPwdString.Length = 15;
2046 LmPwdString.MaximumLength = 15;
2047 LmPwdString.Buffer = LmPwdBuffer;
2048 ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
2049
2051 (PUNICODE_STRING)&PasswordBuffer->Password,
2052 FALSE);
2053 if (NT_SUCCESS(Status))
2054 {
2055 /* Calculate the LM hash value of the password */
2056 Status = SystemFunction006(LmPwdString.Buffer,
2057 (LPSTR)&Internal1Buffer.EncryptedLmOwfPassword);
2058 if (NT_SUCCESS(Status))
2059 Internal1Buffer.LmPasswordPresent = TRUE;
2060 }
2061
2062 Internal1Buffer.PasswordExpired = PasswordBuffer->PasswordExpired;
2063
2065 {
2068 (PVOID)&Internal1Buffer);
2069 }
2071 {
2073 }
2075
2076 if (!NT_SUCCESS(Status))
2077 {
2078 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status);
2079 }
2080
2081 return Status;
2082 }
2083 else if (UserInformationClass == UserAllInformation)
2084 {
2085 RtlCopyMemory(&InternalAllBuffer,
2086 Buffer,
2087 sizeof(USER_ALL_INFORMATION));
2088
2090 {
2091 if (InternalAllBuffer.WhichFields & USER_ALL_OWFPASSWORD)
2092 {
2093 /* Check NT password hash */
2094 if (InternalAllBuffer.WhichFields & USER_ALL_NTPASSWORDPRESENT)
2095 {
2096 if (InternalAllBuffer.NtPassword.Length != sizeof(ENCRYPTED_NT_OWF_PASSWORD))
2098 }
2099
2100 /* Check LM password hash */
2101 if (InternalAllBuffer.WhichFields & USER_ALL_LMPASSWORDPRESENT)
2102 {
2103 if (InternalAllBuffer.LmPassword.Length != sizeof(ENCRYPTED_LM_OWF_PASSWORD))
2105 }
2106 }
2107 else
2108 {
2109 /*
2110 * Only allow the NT password to be set.
2111 * The LM password will be created here.
2112 */
2113 if (InternalAllBuffer.WhichFields & USER_ALL_LMPASSWORDPRESENT)
2114 {
2115 TRACE("Do not try to set a clear text LM password!\n");
2117 }
2118
2119 if (InternalAllBuffer.WhichFields & USER_ALL_NTPASSWORDPRESENT)
2120 {
2121 Status = SampCheckPassword(UserHandle,
2122 &InternalAllBuffer.NtPassword);
2123 if (!NT_SUCCESS(Status))
2124 {
2125 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status);
2126 return Status;
2127 }
2128
2129 /* Calculate the NT password hash */
2130 Status = SystemFunction007((PUNICODE_STRING)&InternalAllBuffer.NtPassword,
2131 (LPBYTE)&Internal1Buffer.EncryptedNtOwfPassword);
2132 if (!NT_SUCCESS(Status))
2133 {
2134 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status);
2135 return Status;
2136 }
2137
2138 InternalAllBuffer.NtPasswordPresent = TRUE;
2139 InternalAllBuffer.LmPasswordPresent = FALSE;
2140
2141 InternalAllBuffer.NtPassword.Length = sizeof(ENCRYPTED_NT_OWF_PASSWORD);
2142 InternalAllBuffer.NtPassword.MaximumLength = sizeof(ENCRYPTED_NT_OWF_PASSWORD);
2143 InternalAllBuffer.NtPassword.Buffer = (LPWSTR)&Internal1Buffer.EncryptedNtOwfPassword;
2144
2145 /* Build the LM password */
2146 LmPwdString.Length = 15;
2147 LmPwdString.MaximumLength = 15;
2148 LmPwdString.Buffer = LmPwdBuffer;
2149 ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
2150
2152 (PUNICODE_STRING)&InternalAllBuffer.NtPassword,
2153 FALSE);
2154 if (NT_SUCCESS(Status))
2155 {
2156 /* Calculate the LM password hash */
2157 Status = SystemFunction006(LmPwdString.Buffer,
2158 (LPSTR)&Internal1Buffer.EncryptedLmOwfPassword);
2159 if (NT_SUCCESS(Status))
2160 {
2161 InternalAllBuffer.WhichFields |= USER_ALL_LMPASSWORDPRESENT;
2162 InternalAllBuffer.LmPasswordPresent = TRUE;
2163
2164 InternalAllBuffer.LmPassword.Length = sizeof(ENCRYPTED_LM_OWF_PASSWORD);
2165 InternalAllBuffer.LmPassword.MaximumLength = sizeof(ENCRYPTED_LM_OWF_PASSWORD);
2166 InternalAllBuffer.LmPassword.Buffer = (LPWSTR)&Internal1Buffer.EncryptedLmOwfPassword;
2167 }
2168 }
2169 }
2170 }
2171 }
2172
2174 {
2177 (PVOID)&InternalAllBuffer);
2178 }
2180 {
2182 }
2184
2185 if (!NT_SUCCESS(Status))
2186 {
2187 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status);
2188 }
2189
2190 return Status;
2191 }
2192
2194 {
2196 UserInformationClass,
2197 Buffer);
2198 }
2200 {
2202 }
2204
2205 return Status;
2206}
2207
2208
2210NTAPI
2212 IN ULONG MemberId,
2214{
2216
2217 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
2218 GroupHandle, MemberId, Attributes);
2219
2221 {
2223 MemberId,
2224 Attributes);
2225 }
2227 {
2229 }
2231
2232 return Status;
2233}
2234
2235
2237NTAPI
2241{
2242 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass;
2243 ULONG Length;
2245
2246 TRACE("SamSetSecurityObject(%p %lu %p)\n",
2248
2249 /* Retrieve the length of the relative security descriptor */
2250 Length = 0;
2252 NULL,
2253 &Length);
2256
2257
2258 /* Allocate a buffer for the security descriptor */
2259 DescriptorToPass.Length = Length;
2260 DescriptorToPass.SecurityDescriptor = MIDL_user_allocate(Length);
2261 if (DescriptorToPass.SecurityDescriptor == NULL)
2263
2264 /* Convert the given security descriptor to a relative security descriptor */
2266 (PSECURITY_DESCRIPTOR)DescriptorToPass.SecurityDescriptor,
2267 &Length);
2268 if (!NT_SUCCESS(Status))
2269 goto done;
2270
2272 {
2275 &DescriptorToPass);
2276 }
2278 {
2280 }
2282
2283done:
2284 if (DescriptorToPass.SecurityDescriptor != NULL)
2285 MIDL_user_free(DescriptorToPass.SecurityDescriptor);
2286
2287 return Status;
2288}
2289
2290
2292NTAPI
2294{
2296
2297 TRACE("SamShutdownSamServer(%p)\n", ServerHandle);
2298
2300 {
2301 Status = SamrShutdownSamServer((SAMPR_HANDLE)ServerHandle);
2302 }
2304 {
2306 }
2308
2309 return Status;
2310}
2311
2312
2314NTAPI
2316 _In_ SAM_HANDLE DomainHandle)
2317{
2318 TRACE("SamTestPrivateFunctionsDomain(%p)\n",
2319 DomainHandle);
2321}
2322
2323
2325NTAPI
2327 _In_ SAM_HANDLE UserHandle)
2328{
2329 TRACE("SamTestPrivateFunctionsUser(%p)\n",
2330 UserHandle);
2332}
2333
2334/* EOF */
PWSTR Names[]
unsigned char BOOLEAN
Definition: actypes.h:127
NTSTATUS __stdcall SamrOpenDomain(SAMPR_HANDLE ServerHandle, ACCESS_MASK DesiredAccess, PRPC_SID DomainId, SAMPR_HANDLE *DomainHandle)
struct _SAMPR_SID_INFORMATION * PSAMPR_SID_INFORMATION
NTSTATUS __stdcall SamrCloseHandle(SAMPR_HANDLE *SamHandle)
NTSTATUS __stdcall SamrGetAliasMembership(SAMPR_HANDLE DomainHandle, PSAMPR_PSID_ARRAY SidArray, PSAMPR_ULONG_ARRAY Membership)
void * SAMPR_HANDLE
Definition: authpackage.c:113
wchar_t * PSAMPR_SERVER_NAME
Definition: authpackage.c:112
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
#define WARN(fmt,...)
Definition: precomp.h:61
static UCHAR password[]
Definition: bcrypt.c:494
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
handle_t hBinding
Definition: ctx_c.c:54
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
LPWSTR Name
Definition: desk.c:124
void __RPC_USER MIDL_user_free(void __RPC_FAR *ptr)
Definition: dhcpcsvc.c:31
void __RPC_FAR *__RPC_USER MIDL_user_allocate(SIZE_T len)
Definition: dhcpcsvc.c:26
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
BOOL WINAPI GetStringTypeW(DWORD type, LPCWSTR src, INT count, LPWORD chartype)
Definition: locale.c:3098
NTSTATUS NTAPI SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle, IN ULONG Count, IN ULONG *RelativeIds, OUT PSAMPR_RETURNED_USTRING_ARRAY Names, OUT PSAMPR_ULONG_ARRAY Use)
Definition: samrpc.c:3697
NTSTATUS NTAPI SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle, IN ULONG Count, IN RPC_UNICODE_STRING Names[], OUT PSAMPR_ULONG_ARRAY RelativeIds, OUT PSAMPR_ULONG_ARRAY Use)
Definition: samrpc.c:3468
NTSTATUS NTAPI SamrConnect(IN PSAMPR_SERVER_NAME ServerName, OUT SAMPR_HANDLE *ServerHandle, IN ACCESS_MASK DesiredAccess)
Definition: samrpc.c:135
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION SecurityInformation
Definition: fltkernel.h:1340
Status
Definition: gdiplustypes.h:24
GLuint in
Definition: glext.h:9616
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define C1_DIGIT
Definition: unicode.h:33
#define C1_PUNCT
Definition: unicode.h:35
#define C1_ALPHA
Definition: unicode.h:39
#define C1_LOWER
Definition: unicode.h:32
#define C1_UPPER
Definition: unicode.h:31
_In_ ULONG Mode
Definition: hubbusif.h:303
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
enum _SID_NAME_USE SID_NAME_USE
enum _SID_NAME_USE * PSID_NAME_USE
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
static PVOID ptr
Definition: dispmode.c:27
DWORD SECURITY_INFORMATION
Definition: ms-dtyp.idl:311
NTSTATUS NTAPI SamrSetInformationUser(IN SAMPR_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, IN PSAMPR_USER_INFO_BUFFER Buffer)
Definition: samrpc.c:7852
NTSTATUS NTAPI SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle, IN unsigned char LmPresent, IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm, IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm, IN unsigned char NtPresent, IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt, IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt, IN unsigned char NtCrossEncryptionPresent, IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm, IN unsigned char LmCrossEncryptionPresent, IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt)
Definition: samrpc.c:7868
NTSTATUS NTAPI SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle, IN PRPC_UNICODE_STRING Name, OUT PRPC_SID *DomainId)
Definition: samrpc.c:504
NTSTATUS NTAPI SamrOpenUser(IN SAMPR_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG UserId, OUT SAMPR_HANDLE *UserHandle)
struct _ENCRYPTED_LM_OWF_PASSWORD ENCRYPTED_NT_OWF_PASSWORD
struct _ENCRYPTED_LM_OWF_PASSWORD ENCRYPTED_LM_OWF_PASSWORD
NTSTATUS NTAPI SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, OUT PSAMPR_USER_INFO_BUFFER *Buffer)
Definition: samrpc.c:7238
NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
_In_ ULONG _In_ ACCESS_MASK _In_ PSID Sid
Definition: rtlfuncs.h:1165
NTSYSAPI NTSTATUS NTAPI RtlMakeSelfRelativeSD(_In_ PSECURITY_DESCRIPTOR AbsoluteSD, _Out_ PSECURITY_DESCRIPTOR SelfRelativeSD, _Inout_ PULONG BufferLength)
#define _In_
Definition: no_sal2.h:158
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
@ DomainPasswordInformation
Definition: ntsam.h:341
ULONG * PSAM_ENUMERATE_HANDLE
Definition: ntsam.h:263
enum _GROUP_INFORMATION_CLASS GROUP_INFORMATION_CLASS
enum _DOMAIN_DISPLAY_INFORMATION DOMAIN_DISPLAY_INFORMATION
#define USER_ALL_OWFPASSWORD
Definition: ntsam.h:225
#define USER_ALL_LMPASSWORDPRESENT
Definition: ntsam.h:221
#define SAM_SID_COMPATIBILITY_ALL
Definition: ntsam.h:728
@ UserInternal1Information
Definition: ntsam.h:531
@ UserSetPasswordInformation
Definition: ntsam.h:528
@ UserAllInformation
Definition: ntsam.h:534
@ DomainDisplayUser
Definition: ntsam.h:303
@ DomainDisplayMachine
Definition: ntsam.h:304
@ DomainDisplayGroup
Definition: ntsam.h:305
@ DomainDisplayServer
Definition: ntsam.h:308
@ DomainDisplayOemUser
Definition: ntsam.h:306
@ DomainDisplayOemGroup
Definition: ntsam.h:307
#define DOMAIN_PASSWORD_COMPLEX
Definition: ntsam.h:254
#define USER_ALL_NTPASSWORDPRESENT
Definition: ntsam.h:220
enum _DOMAIN_INFORMATION_CLASS DOMAIN_INFORMATION_CLASS
enum _ALIAS_INFORMATION_CLASS ALIAS_INFORMATION_CLASS
enum _USER_INFORMATION_CLASS USER_INFORMATION_CLASS
#define STATUS_PASSWORD_RESTRICTION
Definition: ntstatus.h:438
#define STATUS_INVALID_PARAMETER_2
Definition: ntstatus.h:570
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
RPC_STATUS WINAPI RpcBindingFromStringBindingW(RPC_WSTR StringBinding, RPC_BINDING_HANDLE *Binding)
Definition: rpc_binding.c:862
RPC_STATUS WINAPI RpcStringBindingComposeW(RPC_WSTR ObjUuid, RPC_WSTR Protseq, RPC_WSTR NetworkAddr, RPC_WSTR Endpoint, RPC_WSTR Options, RPC_WSTR *StringBinding)
Definition: rpc_binding.c:493
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
Definition: rpc_binding.c:769
LONG WINAPI I_RpcMapWin32Status(RPC_STATUS status)
Definition: rpcrt4_main.c:771
RPC_STATUS WINAPI RpcStringFreeW(RPC_WSTR *String)
Definition: rpcrt4_main.c:181
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:213
struct _SAMPR_USER_SET_PASSWORD_INFORMATION * PSAMPR_USER_SET_PASSWORD_INFORMATION
NTSTATUS WINAPI SystemFunction012(const BYTE *in, const BYTE *key, LPBYTE out)
Definition: sysfunc.c:353
NTSTATUS NTAPI SamCreateUserInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE UserHandle, OUT PULONG RelativeId)
Definition: samlib.c:676
NTSTATUS NTAPI SamAddMemberToAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId)
Definition: samlib.c:235
NTSTATUS NTAPI SamOpenGroup(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG GroupId, OUT PSAM_HANDLE GroupHandle)
Definition: samlib.c:1512
NTSTATUS NTAPI SamChangePasswordUser2(IN PUNICODE_STRING ServerName, IN PUNICODE_STRING UserName, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword)
Definition: samlib.c:477
NTSTATUS NTAPI SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN PUNICODE_STRING Prefix, OUT PULONG Index)
Definition: samlib.c:1067
NTSTATUS NTAPI SamQueryInformationUser(IN SAM_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, OUT PVOID *Buffer)
Definition: samlib.c:1737
NTSTATUS NTAPI SamQueryInformationGroup(IN SAM_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, OUT PVOID *Buffer)
Definition: samlib.c:1710
NTSTATUS NTAPI SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ULONG AccountType, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE UserHandle, OUT PULONG GrantedAccess, OUT PULONG RelativeId)
Definition: samlib.c:636
NTSTATUS NTAPI SamTestPrivateFunctionsDomain(_In_ SAM_HANDLE DomainHandle)
Definition: samlib.c:2315
NTSTATUS NTAPI SamSetInformationGroup(IN SAM_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, IN PVOID Buffer)
Definition: samlib.c:1979
NTSTATUS NTAPI SamQueryInformationDomain(IN SAM_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, OUT PVOID *Buffer)
Definition: samlib.c:1683
NTSTATUS NTAPI SamSetInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, IN PVOID Buffer)
Definition: samlib.c:1925
NTSTATUS NTAPI SamOpenAlias(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG AliasId, OUT PSAM_HANDLE AliasHandle)
Definition: samlib.c:1454
NTSTATUS NTAPI SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle, IN ULONG Count, IN PULONG RelativeIds, OUT PUNICODE_STRING *Names, OUT PSID_NAME_USE *Use OPTIONAL)
Definition: samlib.c:1262
NTSTATUS NTAPI SamGetMembersInGroup(IN SAM_HANDLE GroupHandle, OUT PULONG *MemberIds, OUT PULONG *Attributes, OUT PULONG MemberCount)
Definition: samlib.c:1186
NTSTATUS NTAPI SamDeleteGroup(IN SAM_HANDLE GroupHandle)
Definition: samlib.c:738
NTSTATUS NTAPI SamAddMemberToGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId, IN ULONG Attributes)
Definition: samlib.c:260
handle_t __RPC_USER PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName)
Definition: samlib.c:72
NTSTATUS NTAPI SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle, IN ULONG Count, IN PUNICODE_STRING Names, OUT PULONG *RelativeIds, OUT PSID_NAME_USE *Use)
Definition: samlib.c:1377
NTSTATUS NTAPI SamOpenUser(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG UserId, OUT PSAM_HANDLE UserHandle)
Definition: samlib.c:1541
void __RPC_USER PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName, handle_t hBinding)
Definition: samlib.c:132
NTSTATUS NTAPI SamGetGroupsForUser(IN SAM_HANDLE UserHandle, OUT PGROUP_MEMBERSHIP *Groups, OUT PULONG MembershipCount)
Definition: samlib.c:1100
NTSTATUS NTAPI SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle, IN PSID *MemberIds, IN ULONG MemberCount)
Definition: samlib.c:1881
NTSTATUS NTAPI SamChangePasswordUser3(IN PUNICODE_STRING ServerName, IN PUNICODE_STRING UserName, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword, OUT PDOMAIN_PASSWORD_INFORMATION *EffectivePasswordPolicy, OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION *PasswordChangeFailureInfo)
Definition: samlib.c:489
NTSTATUS NTAPI SamSetInformationUser(IN SAM_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, IN PVOID Buffer)
Definition: samlib.c:2006
NTSTATUS NTAPI SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, IN ULONG UserAccountControl, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samlib.c:939
NTSTATUS NTAPI SamDeleteAlias(IN SAM_HANDLE AliasHandle)
Definition: samlib.c:710
NTSTATUS NTAPI SamFreeMemory(IN PVOID Buffer)
Definition: samlib.c:989
NTSTATUS NTAPI SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId, IN ULONG Attributes)
Definition: samlib.c:2211
NTSTATUS NTAPI SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE GroupHandle, OUT PULONG RelativeId)
Definition: samlib.c:602
NTSTATUS NTAPI SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL, OUT PSAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: samlib.c:525
NTSTATUS NTAPI SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle, IN PSID MemberId)
Definition: samlib.c:1831
NTSTATUS NTAPI SamCloseHandle(IN SAM_HANDLE SamHandle)
Definition: samlib.c:503
NTSTATUS NTAPI SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE AliasHandle, OUT PULONG RelativeId)
Definition: samlib.c:568
NTSTATUS NTAPI SamOpenDomain(IN SAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN PSID DomainId, OUT PSAM_HANDLE DomainHandle)
Definition: samlib.c:1483
NTSTATUS WINAPI SystemFunction006(LPCSTR password, LPSTR hash)
Definition: crypt_lmhash.c:53
NTSTATUS NTAPI SamQueryInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, OUT PVOID *Buffer)
Definition: samlib.c:1656
NTSTATUS NTAPI SamQueryDisplayInformation(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN ULONG Index, IN ULONG EntryCount, IN ULONG PreferredMaximumLength, OUT PULONG TotalAvailable, OUT PULONG TotalReturned, OUT PULONG ReturnedEntryCount, OUT PVOID *SortedBuffer)
Definition: samlib.c:1570
NTSTATUS WINAPI SystemFunction007(PUNICODE_STRING string, LPBYTE hash)
NTSTATUS NTAPI SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, IN PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samlib.c:894
NTSTATUS NTAPI SamSetSecurityObject(IN SAM_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor)
Definition: samlib.c:2238
NTSTATUS NTAPI SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle, IN PUNICODE_STRING Name, OUT PSID *DomainId)
Definition: samlib.c:1235
NTSTATUS NTAPI SamGetMembersInAlias(IN SAM_HANDLE AliasHandle, OUT PSID **MemberIds, OUT PULONG MemberCount)
Definition: samlib.c:1144
NTSTATUS NTAPI SamTestPrivateFunctionsUser(_In_ SAM_HANDLE UserHandle)
Definition: samlib.c:2326
NTSTATUS NTAPI SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId)
Definition: samlib.c:1856
NTSTATUS NTAPI SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId)
Definition: samlib.c:1806
NTSTATUS SampCheckPassword(IN SAMPR_HANDLE UserHandle, IN PUNICODE_STRING Password)
Definition: samlib.c:148
NTSTATUS NTAPI SamRidToSid(IN SAM_HANDLE ObjectHandle, IN ULONG Rid, OUT PSID *Sid)
Definition: samlib.c:1914
NTSTATUS NTAPI SamChangePasswordUser(IN SAM_HANDLE UserHandle, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword)
Definition: samlib.c:320
NTSTATUS NTAPI SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle, OUT PULONG Mode)
Definition: samlib.c:1051
NTSTATUS NTAPI SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samlib.c:844
NTSTATUS NTAPI SamSetInformationDomain(IN SAM_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, IN PVOID Buffer)
Definition: samlib.c:1952
NTSTATUS NTAPI SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, OUT PSECURITY_DESCRIPTOR *SecurityDescriptor)
Definition: samlib.c:1764
NTSTATUS NTAPI SamDeleteUser(IN SAM_HANDLE UserHandle)
Definition: samlib.c:766
NTSTATUS NTAPI SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle, IN PSID *MemberIds, IN ULONG MemberCount)
Definition: samlib.c:287
NTSTATUS NTAPI SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samlib.c:794
NTSTATUS NTAPI SamGetAliasMembership(IN SAM_HANDLE DomainHandle, IN ULONG PassedCount, IN PSID *Sids, OUT PULONG MembershipCount, OUT PULONG *Aliases)
Definition: samlib.c:1000
NTSTATUS NTAPI SamShutdownSamServer(IN SAM_HANDLE ServerHandle)
Definition: samlib.c:2293
NTSTATUS NTAPI SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle, IN PRPC_UNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT SAMPR_HANDLE *AliasHandle, OUT unsigned long *RelativeId)
Definition: samrpc.c:2913
NTSTATUS NTAPI SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle, IN OUT unsigned long *EnumerationContext, OUT PSAMPR_ENUMERATION_BUFFER *Buffer, IN unsigned long PreferedMaximumLength, OUT unsigned long *CountReturned)
Definition: samrpc.c:2092
NTSTATUS NTAPI SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, OUT PSAMPR_ALIAS_INFO_BUFFER *Buffer)
Definition: samrpc.c:5048
NTSTATUS NTAPI SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle, OUT PSAMPR_PSID_ARRAY_OUT Members)
Definition: samrpc.c:5364
NTSTATUS NTAPI SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle)
Definition: samrpc.c:466
NTSTATUS NTAPI SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle, IN OUT unsigned long *EnumerationContext, OUT PSAMPR_ENUMERATION_BUFFER *Buffer, IN unsigned long PreferedMaximumLength, OUT unsigned long *CountReturned)
Definition: samrpc.c:3089
NTSTATUS NTAPI SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, IN PSAMPR_GROUP_INFO_BUFFER Buffer)
Definition: samrpc.c:4420
NTSTATUS NTAPI SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle, OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation)
Definition: samrpc.c:8318
NTSTATUS NTAPI SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, OUT PSAMPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor)
Definition: samrpc.c:329
NTSTATUS NTAPI SamrOpenAlias(IN SAMPR_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG AliasId, OUT SAMPR_HANDLE *AliasHandle)
Definition: samrpc.c:4825
NTSTATUS NTAPI SamrDeleteUser(IN OUT SAMPR_HANDLE *UserHandle)
Definition: samrpc.c:5486
NTSTATUS NTAPI SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, IN PSAMPR_ALIAS_INFO_BUFFER Buffer)
Definition: samrpc.c:5177
NTSTATUS NTAPI SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle, IN PSAMPR_PSID_ARRAY MembersBuffer)
Definition: samrpc.c:9296
NTSTATUS NTAPI SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle, IN PRPC_SID MemberId)
Definition: samrpc.c:5284
NTSTATUS NTAPI SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle, OUT PSAMPR_GET_MEMBERS_BUFFER *Members)
Definition: samrpc.c:4668
NTSTATUS NTAPI SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle, IN OUT unsigned long *EnumerationContext, IN unsigned long UserAccountControl, OUT PSAMPR_ENUMERATION_BUFFER *Buffer, IN unsigned long PreferedMaximumLength, OUT unsigned long *CountReturned)
Definition: samrpc.c:2704
NTSTATUS NTAPI SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle, IN OUT unsigned long *EnumerationContext, OUT PSAMPR_ENUMERATION_BUFFER *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samrpc.c:621
NTSTATUS NTAPI SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, OUT PSAMPR_GROUP_INFO_BUFFER *Buffer)
Definition: samrpc.c:4256
NTSTATUS NTAPI SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle, IN PRPC_UNICODE_STRING Name, IN ACCESS_MASK DesiredAccess, OUT SAMPR_HANDLE *GroupHandle, OUT unsigned long *RelativeId)
Definition: samrpc.c:1898
NTSTATUS NTAPI SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle, IN PRPC_UNICODE_STRING Name, IN ACCESS_MASK DesiredAccess, OUT SAMPR_HANDLE *UserHandle, OUT unsigned long *RelativeId)
Definition: samrpc.c:2300
NTSTATUS NTAPI SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle, IN unsigned long MemberId)
Definition: samrpc.c:4606
NTSTATUS NTAPI SamrOpenGroup(IN SAMPR_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN unsigned long GroupId, OUT SAMPR_HANDLE *GroupHandle)
Definition: samrpc.c:3982
NTSTATUS NTAPI SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle, IN PRPC_SID MemberId)
Definition: samrpc.c:5324
NTSTATUS NTAPI SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, OUT PSAMPR_DOMAIN_INFO_BUFFER *Buffer)
Definition: samrpc.c:1619
NTSTATUS NTAPI SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle, IN PRPC_SID MemberSid)
Definition: samrpc.c:8406
NTSTATUS NTAPI SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle)
Definition: samrpc.c:4538
NTSTATUS NTAPI SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle, IN unsigned long MemberId, IN unsigned long Attributes)
Definition: samrpc.c:4782
NTSTATUS NTAPI SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass, IN unsigned long Index, IN unsigned long EntryCount, IN unsigned long PreferredMaximumLength, OUT unsigned long *TotalAvailable, OUT unsigned long *TotalReturned, OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer)
Definition: samrpc.c:9244
NTSTATUS NTAPI SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass, IN PRPC_UNICODE_STRING Prefix, OUT unsigned long *Index)
Definition: samrpc.c:8813
NTSTATUS NTAPI SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle, OUT PSAMPR_GET_GROUPS_BUFFER *Groups)
Definition: samrpc.c:8149
NTSTATUS NTAPI SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle, IN PSAMPR_PSID_ARRAY MembersBuffer)
Definition: samrpc.c:9324
NTSTATUS NTAPI SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle, IN unsigned long MemberId, IN unsigned long Attributes)
Definition: samrpc.c:4474
NTSTATUS NTAPI SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle, IN PRPC_UNICODE_STRING Name, IN unsigned long AccountType, IN ACCESS_MASK DesiredAccess, OUT SAMPR_HANDLE *UserHandle, OUT unsigned long *GrantedAccess, OUT unsigned long *RelativeId)
Definition: samrpc.c:8829
NTSTATUS NTAPI SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor)
Definition: samrpc.c:192
NTSTATUS NTAPI SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation)
Definition: samrpc.c:1794
NTSTATUS NTAPI SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle)
Definition: samrpc.c:5226
#define RpcEndExcept
Definition: rpc.h:123
#define midl_user_free
Definition: rpc.h:41
#define __RPC_FAR
Definition: rpc.h:52
#define RpcTryExcept
Definition: rpc.h:121
#define RpcExcept(expr)
Definition: rpc.h:122
long RPC_STATUS
Definition: rpc.h:48
#define __RPC_USER
Definition: rpc.h:61
#define RpcExceptionCode()
Definition: rpc.h:127
#define midl_user_allocate
Definition: rpc.h:40
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
unsigned short Length
Definition: msv1_0.h:22
unsigned short MaximumLength
Definition: msv1_0.h:23
wchar_t * Buffer
Definition: msv1_0.h:24
PSAMPR_DOMAIN_DISPLAY_GROUP Buffer
Definition: sam.idl:348
PSAMPR_DOMAIN_DISPLAY_MACHINE Buffer
Definition: sam.idl:342
PSAMPR_DOMAIN_DISPLAY_OEM_GROUP Buffer
Definition: sam.idl:360
PSAMPR_DOMAIN_DISPLAY_OEM_USER Buffer
Definition: sam.idl:354
PSAMPR_DOMAIN_DISPLAY_USER Buffer
Definition: sam.idl:336
PSAMPR_RID_ENUMERATION Buffer
Definition: sam.idl:96
unsigned long MembershipCount
Definition: sam.idl:115
PGROUP_MEMBERSHIP Groups
Definition: sam.idl:116
unsigned long * Members
Definition: sam.idl:122
unsigned long MemberCount
Definition: sam.idl:121
unsigned long * Attributes
Definition: sam.idl:123
PSAMPR_SID_INFORMATION Sids
Definition: sam.idl:56
unsigned long Count
Definition: sam.idl:55
unsigned long Count
Definition: authpackage.c:122
PSAMPR_SID_INFORMATION Sids
Definition: authpackage.c:123
PRPC_UNICODE_STRING Element
Definition: lookup.c:22
unsigned long Length
Definition: msv1_0.h:45
unsigned char * SecurityDescriptor
Definition: msv1_0.h:46
unsigned long * Element
Definition: lsasrv.h:88
unsigned long Count
Definition: lsasrv.h:87
ENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
Definition: sam.idl:640
ENCRYPTED_LM_OWF_PASSWORD EncryptedLmOwfPassword
Definition: sam.idl:641
RPC_UNICODE_STRING Password
Definition: sam.idl:629
USHORT MaximumLength
Definition: env_spec_w32.h:370
BOOLEAN LmPasswordPresent
Definition: ntsam.h:715
UNICODE_STRING LmPassword
Definition: ntsam.h:702
UNICODE_STRING NtPassword
Definition: ntsam.h:703
BOOLEAN NtPasswordPresent
Definition: ntsam.h:716
Definition: copy.c:22
Definition: ps.c:97
@ Password
Definition: telnetd.h:67
const char * LPCSTR
Definition: typedefs.h:52
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
uint16_t * LPWORD
Definition: typedefs.h:56
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
char * LPSTR
Definition: typedefs.h:51
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
STRING OEM_STRING
Definition: umtypes.h:205
SAMPR_DOMAIN_DISPLAY_OEM_GROUP_BUFFER OemGroupInformation
Definition: sam.idl:369
SAMPR_DOMAIN_DISPLAY_OEM_USER_BUFFER OemUserInformation
Definition: sam.idl:368
SAMPR_DOMAIN_DISPLAY_USER_BUFFER UserInformation
Definition: sam.idl:365
SAMPR_DOMAIN_DISPLAY_MACHINE_BUFFER MachineInformation
Definition: sam.idl:366
SAMPR_DOMAIN_DISPLAY_GROUP_BUFFER GroupInformation
Definition: sam.idl:367
USHORT Count
Definition: userreq.cpp:200
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
#define SecureZeroMemory
Definition: winbase.h:1441
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
#define WINAPI
Definition: msvc.h:6
#define CT_CTYPE1
Definition: winnls.h:265
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1647
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20
unsigned char BYTE
Definition: xxhash.c:193