[SAMLIB]
[reactos.git] / reactos / dll / win32 / samsrv / samrpc.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/samsrv/samrpc.c
5 * PURPOSE: RPC interface functions
6 *
7 * PROGRAMMERS: Eric Kohl
8 */
9
10 /* INCLUDES ****************************************************************/
11
12 #include "samsrv.h"
13
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
15
16 /* GLOBALS ********************************************************************/
17
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
19
20 /* FUNCTIONS ***************************************************************/
21
22 VOID
23 SampStartRpcServer(VOID)
24 {
25 RPC_STATUS Status;
26
27 TRACE("SampStartRpcServer() called\n");
28
29 Status = RpcServerUseProtseqEpW(L"ncacn_np",
30 10,
31 L"\\pipe\\samr",
32 NULL);
33 if (Status != RPC_S_OK)
34 {
35 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
36 return;
37 }
38
39 Status = RpcServerRegisterIf(samr_v1_0_s_ifspec,
40 NULL,
41 NULL);
42 if (Status != RPC_S_OK)
43 {
44 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status);
45 return;
46 }
47
48 Status = RpcServerListen(1, 20, TRUE);
49 if (Status != RPC_S_OK)
50 {
51 WARN("RpcServerListen() failed (Status %lx)\n", Status);
52 return;
53 }
54
55 TRACE("SampStartRpcServer() done\n");
56 }
57
58
59 void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
60 {
61 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
62 }
63
64
65 void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
66 {
67 HeapFree(GetProcessHeap(), 0, ptr);
68 }
69
70 void __RPC_USER SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle)
71 {
72 }
73
74 /* Function 0 */
75 NTSTATUS
76 NTAPI
77 SamrConnect(IN PSAMPR_SERVER_NAME ServerName,
78 OUT SAMPR_HANDLE *ServerHandle,
79 IN ACCESS_MASK DesiredAccess)
80 {
81 PSAM_DB_OBJECT ServerObject;
82 NTSTATUS Status;
83
84 TRACE("SamrConnect(%p %p %lx)\n",
85 ServerName, ServerHandle, DesiredAccess);
86
87 Status = SampOpenDbObject(NULL,
88 NULL,
89 L"SAM",
90 SamDbServerObject,
91 DesiredAccess,
92 &ServerObject);
93 if (NT_SUCCESS(Status))
94 *ServerHandle = (SAMPR_HANDLE)ServerObject;
95
96 TRACE("SamrConnect done (Status 0x%08lx)\n", Status);
97
98 return Status;
99 }
100
101 /* Function 1 */
102 NTSTATUS
103 NTAPI
104 SamrCloseHandle(IN OUT SAMPR_HANDLE *SamHandle)
105 {
106 PSAM_DB_OBJECT DbObject;
107 NTSTATUS Status = STATUS_SUCCESS;
108
109 TRACE("SamrCloseHandle(%p)\n", SamHandle);
110
111 Status = SampValidateDbObject(*SamHandle,
112 SamDbIgnoreObject,
113 0,
114 &DbObject);
115 if (Status == STATUS_SUCCESS)
116 {
117 Status = SampCloseDbObject(DbObject);
118 *SamHandle = NULL;
119 }
120
121 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status);
122
123 return Status;
124 }
125
126 /* Function 2 */
127 NTSTATUS
128 NTAPI
129 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle,
130 IN SECURITY_INFORMATION SecurityInformation,
131 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor)
132 {
133 UNIMPLEMENTED;
134 return STATUS_NOT_IMPLEMENTED;
135 }
136
137 /* Function 3 */
138 NTSTATUS
139 NTAPI
140 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle,
141 IN SECURITY_INFORMATION SecurityInformation,
142 OUT PSAMPR_SR_SECURITY_DESCRIPTOR * SecurityDescriptor)
143 {
144 UNIMPLEMENTED;
145 return STATUS_NOT_IMPLEMENTED;
146 }
147
148 /* Function 4 */
149 NTSTATUS
150 NTAPI
151 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle)
152 {
153 UNIMPLEMENTED;
154 return STATUS_NOT_IMPLEMENTED;
155 }
156
157 /* Function 5 */
158 NTSTATUS
159 NTAPI
160 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle,
161 IN PRPC_UNICODE_STRING Name,
162 OUT PRPC_SID *DomainId)
163 {
164 UNIMPLEMENTED;
165 return STATUS_NOT_IMPLEMENTED;
166 }
167
168 /* Function 6 */
169 NTSTATUS
170 NTAPI
171 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle,
172 IN OUT unsigned long *EnumerationContext,
173 OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
174 IN unsigned long PreferedMaximumLength,
175 OUT unsigned long *CountReturned)
176 {
177 UNIMPLEMENTED;
178 return STATUS_NOT_IMPLEMENTED;
179 }
180
181 /* Function 7 */
182 NTSTATUS
183 NTAPI
184 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle,
185 IN ACCESS_MASK DesiredAccess,
186 IN PRPC_SID DomainId,
187 OUT SAMPR_HANDLE *DomainHandle)
188 {
189 PSAM_DB_OBJECT ServerObject;
190 PSAM_DB_OBJECT DomainObject;
191 NTSTATUS Status;
192
193 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
194 ServerHandle, DesiredAccess, DomainId, DomainHandle);
195
196 /* Validate the server handle */
197 Status = SampValidateDbObject(ServerHandle,
198 SamDbServerObject,
199 SAM_SERVER_LOOKUP_DOMAIN,
200 &ServerObject);
201 if (!NT_SUCCESS(Status))
202 return Status;
203
204 /* Validate the Domain SID */
205 if ((DomainId->Revision != SID_REVISION) ||
206 (DomainId->SubAuthorityCount > SID_MAX_SUB_AUTHORITIES) ||
207 (memcmp(&DomainId->IdentifierAuthority, &NtSidAuthority, sizeof(SID_IDENTIFIER_AUTHORITY)) != 0))
208 return STATUS_INVALID_PARAMETER;
209
210 /* Open the domain object */
211 if ((DomainId->SubAuthorityCount == 1) &&
212 (DomainId->SubAuthority[0] == SECURITY_BUILTIN_DOMAIN_RID))
213 {
214 /* Builtin domain object */
215 TRACE("Opening the builtin domain object.\n");
216
217 Status = SampOpenDbObject(ServerObject,
218 L"Domains",
219 L"Builtin",
220 SamDbDomainObject,
221 DesiredAccess,
222 &DomainObject);
223 }
224 else if ((DomainId->SubAuthorityCount == 4) &&
225 (DomainId->SubAuthority[0] == SECURITY_NT_NON_UNIQUE))
226 {
227 /* Account domain object */
228 TRACE("Opening the account domain object.\n");
229
230 /* FIXME: Check the account domain sub authorities!!! */
231
232 Status = SampOpenDbObject(ServerObject,
233 L"Domains",
234 L"Account",
235 SamDbDomainObject,
236 DesiredAccess,
237 &DomainObject);
238 }
239 else
240 {
241 /* No vaild domain SID */
242 Status = STATUS_INVALID_PARAMETER;
243 }
244
245 if (NT_SUCCESS(Status))
246 *DomainHandle = (SAMPR_HANDLE)DomainObject;
247
248 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status);
249
250 return Status;
251 }
252
253 /* Function 8 */
254 NTSTATUS
255 NTAPI
256 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle,
257 IN DOMAIN_INFORMATION_CLASS DomainInformationClass,
258 OUT PSAMPR_DOMAIN_INFO_BUFFER *Buffer)
259 {
260 UNIMPLEMENTED;
261 return STATUS_NOT_IMPLEMENTED;
262 }
263
264 /* Function 9 */
265 NTSTATUS
266 NTAPI
267 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle,
268 IN DOMAIN_INFORMATION_CLASS DomainInformationClass,
269 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation)
270 {
271 UNIMPLEMENTED;
272 return STATUS_NOT_IMPLEMENTED;
273 }
274
275 /* Function 10 */
276 NTSTATUS
277 NTAPI
278 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle,
279 IN PRPC_UNICODE_STRING Name,
280 IN ACCESS_MASK DesiredAccess,
281 OUT SAMPR_HANDLE *GroupHandle,
282 OUT unsigned long *RelativeId)
283 {
284 UNIMPLEMENTED;
285 return STATUS_NOT_IMPLEMENTED;
286 }
287
288 /* Function 10 */
289 NTSTATUS
290 NTAPI
291 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle,
292 IN OUT unsigned long *EnumerationContext,
293 OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
294 IN unsigned long PreferedMaximumLength,
295 OUT unsigned long *CountReturned)
296 {
297 UNIMPLEMENTED;
298 return STATUS_NOT_IMPLEMENTED;
299 }
300
301 /* Function 12 */
302 NTSTATUS
303 NTAPI
304 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle,
305 IN PRPC_UNICODE_STRING Name,
306 IN ACCESS_MASK DesiredAccess,
307 OUT SAMPR_HANDLE *UserHandle,
308 OUT unsigned long *RelativeId)
309 {
310 PSAM_DB_OBJECT DomainObject;
311 PSAM_DB_OBJECT UserObject;
312 ULONG ulSize;
313 ULONG ulRid;
314 WCHAR szRid[9];
315 BOOL bAliasExists = FALSE;
316 NTSTATUS Status;
317
318 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
319 DomainHandle, Name, DesiredAccess, UserHandle, RelativeId);
320
321 /* Validate the domain handle */
322 Status = SampValidateDbObject(DomainHandle,
323 SamDbDomainObject,
324 DOMAIN_CREATE_USER,
325 &DomainObject);
326 if (!NT_SUCCESS(Status))
327 {
328 TRACE("failed with status 0x%08lx\n", Status);
329 return Status;
330 }
331
332 /* Get the NextRID attribute */
333 ulSize = sizeof(ULONG);
334 Status = SampGetObjectAttribute(DomainObject,
335 L"NextRID",
336 NULL,
337 (LPVOID)&ulRid,
338 &ulSize);
339 if (!NT_SUCCESS(Status))
340 ulRid = DOMAIN_USER_RID_MAX + 1;
341
342 TRACE("RID: %lx\n", ulRid);
343
344 /* Convert the RID into a string (hex) */
345 swprintf(szRid, L"%08lX", ulRid);
346
347 /* Check whether the user name is already in use */
348 Status = SampCheckDbObjectNameAlias(DomainObject,
349 L"Users",
350 Name->Buffer,
351 &bAliasExists);
352 if (!NT_SUCCESS(Status))
353 {
354 TRACE("failed with status 0x%08lx\n", Status);
355 return Status;
356 }
357
358 if (bAliasExists)
359 {
360 TRACE("The user account %S already exists!\n", Name->Buffer);
361 return STATUS_USER_EXISTS;
362 }
363
364 /* Create the user object */
365 Status = SampCreateDbObject(DomainObject,
366 L"Users",
367 szRid,
368 SamDbUserObject,
369 DesiredAccess,
370 &UserObject);
371 if (!NT_SUCCESS(Status))
372 {
373 TRACE("failed with status 0x%08lx\n", Status);
374 return Status;
375 }
376
377 /* Add the name alias for the user object */
378 Status = SampSetDbObjectNameAlias(DomainObject,
379 L"Users",
380 Name->Buffer,
381 ulRid);
382 if (!NT_SUCCESS(Status))
383 {
384 TRACE("failed with status 0x%08lx\n", Status);
385 return Status;
386 }
387
388 /* Set the name attribute */
389 Status = SampSetObjectAttribute(UserObject,
390 L"Name",
391 REG_SZ,
392 (LPVOID)Name->Buffer,
393 Name->MaximumLength);
394 if (!NT_SUCCESS(Status))
395 {
396 TRACE("failed with status 0x%08lx\n", Status);
397 return Status;
398 }
399
400 /* FIXME: Set default user attributes */
401
402 if (NT_SUCCESS(Status))
403 {
404 *UserHandle = (SAMPR_HANDLE)UserObject;
405 *RelativeId = ulRid;
406 }
407
408 /* Increment the NextRID attribute */
409 ulRid++;
410 ulSize = sizeof(ULONG);
411 SampSetObjectAttribute(DomainObject,
412 L"NextRID",
413 REG_DWORD,
414 (LPVOID)&ulRid,
415 ulSize);
416
417 TRACE("returns with status 0x%08lx\n", Status);
418
419 return Status;
420 }
421
422 /* Function 13 */
423 NTSTATUS
424 NTAPI
425 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle,
426 IN OUT unsigned long *EnumerationContext,
427 IN unsigned long UserAccountControl,
428 OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
429 IN unsigned long PreferedMaximumLength,
430 OUT unsigned long *CountReturned)
431 {
432 UNIMPLEMENTED;
433 return STATUS_NOT_IMPLEMENTED;
434 }
435
436 /* Function 14 */
437 NTSTATUS
438 NTAPI
439 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle,
440 IN PRPC_UNICODE_STRING AccountName,
441 IN ACCESS_MASK DesiredAccess,
442 OUT SAMPR_HANDLE *AliasHandle,
443 OUT unsigned long *RelativeId)
444 {
445 UNIMPLEMENTED;
446 return STATUS_NOT_IMPLEMENTED;
447 }
448
449 /* Function 15 */
450 NTSTATUS
451 NTAPI
452 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle,
453 IN OUT unsigned long *EnumerationContext,
454 OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
455 IN unsigned long PreferedMaximumLength,
456 OUT unsigned long *CountReturned)
457 {
458 UNIMPLEMENTED;
459 return STATUS_NOT_IMPLEMENTED;
460 }
461
462 /* Function 16 */
463 NTSTATUS
464 NTAPI
465 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle,
466 IN PSAMPR_PSID_ARRAY SidArray,
467 OUT PSAMPR_ULONG_ARRAY Membership)
468 {
469 UNIMPLEMENTED;
470 return STATUS_NOT_IMPLEMENTED;
471 }
472
473 /* Function 17 */
474 NTSTATUS
475 NTAPI
476 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle,
477 IN unsigned long Count,
478 IN RPC_UNICODE_STRING Names[],
479 OUT PSAMPR_ULONG_ARRAY RelativeIds,
480 OUT PSAMPR_ULONG_ARRAY Use)
481 {
482 UNIMPLEMENTED;
483 return STATUS_NOT_IMPLEMENTED;
484 }
485
486 /* Function 18 */
487 NTSTATUS
488 NTAPI
489 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle,
490 IN unsigned long Count,
491 IN unsigned long *RelativeIds,
492 OUT PSAMPR_RETURNED_USTRING_ARRAY Names,
493 OUT PSAMPR_ULONG_ARRAY Use)
494 {
495 UNIMPLEMENTED;
496 return STATUS_NOT_IMPLEMENTED;
497 }
498
499 /* Function 19 */
500 NTSTATUS
501 NTAPI
502 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle,
503 IN ACCESS_MASK DesiredAccess,
504 IN unsigned long GroupId,
505 OUT SAMPR_HANDLE *GroupHandle)
506 {
507 UNIMPLEMENTED;
508 return STATUS_NOT_IMPLEMENTED;
509 }
510
511 /* Function 20 */
512 NTSTATUS
513 NTAPI
514 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle,
515 IN GROUP_INFORMATION_CLASS GroupInformationClass,
516 OUT PSAMPR_GROUP_INFO_BUFFER *Buffer)
517 {
518 UNIMPLEMENTED;
519 return STATUS_NOT_IMPLEMENTED;
520 }
521
522 /* Function 21 */
523 NTSTATUS
524 NTAPI
525 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle,
526 IN GROUP_INFORMATION_CLASS GroupInformationClass,
527 IN PSAMPR_GROUP_INFO_BUFFER Buffer)
528 {
529 UNIMPLEMENTED;
530 return STATUS_NOT_IMPLEMENTED;
531 }
532
533 /* Function 22 */
534 NTSTATUS
535 NTAPI
536 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle,
537 IN unsigned long MemberId,
538 IN unsigned long Attributes)
539 {
540 UNIMPLEMENTED;
541 return STATUS_NOT_IMPLEMENTED;
542 }
543
544 /* Function 21 */
545 NTSTATUS
546 NTAPI
547 SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle)
548 {
549 UNIMPLEMENTED;
550 return STATUS_NOT_IMPLEMENTED;
551 }
552
553 /* Function 24 */
554 NTSTATUS
555 NTAPI
556 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle,
557 IN unsigned long MemberId)
558 {
559 UNIMPLEMENTED;
560 return STATUS_NOT_IMPLEMENTED;
561 }
562
563 /* Function 25 */
564 NTSTATUS
565 NTAPI
566 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle,
567 OUT PSAMPR_GET_MEMBERS_BUFFER *Members)
568 {
569 UNIMPLEMENTED;
570 return STATUS_NOT_IMPLEMENTED;
571 }
572
573 /* Function 26 */
574 NTSTATUS
575 NTAPI
576 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle,
577 IN unsigned long MemberId,
578 IN unsigned long Attributes)
579 {
580 UNIMPLEMENTED;
581 return STATUS_NOT_IMPLEMENTED;
582 }
583
584 /* Function 27 */
585 NTSTATUS
586 NTAPI
587 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle,
588 IN ACCESS_MASK DesiredAccess,
589 IN unsigned long AliasId,
590 OUT SAMPR_HANDLE *AliasHandle)
591 {
592 UNIMPLEMENTED;
593 return STATUS_NOT_IMPLEMENTED;
594 }
595
596 /* Function 28 */
597 NTSTATUS
598 NTAPI
599 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle,
600 IN ALIAS_INFORMATION_CLASS AliasInformationClass,
601 OUT PSAMPR_ALIAS_INFO_BUFFER *Buffer)
602 {
603 UNIMPLEMENTED;
604 return STATUS_NOT_IMPLEMENTED;
605 }
606
607 /* Function 29 */
608 NTSTATUS
609 NTAPI
610 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle,
611 IN ALIAS_INFORMATION_CLASS AliasInformationClass,
612 IN PSAMPR_ALIAS_INFO_BUFFER Buffer)
613 {
614 UNIMPLEMENTED;
615 return STATUS_NOT_IMPLEMENTED;
616 }
617
618 /* Function 30 */
619 NTSTATUS
620 NTAPI
621 SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle)
622 {
623 UNIMPLEMENTED;
624 return STATUS_NOT_IMPLEMENTED;
625 }
626
627 /* Function 31 */
628 NTSTATUS
629 NTAPI
630 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle,
631 IN PRPC_SID MemberId)
632 {
633 UNIMPLEMENTED;
634 return STATUS_NOT_IMPLEMENTED;
635 }
636
637 /* Function 32 */
638 NTSTATUS
639 NTAPI
640 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle,
641 IN PRPC_SID MemberId)
642 {
643 UNIMPLEMENTED;
644 return STATUS_NOT_IMPLEMENTED;
645 }
646
647 /* Function 33 */
648 NTSTATUS
649 NTAPI
650 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle,
651 OUT PSAMPR_PSID_ARRAY_OUT Members)
652 {
653 UNIMPLEMENTED;
654 return STATUS_NOT_IMPLEMENTED;
655 }
656
657 /* Function 34 */
658 NTSTATUS
659 NTAPI
660 SamrOpenUser(IN SAMPR_HANDLE DomainHandle,
661 IN ACCESS_MASK DesiredAccess,
662 IN unsigned long UserId,
663 OUT SAMPR_HANDLE *UserHandle)
664 {
665 PSAM_DB_OBJECT DomainObject;
666 PSAM_DB_OBJECT UserObject;
667 WCHAR szRid[9];
668 NTSTATUS Status;
669
670 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
671 DomainHandle, DesiredAccess, UserId, UserHandle);
672
673 /* Validate the domain handle */
674 Status = SampValidateDbObject(DomainHandle,
675 SamDbDomainObject,
676 DOMAIN_LOOKUP,
677 &DomainObject);
678 if (!NT_SUCCESS(Status))
679 {
680 TRACE("failed with status 0x%08lx\n", Status);
681 return Status;
682 }
683
684 /* Convert the RID into a string (hex) */
685 swprintf(szRid, L"%08lX", UserId);
686
687 /* Create the user object */
688 Status = SampOpenDbObject(DomainObject,
689 L"Users",
690 szRid,
691 SamDbUserObject,
692 DesiredAccess,
693 &UserObject);
694 if (!NT_SUCCESS(Status))
695 {
696 TRACE("failed with status 0x%08lx\n", Status);
697 return Status;
698 }
699
700 *UserHandle = (SAMPR_HANDLE)UserObject;
701
702 return STATUS_SUCCESS;
703 }
704
705 /* Function 35 */
706 NTSTATUS
707 NTAPI
708 SamrDeleteUser(IN OUT SAMPR_HANDLE *UserHandle)
709 {
710 UNIMPLEMENTED;
711 return STATUS_NOT_IMPLEMENTED;
712 }
713
714 /* Function 36 */
715 NTSTATUS
716 NTAPI
717 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle,
718 IN USER_INFORMATION_CLASS UserInformationClass,
719 OUT PSAMPR_USER_INFO_BUFFER *Buffer)
720 {
721 UNIMPLEMENTED;
722 return STATUS_NOT_IMPLEMENTED;
723 }
724
725
726 static
727 NTSTATUS
728 SampSetPasswordInformation(PSAM_DB_OBJECT UserObject,
729 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordInfo)
730 {
731 NTSTATUS Status;
732
733 TRACE("Password: %S\n", PasswordInfo->Password.Buffer);
734 TRACE("PasswordExpired: %d\n", PasswordInfo->PasswordExpired);
735
736 Status = SampSetObjectAttribute(UserObject,
737 L"Password",
738 REG_SZ,
739 PasswordInfo->Password.Buffer,
740 PasswordInfo->Password.MaximumLength);
741
742 return Status;
743 }
744
745
746 /* Function 37 */
747 NTSTATUS
748 NTAPI
749 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle,
750 IN USER_INFORMATION_CLASS UserInformationClass,
751 IN PSAMPR_USER_INFO_BUFFER Buffer)
752 {
753 PSAM_DB_OBJECT UserObject;
754 NTSTATUS Status;
755
756 TRACE("SamrSetInformationUser(%p %lu %p)\n",
757 UserHandle, UserInformationClass, Buffer);
758
759 /* Validate the domain handle */
760 Status = SampValidateDbObject(UserHandle,
761 SamDbUserObject,
762 USER_FORCE_PASSWORD_CHANGE,
763 &UserObject);
764 if (!NT_SUCCESS(Status))
765 {
766 TRACE("failed with status 0x%08lx\n", Status);
767 return Status;
768 }
769
770 switch (UserInformationClass)
771 {
772 case UserSetPasswordInformation:
773 Status = SampSetPasswordInformation(UserObject,
774 (PSAMPR_USER_SET_PASSWORD_INFORMATION)Buffer);
775 break;
776
777 default:
778 Status = STATUS_INVALID_INFO_CLASS;
779 break;
780 }
781
782 return Status;
783 }
784
785 /* Function 38 */
786 NTSTATUS
787 NTAPI
788 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle,
789 IN unsigned char LmPresent,
790 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm,
791 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm,
792 IN unsigned char NtPresent,
793 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt,
794 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt,
795 IN unsigned char NtCrossEncryptionPresent,
796 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm,
797 IN unsigned char LmCrossEncryptionPresent,
798 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt)
799 {
800 UNIMPLEMENTED;
801 return STATUS_NOT_IMPLEMENTED;
802 }
803
804 /* Function 39 */
805 NTSTATUS
806 NTAPI
807 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle,
808 OUT PSAMPR_GET_GROUPS_BUFFER *Groups)
809 {
810 UNIMPLEMENTED;
811 return STATUS_NOT_IMPLEMENTED;
812 }
813
814 /* Function 40 */
815 NTSTATUS
816 NTAPI
817 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle,
818 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
819 IN unsigned long Index,
820 IN unsigned long EntryCount,
821 IN unsigned long PreferredMaximumLength,
822 OUT unsigned long *TotalAvailable,
823 OUT unsigned long *TotalReturned,
824 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer)
825 {
826 UNIMPLEMENTED;
827 return STATUS_NOT_IMPLEMENTED;
828 }
829
830 /* Function 41 */
831 NTSTATUS
832 NTAPI
833 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle,
834 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
835 IN PRPC_UNICODE_STRING Prefix,
836 OUT unsigned long *Index)
837 {
838 UNIMPLEMENTED;
839 return STATUS_NOT_IMPLEMENTED;
840 }
841
842 /* Function 42 */
843 NTSTATUS
844 NTAPI
845 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle)
846 {
847 UNIMPLEMENTED;
848 return STATUS_NOT_IMPLEMENTED;
849 }
850
851 /* Function 43 */
852 NTSTATUS
853 NTAPI
854 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle)
855 {
856 UNIMPLEMENTED;
857 return STATUS_NOT_IMPLEMENTED;
858 }
859
860 /* Function 44 */
861 NTSTATUS
862 NTAPI
863 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle,
864 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation)
865 {
866 UNIMPLEMENTED;
867 return STATUS_NOT_IMPLEMENTED;
868 }
869
870 /* Function 45 */
871 NTSTATUS
872 NTAPI
873 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle,
874 IN PRPC_SID MemberSid)
875 {
876 UNIMPLEMENTED;
877 return STATUS_NOT_IMPLEMENTED;
878 }
879
880 /* Function 46 */
881 NTSTATUS
882 NTAPI
883 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle,
884 IN DOMAIN_INFORMATION_CLASS DomainInformationClass,
885 OUT PSAMPR_DOMAIN_INFO_BUFFER *Buffer)
886 {
887 UNIMPLEMENTED;
888 return STATUS_NOT_IMPLEMENTED;
889 }
890
891 /* Function 47 */
892 NTSTATUS
893 NTAPI
894 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle,
895 IN USER_INFORMATION_CLASS UserInformationClass,
896 OUT PSAMPR_USER_INFO_BUFFER *Buffer)
897 {
898 UNIMPLEMENTED;
899 return STATUS_NOT_IMPLEMENTED;
900 }
901
902 /* Function 48 */
903 NTSTATUS
904 NTAPI
905 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle,
906 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
907 IN unsigned long Index,
908 IN unsigned long EntryCount,
909 IN unsigned long PreferredMaximumLength,
910 OUT unsigned long *TotalAvailable,
911 OUT unsigned long *TotalReturned,
912 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer)
913 {
914 UNIMPLEMENTED;
915 return STATUS_NOT_IMPLEMENTED;
916 }
917
918 /* Function 49 */
919 NTSTATUS
920 NTAPI
921 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle,
922 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
923 IN PRPC_UNICODE_STRING Prefix,
924 OUT unsigned long *Index)
925 {
926 UNIMPLEMENTED;
927 return STATUS_NOT_IMPLEMENTED;
928 }
929
930 /* Function 50 */
931 NTSTATUS
932 NTAPI
933 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle,
934 IN PRPC_UNICODE_STRING Name,
935 IN unsigned long AccountType,
936 IN ACCESS_MASK DesiredAccess,
937 OUT SAMPR_HANDLE *UserHandle,
938 OUT unsigned long *GrantedAccess,
939 OUT unsigned long *RelativeId)
940 {
941 UNIMPLEMENTED;
942 return STATUS_NOT_IMPLEMENTED;
943 }
944
945 /* Function 51 */
946 NTSTATUS
947 NTAPI
948 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle,
949 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
950 IN unsigned long Index,
951 IN unsigned long EntryCount,
952 IN unsigned long PreferredMaximumLength,
953 OUT unsigned long *TotalAvailable,
954 OUT unsigned long *TotalReturned,
955 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer)
956 {
957 UNIMPLEMENTED;
958 return STATUS_NOT_IMPLEMENTED;
959 }
960
961 /* Function 52 */
962 NTSTATUS
963 NTAPI
964 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle,
965 IN PSAMPR_PSID_ARRAY MembersBuffer)
966 {
967 UNIMPLEMENTED;
968 return STATUS_NOT_IMPLEMENTED;
969 }
970
971 /* Function 53 */
972 NTSTATUS
973 NTAPI
974 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle,
975 IN PSAMPR_PSID_ARRAY MembersBuffer)
976 {
977 UNIMPLEMENTED;
978 return STATUS_NOT_IMPLEMENTED;
979 }
980
981 /* Function 54 */
982 NTSTATUS
983 NTAPI
984 SamrOemChangePasswordUser2(IN handle_t BindingHandle,
985 IN PRPC_STRING ServerName,
986 IN PRPC_STRING UserName,
987 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm,
988 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm)
989 {
990 UNIMPLEMENTED;
991 return STATUS_NOT_IMPLEMENTED;
992 }
993
994 /* Function 55 */
995 NTSTATUS
996 NTAPI
997 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle,
998 IN PRPC_UNICODE_STRING ServerName,
999 IN PRPC_UNICODE_STRING UserName,
1000 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt,
1001 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt,
1002 IN unsigned char LmPresent,
1003 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm,
1004 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt)
1005 {
1006 UNIMPLEMENTED;
1007 return STATUS_NOT_IMPLEMENTED;
1008 }
1009
1010 /* Function 56 */
1011 NTSTATUS
1012 NTAPI
1013 SamrGetDomainPasswordInformation(IN handle_t BindingHandle,
1014 IN PRPC_UNICODE_STRING Unused,
1015 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation)
1016 {
1017 UNIMPLEMENTED;
1018 return STATUS_NOT_IMPLEMENTED;
1019 }
1020
1021 /* Function 57 */
1022 NTSTATUS
1023 NTAPI
1024 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName,
1025 OUT SAMPR_HANDLE *ServerHandle,
1026 IN ACCESS_MASK DesiredAccess)
1027 {
1028 UNIMPLEMENTED;
1029 return STATUS_NOT_IMPLEMENTED;
1030 }
1031
1032 /* Function 58 */
1033 NTSTATUS
1034 NTAPI
1035 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle,
1036 IN USER_INFORMATION_CLASS UserInformationClass,
1037 IN PSAMPR_USER_INFO_BUFFER Buffer)
1038 {
1039 UNIMPLEMENTED;
1040 return STATUS_NOT_IMPLEMENTED;
1041 }
1042
1043 /* Function 59 */
1044 NTSTATUS
1045 NTAPI
1046 SamrSetBootKeyInformation(IN handle_t BindingHandle) /* FIXME */
1047 {
1048 UNIMPLEMENTED;
1049 return STATUS_NOT_IMPLEMENTED;
1050 }
1051
1052 /* Function 60 */
1053 NTSTATUS
1054 NTAPI
1055 SamrGetBootKeyInformation(IN handle_t BindingHandle) /* FIXME */
1056 {
1057 UNIMPLEMENTED;
1058 return STATUS_NOT_IMPLEMENTED;
1059 }
1060
1061 /* Function 61 */
1062 NTSTATUS
1063 NTAPI
1064 SamrConnect3(IN handle_t BindingHandle) /* FIXME */
1065 {
1066 UNIMPLEMENTED;
1067 return STATUS_NOT_IMPLEMENTED;
1068 }
1069
1070 /* Function 62 */
1071 NTSTATUS
1072 NTAPI
1073 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName,
1074 OUT SAMPR_HANDLE *ServerHandle,
1075 IN unsigned long ClientRevision,
1076 IN ACCESS_MASK DesiredAccess)
1077 {
1078 UNIMPLEMENTED;
1079 return STATUS_NOT_IMPLEMENTED;
1080 }
1081
1082 /* Function 63 */
1083 NTSTATUS
1084 NTAPI
1085 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle) /* FIXME */
1086 {
1087 UNIMPLEMENTED;
1088 return STATUS_NOT_IMPLEMENTED;
1089 }
1090
1091 /* Function 64 */
1092 NTSTATUS
1093 NTAPI
1094 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName,
1095 IN ACCESS_MASK DesiredAccess,
1096 IN unsigned long InVersion,
1097 IN SAMPR_REVISION_INFO *InRevisionInfo,
1098 OUT unsigned long *OutVersion,
1099 OUT SAMPR_REVISION_INFO *OutRevisionInfo,
1100 OUT SAMPR_HANDLE *ServerHandle)
1101 {
1102 UNIMPLEMENTED;
1103 return STATUS_NOT_IMPLEMENTED;
1104 }
1105
1106 /* Function 65 */
1107 NTSTATUS
1108 NTAPI
1109 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle,
1110 IN unsigned long Rid,
1111 OUT PRPC_SID *Sid)
1112 {
1113 UNIMPLEMENTED;
1114 return STATUS_NOT_IMPLEMENTED;
1115 }
1116
1117 /* Function 66 */
1118 NTSTATUS
1119 NTAPI
1120 SamrSetDSRMPassword(IN handle_t BindingHandle,
1121 IN PRPC_UNICODE_STRING Unused,
1122 IN unsigned long UserId,
1123 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword)
1124 {
1125 UNIMPLEMENTED;
1126 return STATUS_NOT_IMPLEMENTED;
1127 }
1128
1129 /* Function 67 */
1130 NTSTATUS
1131 NTAPI
1132 SamrValidatePassword(IN handle_t Handle,
1133 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType,
1134 IN PSAM_VALIDATE_INPUT_ARG InputArg,
1135 OUT PSAM_VALIDATE_OUTPUT_ARG *OutputArg)
1136 {
1137 UNIMPLEMENTED;
1138 return STATUS_NOT_IMPLEMENTED;
1139 }
1140
1141 /* EOF */