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
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ****************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
16 /* GLOBALS ********************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
20 /* FUNCTIONS ***************************************************************/
23 SampStartRpcServer(VOID
)
27 TRACE("SampStartRpcServer() called\n");
29 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
33 if (Status
!= RPC_S_OK
)
35 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
39 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
42 if (Status
!= RPC_S_OK
)
44 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
48 Status
= RpcServerListen(1, 20, TRUE
);
49 if (Status
!= RPC_S_OK
)
51 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
55 TRACE("SampStartRpcServer() done\n");
59 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
61 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
65 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
67 HeapFree(GetProcessHeap(), 0, ptr
);
70 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
77 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
78 OUT SAMPR_HANDLE
*ServerHandle
,
79 IN ACCESS_MASK DesiredAccess
)
81 PSAM_DB_OBJECT ServerObject
;
84 TRACE("SamrConnect(%p %p %lx)\n",
85 ServerName
, ServerHandle
, DesiredAccess
);
87 Status
= SampOpenDbObject(NULL
,
93 if (NT_SUCCESS(Status
))
94 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
96 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
104 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
106 PSAM_DB_OBJECT DbObject
;
107 NTSTATUS Status
= STATUS_SUCCESS
;
109 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
111 Status
= SampValidateDbObject(*SamHandle
,
115 if (Status
== STATUS_SUCCESS
)
117 Status
= SampCloseDbObject(DbObject
);
121 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
129 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
130 IN SECURITY_INFORMATION SecurityInformation
,
131 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
134 return STATUS_NOT_IMPLEMENTED
;
140 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
141 IN SECURITY_INFORMATION SecurityInformation
,
142 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
* SecurityDescriptor
)
145 return STATUS_NOT_IMPLEMENTED
;
151 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
154 return STATUS_NOT_IMPLEMENTED
;
160 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
161 IN PRPC_UNICODE_STRING Name
,
162 OUT PRPC_SID
*DomainId
)
164 PSAM_DB_OBJECT ServerObject
;
165 HANDLE DomainsKeyHandle
= NULL
;
166 HANDLE DomainKeyHandle
= NULL
;
167 WCHAR DomainKeyName
[64];
169 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
170 UNICODE_STRING DomainName
;
175 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
176 ServerHandle
, Name
, DomainId
);
178 /* Validate the server handle */
179 Status
= SampValidateDbObject(ServerHandle
,
181 SAM_SERVER_LOOKUP_DOMAIN
,
183 if (!NT_SUCCESS(Status
))
188 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
192 if (!NT_SUCCESS(Status
))
196 while (Found
== FALSE
)
198 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
202 if (!NT_SUCCESS(Status
))
204 if (Status
== STATUS_NO_MORE_ENTRIES
)
205 Status
= STATUS_NO_SUCH_DOMAIN
;
209 TRACE("Domain key name: %S\n", DomainKeyName
);
211 Status
= SampRegOpenKey(DomainsKeyHandle
,
215 if (NT_SUCCESS(Status
))
217 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
218 Status
= SampRegQueryValue(DomainKeyHandle
,
221 (PVOID
)&DomainNameString
,
223 if (NT_SUCCESS(Status
))
225 TRACE("Domain name: %S\n", DomainNameString
);
227 RtlInitUnicodeString(&DomainName
,
229 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
231 TRACE("Found it!\n");
234 Status
= SampRegQueryValue(DomainKeyHandle
,
239 if (NT_SUCCESS(Status
))
241 *DomainId
= midl_user_allocate(Length
);
243 SampRegQueryValue(DomainKeyHandle
,
249 Status
= STATUS_SUCCESS
;
255 NtClose(DomainKeyHandle
);
261 NtClose(DomainsKeyHandle
);
269 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
270 IN OUT
unsigned long *EnumerationContext
,
271 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
272 IN ULONG PreferedMaximumLength
,
273 OUT PULONG CountReturned
)
275 PSAM_DB_OBJECT ServerObject
;
276 WCHAR DomainKeyName
[64];
277 HANDLE DomainsKeyHandle
;
278 HANDLE DomainKeyHandle
;
281 ULONG RequiredLength
;
284 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
287 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
288 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
291 /* Validate the server handle */
292 Status
= SampValidateDbObject(ServerHandle
,
294 SAM_SERVER_ENUMERATE_DOMAINS
,
296 if (!NT_SUCCESS(Status
))
299 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
303 if (!NT_SUCCESS(Status
))
306 EnumIndex
= *EnumerationContext
;
312 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
316 if (!NT_SUCCESS(Status
))
319 TRACE("EnumIndex: %lu\n", EnumIndex
);
320 TRACE("Domain key name: %S\n", DomainKeyName
);
322 Status
= SampRegOpenKey(DomainsKeyHandle
,
326 TRACE("SampRegOpenKey returned %08lX\n", Status
);
327 if (NT_SUCCESS(Status
))
330 Status
= SampRegQueryValue(DomainKeyHandle
,
335 TRACE("SampRegQueryValue returned %08lX\n", Status
);
336 if (NT_SUCCESS(Status
))
338 TRACE("Data length: %lu\n", DataLength
);
340 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
343 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
347 NtClose(DomainKeyHandle
);
353 TRACE("EnumCount: %lu\n", EnumCount
);
354 TRACE("RequiredLength: %lu\n", RequiredLength
);
356 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
357 if (EnumBuffer
== NULL
)
359 Status
= STATUS_INSUFFICIENT_RESOURCES
;
363 EnumBuffer
->EntriesRead
= EnumCount
;
364 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
365 if (EnumBuffer
->Buffer
== NULL
)
367 Status
= STATUS_INSUFFICIENT_RESOURCES
;
371 EnumIndex
= *EnumerationContext
;
372 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
374 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
378 if (!NT_SUCCESS(Status
))
381 TRACE("EnumIndex: %lu\n", EnumIndex
);
382 TRACE("Domain key name: %S\n", DomainKeyName
);
384 Status
= SampRegOpenKey(DomainsKeyHandle
,
388 TRACE("SampRegOpenKey returned %08lX\n", Status
);
389 if (NT_SUCCESS(Status
))
392 Status
= SampRegQueryValue(DomainKeyHandle
,
397 TRACE("SampRegQueryValue returned %08lX\n", Status
);
398 if (NT_SUCCESS(Status
))
400 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
401 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
402 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
403 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
404 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
406 NtClose(DomainKeyHandle
);
407 Status
= STATUS_INSUFFICIENT_RESOURCES
;
411 Status
= SampRegQueryValue(DomainKeyHandle
,
414 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
416 TRACE("SampRegQueryValue returned %08lX\n", Status
);
417 if (NT_SUCCESS(Status
))
419 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
423 NtClose(DomainKeyHandle
);
425 if (!NT_SUCCESS(Status
))
430 if (NT_SUCCESS(Status
))
432 *EnumerationContext
+= EnumCount
;
433 *Buffer
= EnumBuffer
;
434 *CountReturned
= EnumCount
;
438 if (!NT_SUCCESS(Status
))
440 *EnumerationContext
= 0;
444 if (EnumBuffer
!= NULL
)
446 if (EnumBuffer
->Buffer
!= NULL
)
448 if (EnumBuffer
->EntriesRead
!= 0)
450 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
452 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
453 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
457 midl_user_free(EnumBuffer
->Buffer
);
460 midl_user_free(EnumBuffer
);
464 NtClose(DomainsKeyHandle
);
472 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
473 IN ACCESS_MASK DesiredAccess
,
474 IN PRPC_SID DomainId
,
475 OUT SAMPR_HANDLE
*DomainHandle
)
477 PSAM_DB_OBJECT ServerObject
;
478 PSAM_DB_OBJECT DomainObject
;
481 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
482 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
484 /* Validate the server handle */
485 Status
= SampValidateDbObject(ServerHandle
,
487 SAM_SERVER_LOOKUP_DOMAIN
,
489 if (!NT_SUCCESS(Status
))
492 /* Validate the Domain SID */
493 if ((DomainId
->Revision
!= SID_REVISION
) ||
494 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
495 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
496 return STATUS_INVALID_PARAMETER
;
498 /* Open the domain object */
499 if ((DomainId
->SubAuthorityCount
== 1) &&
500 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
502 /* Builtin domain object */
503 TRACE("Opening the builtin domain object.\n");
505 Status
= SampOpenDbObject(ServerObject
,
512 else if ((DomainId
->SubAuthorityCount
== 4) &&
513 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
515 /* Account domain object */
516 TRACE("Opening the account domain object.\n");
518 /* FIXME: Check the account domain sub authorities!!! */
520 Status
= SampOpenDbObject(ServerObject
,
529 /* No vaild domain SID */
530 Status
= STATUS_INVALID_PARAMETER
;
533 if (NT_SUCCESS(Status
))
534 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
536 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
543 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
544 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
546 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
547 SAM_DOMAIN_FIXED_DATA FixedData
;
553 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
554 if (InfoBuffer
== NULL
)
555 return STATUS_INSUFFICIENT_RESOURCES
;
557 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
558 Status
= SampGetObjectAttribute(DomainObject
,
563 if (!NT_SUCCESS(Status
))
566 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
567 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
568 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
569 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
570 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
571 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
572 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
574 *Buffer
= InfoBuffer
;
577 if (!NT_SUCCESS(Status
))
579 if (InfoBuffer
!= NULL
)
581 midl_user_free(InfoBuffer
);
590 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
591 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
593 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
594 SAM_DOMAIN_FIXED_DATA FixedData
;
600 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
601 if (InfoBuffer
== NULL
)
602 return STATUS_INSUFFICIENT_RESOURCES
;
604 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
605 Status
= SampGetObjectAttribute(DomainObject
,
610 if (!NT_SUCCESS(Status
))
613 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
614 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
615 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
616 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
617 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
618 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
619 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
622 Status
= SampGetObjectAttribute(DomainObject
,
627 if (!NT_SUCCESS(Status
))
630 InfoBuffer
->General
.OemInformation
.Length
= Length
- sizeof(WCHAR
);
631 InfoBuffer
->General
.OemInformation
.MaximumLength
= Length
;
632 InfoBuffer
->General
.OemInformation
.Buffer
= midl_user_allocate(Length
);
633 if (InfoBuffer
->General
.OemInformation
.Buffer
== NULL
)
635 Status
= STATUS_INSUFFICIENT_RESOURCES
;
639 Status
= SampGetObjectAttribute(DomainObject
,
642 (PVOID
)InfoBuffer
->General
.OemInformation
.Buffer
,
644 if (!NT_SUCCESS(Status
))
648 Status
= SampGetObjectAttribute(DomainObject
,
653 if (!NT_SUCCESS(Status
))
656 InfoBuffer
->General
.DomainName
.Length
= Length
- sizeof(WCHAR
);
657 InfoBuffer
->General
.DomainName
.MaximumLength
= Length
;
658 InfoBuffer
->General
.DomainName
.Buffer
= midl_user_allocate(Length
);
659 if (InfoBuffer
->General
.DomainName
.Buffer
== NULL
)
661 Status
= STATUS_INSUFFICIENT_RESOURCES
;
665 Status
= SampGetObjectAttribute(DomainObject
,
668 (PVOID
)InfoBuffer
->General
.DomainName
.Buffer
,
670 if (!NT_SUCCESS(Status
))
674 Status
= SampGetObjectAttribute(DomainObject
,
675 L
"ReplicaSourceNodeName",
679 if (!NT_SUCCESS(Status
))
682 InfoBuffer
->General
.ReplicaSourceNodeName
.Length
= Length
- sizeof(WCHAR
);
683 InfoBuffer
->General
.ReplicaSourceNodeName
.MaximumLength
= Length
;
684 InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
= midl_user_allocate(Length
);
685 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
== NULL
)
687 Status
= STATUS_INSUFFICIENT_RESOURCES
;
691 Status
= SampGetObjectAttribute(DomainObject
,
692 L
"ReplicaSourceNodeName",
694 (PVOID
)InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
,
696 if (!NT_SUCCESS(Status
))
699 InfoBuffer
->General
.UserCount
= 0; /* FIXME */
700 InfoBuffer
->General
.GroupCount
= 0; /* FIXME */
701 InfoBuffer
->General
.AliasCount
= 0; /* FIXME */
703 *Buffer
= InfoBuffer
;
706 if (!NT_SUCCESS(Status
))
708 if (InfoBuffer
!= NULL
)
710 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
711 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
713 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
714 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
716 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
717 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
719 midl_user_free(InfoBuffer
);
728 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
729 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
731 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
732 SAM_DOMAIN_FIXED_DATA FixedData
;
738 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
739 if (InfoBuffer
== NULL
)
740 return STATUS_INSUFFICIENT_RESOURCES
;
742 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
743 Status
= SampGetObjectAttribute(DomainObject
,
748 if (!NT_SUCCESS(Status
))
751 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
752 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
754 *Buffer
= InfoBuffer
;
757 if (!NT_SUCCESS(Status
))
759 if (InfoBuffer
!= NULL
)
761 midl_user_free(InfoBuffer
);
770 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
771 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
773 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
779 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
780 if (InfoBuffer
== NULL
)
781 return STATUS_INSUFFICIENT_RESOURCES
;
783 Status
= SampGetObjectAttribute(DomainObject
,
788 if (!NT_SUCCESS(Status
))
791 InfoBuffer
->Oem
.OemInformation
.Length
= Length
- sizeof(WCHAR
);
792 InfoBuffer
->Oem
.OemInformation
.MaximumLength
= Length
;
793 InfoBuffer
->Oem
.OemInformation
.Buffer
= midl_user_allocate(Length
);
794 if (InfoBuffer
->Oem
.OemInformation
.Buffer
== NULL
)
796 Status
= STATUS_INSUFFICIENT_RESOURCES
;
800 Status
= SampGetObjectAttribute(DomainObject
,
803 (PVOID
)InfoBuffer
->Oem
.OemInformation
.Buffer
,
805 if (!NT_SUCCESS(Status
))
808 *Buffer
= InfoBuffer
;
811 if (!NT_SUCCESS(Status
))
813 if (InfoBuffer
!= NULL
)
815 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
816 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
818 midl_user_free(InfoBuffer
);
827 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
828 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
830 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
836 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
837 if (InfoBuffer
== NULL
)
838 return STATUS_INSUFFICIENT_RESOURCES
;
840 Status
= SampGetObjectAttribute(DomainObject
,
845 if (!NT_SUCCESS(Status
))
848 InfoBuffer
->Name
.DomainName
.Length
= Length
- sizeof(WCHAR
);
849 InfoBuffer
->Name
.DomainName
.MaximumLength
= Length
;
850 InfoBuffer
->Name
.DomainName
.Buffer
= midl_user_allocate(Length
);
851 if (InfoBuffer
->Name
.DomainName
.Buffer
== NULL
)
853 Status
= STATUS_INSUFFICIENT_RESOURCES
;
857 Status
= SampGetObjectAttribute(DomainObject
,
860 (PVOID
)InfoBuffer
->Name
.DomainName
.Buffer
,
862 if (!NT_SUCCESS(Status
))
865 *Buffer
= InfoBuffer
;
868 if (!NT_SUCCESS(Status
))
870 if (InfoBuffer
!= NULL
)
872 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
873 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
875 midl_user_free(InfoBuffer
);
884 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
885 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
887 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
893 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
894 if (InfoBuffer
== NULL
)
895 return STATUS_INSUFFICIENT_RESOURCES
;
897 Status
= SampGetObjectAttribute(DomainObject
,
898 L
"ReplicaSourceNodeName",
902 if (!NT_SUCCESS(Status
))
905 InfoBuffer
->Replication
.ReplicaSourceNodeName
.Length
= Length
- sizeof(WCHAR
);
906 InfoBuffer
->Replication
.ReplicaSourceNodeName
.MaximumLength
= Length
;
907 InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
= midl_user_allocate(Length
);
908 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
== NULL
)
910 Status
= STATUS_INSUFFICIENT_RESOURCES
;
914 Status
= SampGetObjectAttribute(DomainObject
,
915 L
"ReplicaSourceNodeName",
917 (PVOID
)InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
,
919 if (!NT_SUCCESS(Status
))
922 *Buffer
= InfoBuffer
;
925 if (!NT_SUCCESS(Status
))
927 if (InfoBuffer
!= NULL
)
929 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
930 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
932 midl_user_free(InfoBuffer
);
941 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
942 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
944 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
945 SAM_DOMAIN_FIXED_DATA FixedData
;
951 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
952 if (InfoBuffer
== NULL
)
953 return STATUS_INSUFFICIENT_RESOURCES
;
955 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
956 Status
= SampGetObjectAttribute(DomainObject
,
961 if (!NT_SUCCESS(Status
))
964 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
966 *Buffer
= InfoBuffer
;
969 if (!NT_SUCCESS(Status
))
971 if (InfoBuffer
!= NULL
)
973 midl_user_free(InfoBuffer
);
982 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
983 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
985 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
986 SAM_DOMAIN_FIXED_DATA FixedData
;
992 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
993 if (InfoBuffer
== NULL
)
994 return STATUS_INSUFFICIENT_RESOURCES
;
996 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
997 Status
= SampGetObjectAttribute(DomainObject
,
1002 if (!NT_SUCCESS(Status
))
1005 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1006 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1007 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1008 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1010 *Buffer
= InfoBuffer
;
1013 if (!NT_SUCCESS(Status
))
1015 if (InfoBuffer
!= NULL
)
1017 midl_user_free(InfoBuffer
);
1026 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1027 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1029 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1030 SAM_DOMAIN_FIXED_DATA FixedData
;
1036 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1037 if (InfoBuffer
== NULL
)
1038 return STATUS_INSUFFICIENT_RESOURCES
;
1040 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1041 Status
= SampGetObjectAttribute(DomainObject
,
1046 if (!NT_SUCCESS(Status
))
1049 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1051 *Buffer
= InfoBuffer
;
1054 if (!NT_SUCCESS(Status
))
1056 if (InfoBuffer
!= NULL
)
1058 midl_user_free(InfoBuffer
);
1067 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1068 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1070 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1071 SAM_DOMAIN_FIXED_DATA FixedData
;
1077 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1078 if (InfoBuffer
== NULL
)
1079 return STATUS_INSUFFICIENT_RESOURCES
;
1081 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1082 Status
= SampGetObjectAttribute(DomainObject
,
1087 if (!NT_SUCCESS(Status
))
1090 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1091 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1092 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1093 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1094 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1095 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1096 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1098 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1099 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1100 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1103 Status
= SampGetObjectAttribute(DomainObject
,
1108 if (!NT_SUCCESS(Status
))
1111 InfoBuffer
->General2
.I1
.OemInformation
.Length
= Length
- sizeof(WCHAR
);
1112 InfoBuffer
->General2
.I1
.OemInformation
.MaximumLength
= Length
;
1113 InfoBuffer
->General2
.I1
.OemInformation
.Buffer
= midl_user_allocate(Length
);
1114 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
== NULL
)
1116 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1120 Status
= SampGetObjectAttribute(DomainObject
,
1123 (PVOID
)InfoBuffer
->General2
.I1
.OemInformation
.Buffer
,
1125 if (!NT_SUCCESS(Status
))
1129 Status
= SampGetObjectAttribute(DomainObject
,
1134 if (!NT_SUCCESS(Status
))
1137 InfoBuffer
->General2
.I1
.DomainName
.Length
= Length
- sizeof(WCHAR
);
1138 InfoBuffer
->General2
.I1
.DomainName
.MaximumLength
= Length
;
1139 InfoBuffer
->General2
.I1
.DomainName
.Buffer
= midl_user_allocate(Length
);
1140 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
== NULL
)
1142 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1146 Status
= SampGetObjectAttribute(DomainObject
,
1149 (PVOID
)InfoBuffer
->General2
.I1
.DomainName
.Buffer
,
1151 if (!NT_SUCCESS(Status
))
1155 Status
= SampGetObjectAttribute(DomainObject
,
1156 L
"ReplicaSourceNodeName",
1160 if (!NT_SUCCESS(Status
))
1163 InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Length
= Length
- sizeof(WCHAR
);
1164 InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.MaximumLength
= Length
;
1165 InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
= midl_user_allocate(Length
);
1166 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
== NULL
)
1168 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1172 Status
= SampGetObjectAttribute(DomainObject
,
1173 L
"ReplicaSourceNodeName",
1175 (PVOID
)InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
,
1177 if (!NT_SUCCESS(Status
))
1180 InfoBuffer
->General2
.I1
.UserCount
= 0; /* FIXME */
1181 InfoBuffer
->General2
.I1
.GroupCount
= 0; /* FIXME */
1182 InfoBuffer
->General2
.I1
.AliasCount
= 0; /* FIXME */
1184 *Buffer
= InfoBuffer
;
1187 if (!NT_SUCCESS(Status
))
1189 if (InfoBuffer
!= NULL
)
1191 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1192 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1194 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1195 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1197 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1198 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1200 midl_user_free(InfoBuffer
);
1209 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1210 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1212 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1213 SAM_DOMAIN_FIXED_DATA FixedData
;
1219 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1220 if (InfoBuffer
== NULL
)
1221 return STATUS_INSUFFICIENT_RESOURCES
;
1223 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1224 Status
= SampGetObjectAttribute(DomainObject
,
1229 if (!NT_SUCCESS(Status
))
1232 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1233 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1234 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1236 *Buffer
= InfoBuffer
;
1239 if (!NT_SUCCESS(Status
))
1241 if (InfoBuffer
!= NULL
)
1243 midl_user_free(InfoBuffer
);
1252 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1253 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1255 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1256 SAM_DOMAIN_FIXED_DATA FixedData
;
1262 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1263 if (InfoBuffer
== NULL
)
1264 return STATUS_INSUFFICIENT_RESOURCES
;
1266 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1267 Status
= SampGetObjectAttribute(DomainObject
,
1272 if (!NT_SUCCESS(Status
))
1275 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1276 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1277 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1278 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1279 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1280 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1282 *Buffer
= InfoBuffer
;
1285 if (!NT_SUCCESS(Status
))
1287 if (InfoBuffer
!= NULL
)
1289 midl_user_free(InfoBuffer
);
1300 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1301 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1302 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1304 PSAM_DB_OBJECT DomainObject
;
1305 ACCESS_MASK DesiredAccess
;
1308 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1309 DomainHandle
, DomainInformationClass
, Buffer
);
1311 switch (DomainInformationClass
)
1313 case DomainPasswordInformation
:
1314 case DomainLockoutInformation
:
1315 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1318 case DomainGeneralInformation
:
1319 case DomainLogoffInformation
:
1320 case DomainOemInformation
:
1321 case DomainNameInformation
:
1322 case DomainReplicationInformation
:
1323 case DomainServerRoleInformation
:
1324 case DomainModifiedInformation
:
1325 case DomainStateInformation
:
1326 case DomainModifiedInformation2
:
1327 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1330 case DomainGeneralInformation2
:
1331 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1332 DOMAIN_READ_OTHER_PARAMETERS
;
1336 return STATUS_INVALID_INFO_CLASS
;
1339 /* Validate the server handle */
1340 Status
= SampValidateDbObject(DomainHandle
,
1344 if (!NT_SUCCESS(Status
))
1347 switch (DomainInformationClass
)
1349 case DomainPasswordInformation
:
1350 Status
= SampQueryDomainPassword(DomainObject
,
1354 case DomainGeneralInformation
:
1355 Status
= SampQueryDomainGeneral(DomainObject
,
1359 case DomainLogoffInformation
:
1360 Status
= SampQueryDomainLogoff(DomainObject
,
1364 case DomainOemInformation
:
1365 Status
= SampQueryDomainOem(DomainObject
,
1369 case DomainNameInformation
:
1370 Status
= SampQueryDomainName(DomainObject
,
1374 case DomainReplicationInformation
:
1375 Status
= SampQueryDomainReplication(DomainObject
,
1379 case DomainServerRoleInformation
:
1380 Status
= SampQueryDomainServerRole(DomainObject
,
1384 case DomainModifiedInformation
:
1385 Status
= SampQueryDomainModified(DomainObject
,
1389 case DomainStateInformation
:
1390 Status
= SampQueryDomainState(DomainObject
,
1394 case DomainGeneralInformation2
:
1395 Status
= SampQueryDomainGeneral2(DomainObject
,
1399 case DomainLockoutInformation
:
1400 Status
= SampQueryDomainLockout(DomainObject
,
1404 case DomainModifiedInformation2
:
1405 Status
= SampQueryDomainModified2(DomainObject
,
1410 Status
= STATUS_NOT_IMPLEMENTED
;
1418 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1419 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1421 SAM_DOMAIN_FIXED_DATA FixedData
;
1425 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1426 Status
= SampGetObjectAttribute(DomainObject
,
1431 if (!NT_SUCCESS(Status
))
1434 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1435 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1436 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1437 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1438 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1439 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1440 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1442 Status
= SampSetObjectAttribute(DomainObject
,
1454 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1455 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1457 SAM_DOMAIN_FIXED_DATA FixedData
;
1461 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1462 Status
= SampGetObjectAttribute(DomainObject
,
1467 if (!NT_SUCCESS(Status
))
1470 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1471 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1473 Status
= SampSetObjectAttribute(DomainObject
,
1485 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1486 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1488 SAM_DOMAIN_FIXED_DATA FixedData
;
1492 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1493 Status
= SampGetObjectAttribute(DomainObject
,
1498 if (!NT_SUCCESS(Status
))
1501 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1503 Status
= SampSetObjectAttribute(DomainObject
,
1515 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1516 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1518 SAM_DOMAIN_FIXED_DATA FixedData
;
1522 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1523 Status
= SampGetObjectAttribute(DomainObject
,
1528 if (!NT_SUCCESS(Status
))
1531 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1533 Status
= SampSetObjectAttribute(DomainObject
,
1545 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1546 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1548 SAM_DOMAIN_FIXED_DATA FixedData
;
1552 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1553 Status
= SampGetObjectAttribute(DomainObject
,
1558 if (!NT_SUCCESS(Status
))
1561 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1562 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1563 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1565 Status
= SampSetObjectAttribute(DomainObject
,
1579 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1580 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1581 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1583 PSAM_DB_OBJECT DomainObject
;
1584 ACCESS_MASK DesiredAccess
;
1587 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1588 DomainHandle
, DomainInformationClass
, DomainInformation
);
1590 switch (DomainInformationClass
)
1592 case DomainPasswordInformation
:
1593 case DomainLockoutInformation
:
1594 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1597 case DomainLogoffInformation
:
1598 case DomainOemInformation
:
1599 case DomainNameInformation
:
1600 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1603 case DomainReplicationInformation
:
1604 case DomainServerRoleInformation
:
1605 case DomainStateInformation
:
1606 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1610 return STATUS_INVALID_INFO_CLASS
;
1613 /* Validate the server handle */
1614 Status
= SampValidateDbObject(DomainHandle
,
1618 if (!NT_SUCCESS(Status
))
1621 switch (DomainInformationClass
)
1623 case DomainPasswordInformation
:
1624 Status
= SampSetDomainPassword(DomainObject
,
1628 case DomainLogoffInformation
:
1629 Status
= SampSetDomainLogoff(DomainObject
,
1633 case DomainOemInformation
:
1634 Status
= SampSetObjectAttribute(DomainObject
,
1637 DomainInformation
->Oem
.OemInformation
.Buffer
,
1638 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1641 case DomainNameInformation
:
1642 Status
= SampSetObjectAttribute(DomainObject
,
1645 DomainInformation
->Name
.DomainName
.Buffer
,
1646 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1649 case DomainReplicationInformation
:
1650 Status
= SampSetObjectAttribute(DomainObject
,
1651 L
"ReplicaSourceNodeName",
1653 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1654 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1657 case DomainServerRoleInformation
:
1658 Status
= SampSetDomainServerRole(DomainObject
,
1662 case DomainStateInformation
:
1663 Status
= SampSetDomainState(DomainObject
,
1667 case DomainLockoutInformation
:
1668 Status
= SampSetDomainLockout(DomainObject
,
1673 Status
= STATUS_NOT_IMPLEMENTED
;
1682 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1683 IN PRPC_UNICODE_STRING Name
,
1684 IN ACCESS_MASK DesiredAccess
,
1685 OUT SAMPR_HANDLE
*GroupHandle
,
1686 OUT
unsigned long *RelativeId
)
1689 return STATUS_NOT_IMPLEMENTED
;
1695 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1696 IN OUT
unsigned long *EnumerationContext
,
1697 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1698 IN
unsigned long PreferedMaximumLength
,
1699 OUT
unsigned long *CountReturned
)
1702 return STATUS_NOT_IMPLEMENTED
;
1708 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1709 IN PRPC_UNICODE_STRING Name
,
1710 IN ACCESS_MASK DesiredAccess
,
1711 OUT SAMPR_HANDLE
*UserHandle
,
1712 OUT
unsigned long *RelativeId
)
1714 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1715 SAM_USER_FIXED_DATA FixedUserData
;
1716 PSAM_DB_OBJECT DomainObject
;
1717 PSAM_DB_OBJECT UserObject
;
1721 BOOL bAliasExists
= FALSE
;
1724 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
1725 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
1727 /* Validate the domain handle */
1728 Status
= SampValidateDbObject(DomainHandle
,
1732 if (!NT_SUCCESS(Status
))
1734 TRACE("failed with status 0x%08lx\n", Status
);
1738 /* Get the fixed domain attributes */
1739 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1740 Status
= SampGetObjectAttribute(DomainObject
,
1743 (PVOID
)&FixedDomainData
,
1745 if (!NT_SUCCESS(Status
))
1747 TRACE("failed with status 0x%08lx\n", Status
);
1751 /* Increment the NextRid attribute */
1752 ulRid
= FixedDomainData
.NextRid
;
1753 FixedDomainData
.NextRid
++;
1755 /* Store the fixed domain attributes */
1756 Status
= SampSetObjectAttribute(DomainObject
,
1761 if (!NT_SUCCESS(Status
))
1763 TRACE("failed with status 0x%08lx\n", Status
);
1767 TRACE("RID: %lx\n", ulRid
);
1769 /* Convert the RID into a string (hex) */
1770 swprintf(szRid
, L
"%08lX", ulRid
);
1772 /* Check whether the user name is already in use */
1773 Status
= SampCheckDbObjectNameAlias(DomainObject
,
1777 if (!NT_SUCCESS(Status
))
1779 TRACE("failed with status 0x%08lx\n", Status
);
1785 TRACE("The user account %S already exists!\n", Name
->Buffer
);
1786 return STATUS_USER_EXISTS
;
1789 /* Create the user object */
1790 Status
= SampCreateDbObject(DomainObject
,
1796 if (!NT_SUCCESS(Status
))
1798 TRACE("failed with status 0x%08lx\n", Status
);
1802 /* Add the name alias for the user object */
1803 Status
= SampSetDbObjectNameAlias(DomainObject
,
1807 if (!NT_SUCCESS(Status
))
1809 TRACE("failed with status 0x%08lx\n", Status
);
1813 /* Initialize fixed user data */
1814 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
1815 FixedUserData
.Version
= 1;
1817 FixedUserData
.UserId
= ulRid
;
1819 /* Set fixed user data attribute */
1820 Status
= SampSetObjectAttribute(UserObject
,
1823 (LPVOID
)&FixedUserData
,
1824 sizeof(SAM_USER_FIXED_DATA
));
1825 if (!NT_SUCCESS(Status
))
1827 TRACE("failed with status 0x%08lx\n", Status
);
1831 /* Set the name attribute */
1832 Status
= SampSetObjectAttribute(UserObject
,
1835 (LPVOID
)Name
->Buffer
,
1836 Name
->MaximumLength
);
1837 if (!NT_SUCCESS(Status
))
1839 TRACE("failed with status 0x%08lx\n", Status
);
1843 /* FIXME: Set default user attributes */
1845 if (NT_SUCCESS(Status
))
1847 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
1848 *RelativeId
= ulRid
;
1851 TRACE("returns with status 0x%08lx\n", Status
);
1859 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
1860 IN OUT
unsigned long *EnumerationContext
,
1861 IN
unsigned long UserAccountControl
,
1862 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1863 IN
unsigned long PreferedMaximumLength
,
1864 OUT
unsigned long *CountReturned
)
1867 return STATUS_NOT_IMPLEMENTED
;
1873 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
1874 IN PRPC_UNICODE_STRING AccountName
,
1875 IN ACCESS_MASK DesiredAccess
,
1876 OUT SAMPR_HANDLE
*AliasHandle
,
1877 OUT
unsigned long *RelativeId
)
1879 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1880 PSAM_DB_OBJECT DomainObject
;
1881 PSAM_DB_OBJECT AliasObject
;
1882 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1886 BOOL bAliasExists
= FALSE
;
1889 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
1890 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
1892 /* Validate the domain handle */
1893 Status
= SampValidateDbObject(DomainHandle
,
1895 DOMAIN_CREATE_ALIAS
,
1897 if (!NT_SUCCESS(Status
))
1899 TRACE("failed with status 0x%08lx\n", Status
);
1903 /* Get the fixed domain attributes */
1904 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1905 Status
= SampGetObjectAttribute(DomainObject
,
1908 (PVOID
)&FixedDomainData
,
1910 if (!NT_SUCCESS(Status
))
1912 TRACE("failed with status 0x%08lx\n", Status
);
1916 /* Increment the NextRid attribute */
1917 ulRid
= FixedDomainData
.NextRid
;
1918 FixedDomainData
.NextRid
++;
1920 /* Store the fixed domain attributes */
1921 Status
= SampSetObjectAttribute(DomainObject
,
1926 if (!NT_SUCCESS(Status
))
1928 TRACE("failed with status 0x%08lx\n", Status
);
1932 TRACE("RID: %lx\n", ulRid
);
1934 /* Convert the RID into a string (hex) */
1935 swprintf(szRid
, L
"%08lX", ulRid
);
1937 /* Check whether the user name is already in use */
1938 Status
= SampCheckDbObjectNameAlias(DomainObject
,
1940 AccountName
->Buffer
,
1942 if (!NT_SUCCESS(Status
))
1944 TRACE("failed with status 0x%08lx\n", Status
);
1950 TRACE("The alias account %S already exists!\n", AccountName
->Buffer
);
1951 return STATUS_ALIAS_EXISTS
;
1954 /* Create the user object */
1955 Status
= SampCreateDbObject(DomainObject
,
1961 if (!NT_SUCCESS(Status
))
1963 TRACE("failed with status 0x%08lx\n", Status
);
1967 /* Add the name alias for the user object */
1968 Status
= SampSetDbObjectNameAlias(DomainObject
,
1970 AccountName
->Buffer
,
1972 if (!NT_SUCCESS(Status
))
1974 TRACE("failed with status 0x%08lx\n", Status
);
1978 /* Set the Name attribute */
1979 Status
= SampSetObjectAttribute(AliasObject
,
1982 (LPVOID
)AccountName
->Buffer
,
1983 AccountName
->MaximumLength
);
1984 if (!NT_SUCCESS(Status
))
1986 TRACE("failed with status 0x%08lx\n", Status
);
1990 /* Set the Description attribute */
1991 Status
= SampSetObjectAttribute(AliasObject
,
1995 EmptyString
.MaximumLength
);
1996 if (!NT_SUCCESS(Status
))
1998 TRACE("failed with status 0x%08lx\n", Status
);
2002 if (NT_SUCCESS(Status
))
2004 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2005 *RelativeId
= ulRid
;
2008 TRACE("returns with status 0x%08lx\n", Status
);
2016 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2017 IN OUT
unsigned long *EnumerationContext
,
2018 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2019 IN
unsigned long PreferedMaximumLength
,
2020 OUT
unsigned long *CountReturned
)
2022 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2023 PSAM_DB_OBJECT DomainObject
;
2024 HANDLE AliasesKeyHandle
;
2025 WCHAR AliasKeyName
[64];
2026 HANDLE AliasKeyHandle
;
2029 ULONG RequiredLength
;
2032 BOOLEAN MoreEntries
= FALSE
;
2035 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2036 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
2039 /* Validate the domain handle */
2040 Status
= SampValidateDbObject(DomainHandle
,
2042 DOMAIN_LIST_ACCOUNTS
,
2044 if (!NT_SUCCESS(Status
))
2047 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2051 if (!NT_SUCCESS(Status
))
2056 EnumIndex
= *EnumerationContext
;
2062 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2066 if (!NT_SUCCESS(Status
))
2068 if (Status
== STATUS_NO_MORE_ENTRIES
)
2069 Status
= STATUS_SUCCESS
;
2073 TRACE("EnumIndex: %lu\n", EnumIndex
);
2074 TRACE("Alias key name: %S\n", AliasKeyName
);
2076 Status
= SampRegOpenKey(AliasesKeyHandle
,
2080 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2081 if (NT_SUCCESS(Status
))
2084 Status
= SampRegQueryValue(AliasKeyHandle
,
2090 NtClose(AliasKeyHandle
);
2092 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2094 if (NT_SUCCESS(Status
))
2096 TRACE("Data length: %lu\n", DataLength
);
2098 if ((RequiredLength
+ DataLength
+ sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2104 RequiredLength
+= (DataLength
+ sizeof(SAMPR_RID_ENUMERATION
));
2112 TRACE("EnumCount: %lu\n", EnumCount
);
2113 TRACE("RequiredLength: %lu\n", RequiredLength
);
2115 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2116 if (EnumBuffer
== NULL
)
2118 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2122 EnumBuffer
->EntriesRead
= EnumCount
;
2126 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2127 if (EnumBuffer
->Buffer
== NULL
)
2129 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2135 EnumIndex
= *EnumerationContext
;
2136 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2138 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2142 if (!NT_SUCCESS(Status
))
2144 if (Status
== STATUS_NO_MORE_ENTRIES
)
2145 Status
= STATUS_SUCCESS
;
2149 TRACE("EnumIndex: %lu\n", EnumIndex
);
2150 TRACE("Alias key name: %S\n", AliasKeyName
);
2152 Status
= SampRegOpenKey(AliasesKeyHandle
,
2156 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2157 if (NT_SUCCESS(Status
))
2160 Status
= SampRegQueryValue(AliasKeyHandle
,
2165 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2166 if (NT_SUCCESS(Status
))
2168 EnumBuffer
->Buffer
[i
].RelativeId
= wcstoul(AliasKeyName
, NULL
, 16);
2170 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
2171 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
2172 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
2173 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2175 NtClose(AliasKeyHandle
);
2176 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2180 Status
= SampRegQueryValue(AliasKeyHandle
,
2183 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2185 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2186 if (NT_SUCCESS(Status
))
2188 TRACE("Alias name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2192 NtClose(AliasKeyHandle
);
2194 if (!NT_SUCCESS(Status
))
2200 if (NT_SUCCESS(Status
))
2202 *EnumerationContext
+= EnumCount
;
2203 *Buffer
= EnumBuffer
;
2204 *CountReturned
= EnumCount
;
2207 if (!NT_SUCCESS(Status
))
2209 *EnumerationContext
= 0;
2213 if (EnumBuffer
!= NULL
)
2215 if (EnumBuffer
->Buffer
!= NULL
)
2217 if (EnumBuffer
->EntriesRead
!= 0)
2219 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2221 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2222 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2226 midl_user_free(EnumBuffer
->Buffer
);
2229 midl_user_free(EnumBuffer
);
2233 NtClose(AliasesKeyHandle
);
2235 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2236 Status
= STATUS_MORE_ENTRIES
;
2244 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2245 IN PSAMPR_PSID_ARRAY SidArray
,
2246 OUT PSAMPR_ULONG_ARRAY Membership
)
2248 PSAM_DB_OBJECT DomainObject
;
2249 HANDLE AliasesKeyHandle
= NULL
;
2250 HANDLE MembersKeyHandle
= NULL
;
2251 HANDLE MemberKeyHandle
= NULL
;
2252 LPWSTR MemberSidString
= NULL
;
2253 PULONG RidArray
= NULL
;
2254 ULONG MaxSidCount
= 0;
2260 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2261 DomainHandle
, SidArray
, Membership
);
2263 /* Validate the domain handle */
2264 Status
= SampValidateDbObject(DomainHandle
,
2268 if (!NT_SUCCESS(Status
))
2271 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2275 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2276 if (!NT_SUCCESS(Status
))
2279 Status
= SampRegOpenKey(AliasesKeyHandle
,
2283 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2284 if (!NT_SUCCESS(Status
))
2287 for (i
= 0; i
< SidArray
->Count
; i
++)
2289 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2290 TRACE("Open %S\n", MemberSidString
);
2292 Status
= SampRegOpenKey(MembersKeyHandle
,
2296 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2297 if (NT_SUCCESS(Status
))
2299 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2302 if (NT_SUCCESS(Status
))
2304 TRACE("Found %lu values\n", ValueCount
);
2305 MaxSidCount
+= ValueCount
;
2309 NtClose(MemberKeyHandle
);
2312 LocalFree(MemberSidString
);
2315 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2316 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2317 if (RidArray
== NULL
)
2319 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2323 for (i
= 0; i
< SidArray
->Count
; i
++)
2325 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2326 TRACE("Open %S\n", MemberSidString
);
2328 Status
= SampRegOpenKey(MembersKeyHandle
,
2332 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2333 if (NT_SUCCESS(Status
))
2335 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2338 if (NT_SUCCESS(Status
))
2340 TRACE("Found %lu values\n", ValueCount
);
2342 for (j
= 0; j
< ValueCount
; j
++)
2344 DataLength
= sizeof(ULONG
);
2345 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2350 (PVOID
)&RidArray
[j
],
2355 NtClose(MemberKeyHandle
);
2358 LocalFree(MemberSidString
);
2363 if (NT_SUCCESS(Status
))
2365 Membership
->Count
= MaxSidCount
;
2366 Membership
->Element
= RidArray
;
2370 if (RidArray
!= NULL
)
2371 midl_user_free(RidArray
);
2374 if (MembersKeyHandle
!= NULL
)
2375 NtClose(MembersKeyHandle
);
2377 if (MembersKeyHandle
!= NULL
)
2378 NtClose(MembersKeyHandle
);
2380 if (AliasesKeyHandle
!= NULL
)
2381 NtClose(AliasesKeyHandle
);
2389 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2390 IN
unsigned long Count
,
2391 IN RPC_UNICODE_STRING Names
[],
2392 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2393 OUT PSAMPR_ULONG_ARRAY Use
)
2396 return STATUS_NOT_IMPLEMENTED
;
2402 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
2403 IN
unsigned long Count
,
2404 IN
unsigned long *RelativeIds
,
2405 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
2406 OUT PSAMPR_ULONG_ARRAY Use
)
2409 return STATUS_NOT_IMPLEMENTED
;
2415 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
2416 IN ACCESS_MASK DesiredAccess
,
2417 IN
unsigned long GroupId
,
2418 OUT SAMPR_HANDLE
*GroupHandle
)
2421 return STATUS_NOT_IMPLEMENTED
;
2427 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2428 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2429 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2432 return STATUS_NOT_IMPLEMENTED
;
2438 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2439 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2440 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
2443 return STATUS_NOT_IMPLEMENTED
;
2449 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
2450 IN
unsigned long MemberId
,
2451 IN
unsigned long Attributes
)
2454 return STATUS_NOT_IMPLEMENTED
;
2460 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
2463 return STATUS_NOT_IMPLEMENTED
;
2469 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
2470 IN
unsigned long MemberId
)
2473 return STATUS_NOT_IMPLEMENTED
;
2479 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
2480 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
2483 return STATUS_NOT_IMPLEMENTED
;
2489 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
2490 IN
unsigned long MemberId
,
2491 IN
unsigned long Attributes
)
2494 return STATUS_NOT_IMPLEMENTED
;
2500 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
2501 IN ACCESS_MASK DesiredAccess
,
2503 OUT SAMPR_HANDLE
*AliasHandle
)
2505 PSAM_DB_OBJECT DomainObject
;
2506 PSAM_DB_OBJECT AliasObject
;
2510 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
2511 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
2513 /* Validate the domain handle */
2514 Status
= SampValidateDbObject(DomainHandle
,
2518 if (!NT_SUCCESS(Status
))
2520 TRACE("failed with status 0x%08lx\n", Status
);
2524 /* Convert the RID into a string (hex) */
2525 swprintf(szRid
, L
"%08lX", AliasId
);
2527 /* Create the alias object */
2528 Status
= SampOpenDbObject(DomainObject
,
2534 if (!NT_SUCCESS(Status
))
2536 TRACE("failed with status 0x%08lx\n", Status
);
2540 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2542 return STATUS_SUCCESS
;
2547 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
2548 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2550 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2551 HANDLE MembersKeyHandle
= NULL
;
2552 ULONG NameLength
= 0;
2553 ULONG DescriptionLength
= 0;
2558 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2559 if (InfoBuffer
== NULL
)
2560 return STATUS_INSUFFICIENT_RESOURCES
;
2562 Status
= SampGetObjectAttribute(AliasObject
,
2567 TRACE("Status 0x%08lx\n", Status
);
2568 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
2570 TRACE("Status 0x%08lx\n", Status
);
2574 InfoBuffer
->General
.Name
.Length
= NameLength
- sizeof(WCHAR
);
2575 InfoBuffer
->General
.Name
.MaximumLength
= NameLength
;
2576 InfoBuffer
->General
.Name
.Buffer
= midl_user_allocate(NameLength
);
2577 if (InfoBuffer
->General
.Name
.Buffer
== NULL
)
2579 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2583 TRACE("Name Length: %lu\n", NameLength
);
2584 Status
= SampGetObjectAttribute(AliasObject
,
2587 (PVOID
)InfoBuffer
->General
.Name
.Buffer
,
2589 if (!NT_SUCCESS(Status
))
2591 TRACE("Status 0x%08lx\n", Status
);
2595 Status
= SampGetObjectAttribute(AliasObject
,
2599 &DescriptionLength
);
2600 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
2602 TRACE("Status 0x%08lx\n", Status
);
2606 InfoBuffer
->General
.AdminComment
.Length
= DescriptionLength
- sizeof(WCHAR
);
2607 InfoBuffer
->General
.AdminComment
.MaximumLength
= DescriptionLength
;
2608 InfoBuffer
->General
.AdminComment
.Buffer
= midl_user_allocate(DescriptionLength
);
2609 if (InfoBuffer
->General
.AdminComment
.Buffer
== NULL
)
2611 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2615 TRACE("Description Length: %lu\n", DescriptionLength
);
2616 Status
= SampGetObjectAttribute(AliasObject
,
2619 (PVOID
)InfoBuffer
->General
.AdminComment
.Buffer
,
2620 &DescriptionLength
);
2621 if (!NT_SUCCESS(Status
))
2623 TRACE("Status 0x%08lx\n", Status
);
2627 /* Open the Members subkey */
2628 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
2632 if (!NT_SUCCESS(Status
))
2634 TRACE("Status 0x%08lx\n", Status
);
2638 /* Retrieve the number of members of the alias */
2639 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
2641 &InfoBuffer
->General
.MemberCount
);
2642 if (!NT_SUCCESS(Status
))
2644 TRACE("Status 0x%08lx\n", Status
);
2648 *Buffer
= InfoBuffer
;
2651 if (MembersKeyHandle
!= NULL
)
2652 SampRegCloseKey(MembersKeyHandle
);
2654 if (!NT_SUCCESS(Status
))
2656 if (InfoBuffer
!= NULL
)
2658 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
2659 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
2661 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
2662 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
2664 midl_user_free(InfoBuffer
);
2673 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
2674 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2676 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2682 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2683 if (InfoBuffer
== NULL
)
2684 return STATUS_INSUFFICIENT_RESOURCES
;
2686 Status
= SampGetObjectAttribute(AliasObject
,
2691 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
2693 TRACE("Status 0x%08lx\n", Status
);
2697 InfoBuffer
->Name
.Name
.Length
= Length
- sizeof(WCHAR
);
2698 InfoBuffer
->Name
.Name
.MaximumLength
= Length
;
2699 InfoBuffer
->Name
.Name
.Buffer
= midl_user_allocate(Length
);
2700 if (InfoBuffer
->Name
.Name
.Buffer
== NULL
)
2702 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2706 TRACE("Length: %lu\n", Length
);
2707 Status
= SampGetObjectAttribute(AliasObject
,
2710 (PVOID
)InfoBuffer
->Name
.Name
.Buffer
,
2712 if (!NT_SUCCESS(Status
))
2714 TRACE("Status 0x%08lx\n", Status
);
2718 *Buffer
= InfoBuffer
;
2721 if (!NT_SUCCESS(Status
))
2723 if (InfoBuffer
!= NULL
)
2725 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
2726 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
2728 midl_user_free(InfoBuffer
);
2737 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
2738 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2740 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2746 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2747 if (InfoBuffer
== NULL
)
2748 return STATUS_INSUFFICIENT_RESOURCES
;
2750 Status
= SampGetObjectAttribute(AliasObject
,
2755 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
2758 InfoBuffer
->AdminComment
.AdminComment
.Length
= Length
- sizeof(WCHAR
);
2759 InfoBuffer
->AdminComment
.AdminComment
.MaximumLength
= Length
;
2760 InfoBuffer
->AdminComment
.AdminComment
.Buffer
= midl_user_allocate(Length
);
2761 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
== NULL
)
2763 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2767 Status
= SampGetObjectAttribute(AliasObject
,
2770 (PVOID
)InfoBuffer
->AdminComment
.AdminComment
.Buffer
,
2772 if (!NT_SUCCESS(Status
))
2775 *Buffer
= InfoBuffer
;
2778 if (!NT_SUCCESS(Status
))
2780 if (InfoBuffer
!= NULL
)
2782 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
2783 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
2785 midl_user_free(InfoBuffer
);
2796 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
2797 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
2798 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2800 PSAM_DB_OBJECT AliasObject
;
2803 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
2804 AliasHandle
, AliasInformationClass
, Buffer
);
2806 /* Validate the alias handle */
2807 Status
= SampValidateDbObject(AliasHandle
,
2809 ALIAS_READ_INFORMATION
,
2811 if (!NT_SUCCESS(Status
))
2814 switch (AliasInformationClass
)
2816 case AliasGeneralInformation
:
2817 Status
= SampQueryAliasGeneral(AliasObject
,
2821 case AliasNameInformation
:
2822 Status
= SampQueryAliasName(AliasObject
,
2826 case AliasAdminCommentInformation
:
2827 Status
= SampQueryAliasAdminComment(AliasObject
,
2832 Status
= STATUS_INVALID_INFO_CLASS
;
2842 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
2843 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
2844 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
2846 PSAM_DB_OBJECT AliasObject
;
2849 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
2850 AliasHandle
, AliasInformationClass
, Buffer
);
2852 /* Validate the alias handle */
2853 Status
= SampValidateDbObject(AliasHandle
,
2855 ALIAS_WRITE_ACCOUNT
,
2857 if (!NT_SUCCESS(Status
))
2860 switch (AliasInformationClass
)
2862 case AliasNameInformation
:
2863 Status
= SampSetObjectAttribute(AliasObject
,
2866 Buffer
->Name
.Name
.Buffer
,
2867 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
2870 case AliasAdminCommentInformation
:
2871 Status
= SampSetObjectAttribute(AliasObject
,
2874 Buffer
->AdminComment
.AdminComment
.Buffer
,
2875 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
2879 Status
= STATUS_INVALID_INFO_CLASS
;
2889 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
2892 return STATUS_NOT_IMPLEMENTED
;
2898 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
2899 IN PRPC_SID MemberId
)
2901 PSAM_DB_OBJECT AliasObject
;
2902 LPWSTR MemberIdString
= NULL
;
2903 HANDLE MembersKeyHandle
= NULL
;
2904 HANDLE MemberKeyHandle
= NULL
;
2905 ULONG MemberIdLength
;
2908 TRACE("SamrAddMemberToAlias(%p %p)\n",
2909 AliasHandle
, MemberId
);
2911 /* Validate the domain handle */
2912 Status
= SampValidateDbObject(AliasHandle
,
2916 if (!NT_SUCCESS(Status
))
2918 TRACE("failed with status 0x%08lx\n", Status
);
2922 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
2923 TRACE("Member SID: %S\n", MemberIdString
);
2925 MemberIdLength
= RtlLengthSid(MemberId
);
2927 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
2931 if (!NT_SUCCESS(Status
))
2933 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
2937 Status
= SampRegSetValue(MembersKeyHandle
,
2942 if (!NT_SUCCESS(Status
))
2944 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
2948 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
2952 if (!NT_SUCCESS(Status
))
2954 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
2958 Status
= SampRegSetValue(MemberKeyHandle
,
2963 if (!NT_SUCCESS(Status
))
2965 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
2970 if (MemberKeyHandle
!= NULL
)
2971 SampRegCloseKey(MemberKeyHandle
);
2973 if (MembersKeyHandle
!= NULL
)
2974 SampRegCloseKey(MembersKeyHandle
);
2976 if (MemberIdString
!= NULL
)
2977 LocalFree(MemberIdString
);
2985 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
2986 IN PRPC_SID MemberId
)
2989 return STATUS_NOT_IMPLEMENTED
;
2995 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
2996 OUT PSAMPR_PSID_ARRAY_OUT Members
)
2998 PSAM_DB_OBJECT AliasObject
;
2999 HANDLE MembersKeyHandle
= NULL
;
3000 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
3001 ULONG ValueCount
= 0;
3006 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
3007 AliasHandle
, Members
);
3009 /* Validate the alias handle */
3010 Status
= SampValidateDbObject(AliasHandle
,
3014 if (!NT_SUCCESS(Status
))
3016 ERR("failed with status 0x%08lx\n", Status
);
3020 /* Open the members key of the alias objct */
3021 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3025 if (!NT_SUCCESS(Status
))
3027 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
3031 /* Get the number of members */
3032 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3035 if (!NT_SUCCESS(Status
))
3037 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
3041 /* Allocate the member array */
3042 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
3043 if (MemberArray
== NULL
)
3045 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3049 /* Enumerate the members */
3053 /* Get the size of the next SID */
3055 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3062 if (!NT_SUCCESS(Status
))
3064 if (Status
== STATUS_NO_MORE_ENTRIES
)
3065 Status
= STATUS_SUCCESS
;
3069 /* Allocate a buffer for the SID */
3070 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
3071 if (MemberArray
[Index
].SidPointer
== NULL
)
3073 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3077 /* Read the SID into the buffer */
3078 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3083 (PVOID
)MemberArray
[Index
].SidPointer
,
3085 if (!NT_SUCCESS(Status
))
3093 /* Return the number of members and the member array */
3094 if (NT_SUCCESS(Status
))
3096 Members
->Count
= ValueCount
;
3097 Members
->Sids
= MemberArray
;
3101 /* Clean up the members array and the SID buffers if something failed */
3102 if (!NT_SUCCESS(Status
))
3104 if (MemberArray
!= NULL
)
3106 for (Index
= 0; Index
< ValueCount
; Index
++)
3108 if (MemberArray
[Index
].SidPointer
!= NULL
)
3109 midl_user_free(MemberArray
[Index
].SidPointer
);
3112 midl_user_free(MemberArray
);
3116 /* Close the members key */
3117 if (MembersKeyHandle
!= NULL
)
3118 SampRegCloseKey(MembersKeyHandle
);
3126 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
3127 IN ACCESS_MASK DesiredAccess
,
3128 IN
unsigned long UserId
,
3129 OUT SAMPR_HANDLE
*UserHandle
)
3131 PSAM_DB_OBJECT DomainObject
;
3132 PSAM_DB_OBJECT UserObject
;
3136 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
3137 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
3139 /* Validate the domain handle */
3140 Status
= SampValidateDbObject(DomainHandle
,
3144 if (!NT_SUCCESS(Status
))
3146 TRACE("failed with status 0x%08lx\n", Status
);
3150 /* Convert the RID into a string (hex) */
3151 swprintf(szRid
, L
"%08lX", UserId
);
3153 /* Create the user object */
3154 Status
= SampOpenDbObject(DomainObject
,
3160 if (!NT_SUCCESS(Status
))
3162 TRACE("failed with status 0x%08lx\n", Status
);
3166 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
3168 return STATUS_SUCCESS
;
3174 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
3177 return STATUS_NOT_IMPLEMENTED
;
3183 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
3184 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3186 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3192 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3193 if (InfoBuffer
== NULL
)
3194 return STATUS_INSUFFICIENT_RESOURCES
;
3196 Status
= SampGetObjectAttribute(UserObject
,
3201 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3203 TRACE("Status 0x%08lx\n", Status
);
3207 InfoBuffer
->Name
.UserName
.Length
= Length
- sizeof(WCHAR
);
3208 InfoBuffer
->Name
.UserName
.MaximumLength
= Length
;
3209 InfoBuffer
->Name
.UserName
.Buffer
= midl_user_allocate(Length
);
3210 if (InfoBuffer
->Name
.UserName
.Buffer
== NULL
)
3212 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3216 TRACE("Length: %lu\n", Length
);
3217 Status
= SampGetObjectAttribute(UserObject
,
3220 (PVOID
)InfoBuffer
->Name
.UserName
.Buffer
,
3222 if (!NT_SUCCESS(Status
))
3224 TRACE("Status 0x%08lx\n", Status
);
3229 Status
= SampGetObjectAttribute(UserObject
,
3234 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3236 TRACE("Status 0x%08lx\n", Status
);
3240 InfoBuffer
->Name
.FullName
.Length
= Length
- sizeof(WCHAR
);
3241 InfoBuffer
->Name
.FullName
.MaximumLength
= Length
;
3242 InfoBuffer
->Name
.FullName
.Buffer
= midl_user_allocate(Length
);
3243 if (InfoBuffer
->Name
.FullName
.Buffer
== NULL
)
3245 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3249 TRACE("Length: %lu\n", Length
);
3250 Status
= SampGetObjectAttribute(UserObject
,
3253 (PVOID
)InfoBuffer
->Name
.FullName
.Buffer
,
3255 if (!NT_SUCCESS(Status
))
3257 TRACE("Status 0x%08lx\n", Status
);
3261 *Buffer
= InfoBuffer
;
3264 if (!NT_SUCCESS(Status
))
3266 if (InfoBuffer
!= NULL
)
3268 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
3269 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
3271 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
3272 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
3274 midl_user_free(InfoBuffer
);
3283 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
3284 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3286 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3292 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3293 if (InfoBuffer
== NULL
)
3294 return STATUS_INSUFFICIENT_RESOURCES
;
3296 Status
= SampGetObjectAttribute(UserObject
,
3301 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3303 TRACE("Status 0x%08lx\n", Status
);
3307 InfoBuffer
->AccountName
.UserName
.Length
= Length
- sizeof(WCHAR
);
3308 InfoBuffer
->AccountName
.UserName
.MaximumLength
= Length
;
3309 InfoBuffer
->AccountName
.UserName
.Buffer
= midl_user_allocate(Length
);
3310 if (InfoBuffer
->AccountName
.UserName
.Buffer
== NULL
)
3312 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3316 TRACE("Length: %lu\n", Length
);
3317 Status
= SampGetObjectAttribute(UserObject
,
3320 (PVOID
)InfoBuffer
->AccountName
.UserName
.Buffer
,
3322 if (!NT_SUCCESS(Status
))
3324 TRACE("Status 0x%08lx\n", Status
);
3328 *Buffer
= InfoBuffer
;
3331 if (!NT_SUCCESS(Status
))
3333 if (InfoBuffer
!= NULL
)
3335 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
3336 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
3338 midl_user_free(InfoBuffer
);
3347 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
3348 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3350 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3356 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3357 if (InfoBuffer
== NULL
)
3358 return STATUS_INSUFFICIENT_RESOURCES
;
3360 Status
= SampGetObjectAttribute(UserObject
,
3365 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3367 TRACE("Status 0x%08lx\n", Status
);
3371 InfoBuffer
->FullName
.FullName
.Length
= Length
- sizeof(WCHAR
);
3372 InfoBuffer
->FullName
.FullName
.MaximumLength
= Length
;
3373 InfoBuffer
->FullName
.FullName
.Buffer
= midl_user_allocate(Length
);
3374 if (InfoBuffer
->FullName
.FullName
.Buffer
== NULL
)
3376 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3380 TRACE("Length: %lu\n", Length
);
3381 Status
= SampGetObjectAttribute(UserObject
,
3384 (PVOID
)InfoBuffer
->FullName
.FullName
.Buffer
,
3386 if (!NT_SUCCESS(Status
))
3388 TRACE("Status 0x%08lx\n", Status
);
3392 *Buffer
= InfoBuffer
;
3395 if (!NT_SUCCESS(Status
))
3397 if (InfoBuffer
!= NULL
)
3399 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
3400 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
3402 midl_user_free(InfoBuffer
);
3412 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
3413 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3415 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3416 SAM_USER_FIXED_DATA FixedData
;
3422 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3423 if (InfoBuffer
== NULL
)
3424 return STATUS_INSUFFICIENT_RESOURCES
;
3426 Length
= sizeof(SAM_USER_FIXED_DATA
);
3427 Status
= SampGetObjectAttribute(UserObject
,
3432 if (!NT_SUCCESS(Status
))
3435 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3437 *Buffer
= InfoBuffer
;
3440 if (!NT_SUCCESS(Status
))
3442 if (InfoBuffer
!= NULL
)
3444 midl_user_free(InfoBuffer
);
3453 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
3454 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3456 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3462 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3463 if (InfoBuffer
== NULL
)
3464 return STATUS_INSUFFICIENT_RESOURCES
;
3466 Status
= SampGetObjectAttribute(UserObject
,
3471 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3473 TRACE("Status 0x%08lx\n", Status
);
3477 InfoBuffer
->Home
.HomeDirectory
.Length
= Length
- sizeof(WCHAR
);
3478 InfoBuffer
->Home
.HomeDirectory
.MaximumLength
= Length
;
3479 InfoBuffer
->Home
.HomeDirectory
.Buffer
= midl_user_allocate(Length
);
3480 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
== NULL
)
3482 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3486 TRACE("Length: %lu\n", Length
);
3487 Status
= SampGetObjectAttribute(UserObject
,
3490 (PVOID
)InfoBuffer
->Home
.HomeDirectory
.Buffer
,
3492 if (!NT_SUCCESS(Status
))
3494 TRACE("Status 0x%08lx\n", Status
);
3499 Status
= SampGetObjectAttribute(UserObject
,
3500 L
"HomeDirectoryDrive",
3504 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3506 TRACE("Status 0x%08lx\n", Status
);
3510 InfoBuffer
->Home
.HomeDirectoryDrive
.Length
= Length
- sizeof(WCHAR
);
3511 InfoBuffer
->Home
.HomeDirectoryDrive
.MaximumLength
= Length
;
3512 InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
= midl_user_allocate(Length
);
3513 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
== NULL
)
3515 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3519 TRACE("Length: %lu\n", Length
);
3520 Status
= SampGetObjectAttribute(UserObject
,
3521 L
"HomeDirectoryDrive",
3523 (PVOID
)InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
,
3525 if (!NT_SUCCESS(Status
))
3527 TRACE("Status 0x%08lx\n", Status
);
3531 *Buffer
= InfoBuffer
;
3534 if (!NT_SUCCESS(Status
))
3536 if (InfoBuffer
!= NULL
)
3538 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
3539 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
3541 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
3542 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
3544 midl_user_free(InfoBuffer
);
3553 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
3554 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3556 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3562 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3563 if (InfoBuffer
== NULL
)
3564 return STATUS_INSUFFICIENT_RESOURCES
;
3566 Status
= SampGetObjectAttribute(UserObject
,
3571 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3573 TRACE("Status 0x%08lx\n", Status
);
3577 InfoBuffer
->Script
.ScriptPath
.Length
= Length
- sizeof(WCHAR
);
3578 InfoBuffer
->Script
.ScriptPath
.MaximumLength
= Length
;
3579 InfoBuffer
->Script
.ScriptPath
.Buffer
= midl_user_allocate(Length
);
3580 if (InfoBuffer
->Script
.ScriptPath
.Buffer
== NULL
)
3582 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3586 TRACE("Length: %lu\n", Length
);
3587 Status
= SampGetObjectAttribute(UserObject
,
3590 (PVOID
)InfoBuffer
->Script
.ScriptPath
.Buffer
,
3592 if (!NT_SUCCESS(Status
))
3594 TRACE("Status 0x%08lx\n", Status
);
3598 *Buffer
= InfoBuffer
;
3601 if (!NT_SUCCESS(Status
))
3603 if (InfoBuffer
!= NULL
)
3605 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
3606 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
3608 midl_user_free(InfoBuffer
);
3617 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
3618 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3620 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3626 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3627 if (InfoBuffer
== NULL
)
3628 return STATUS_INSUFFICIENT_RESOURCES
;
3630 Status
= SampGetObjectAttribute(UserObject
,
3635 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3637 TRACE("Status 0x%08lx\n", Status
);
3641 InfoBuffer
->Profile
.ProfilePath
.Length
= Length
- sizeof(WCHAR
);
3642 InfoBuffer
->Profile
.ProfilePath
.MaximumLength
= Length
;
3643 InfoBuffer
->Profile
.ProfilePath
.Buffer
= midl_user_allocate(Length
);
3644 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
== NULL
)
3646 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3650 TRACE("Length: %lu\n", Length
);
3651 Status
= SampGetObjectAttribute(UserObject
,
3654 (PVOID
)InfoBuffer
->Profile
.ProfilePath
.Buffer
,
3656 if (!NT_SUCCESS(Status
))
3658 TRACE("Status 0x%08lx\n", Status
);
3662 *Buffer
= InfoBuffer
;
3665 if (!NT_SUCCESS(Status
))
3667 if (InfoBuffer
!= NULL
)
3669 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
3670 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
3672 midl_user_free(InfoBuffer
);
3681 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
3682 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3684 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3690 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3691 if (InfoBuffer
== NULL
)
3692 return STATUS_INSUFFICIENT_RESOURCES
;
3694 Status
= SampGetObjectAttribute(UserObject
,
3699 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3701 TRACE("Status 0x%08lx\n", Status
);
3705 InfoBuffer
->AdminComment
.AdminComment
.Length
= Length
- sizeof(WCHAR
);
3706 InfoBuffer
->AdminComment
.AdminComment
.MaximumLength
= Length
;
3707 InfoBuffer
->AdminComment
.AdminComment
.Buffer
= midl_user_allocate(Length
);
3708 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
== NULL
)
3710 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3714 TRACE("Length: %lu\n", Length
);
3715 Status
= SampGetObjectAttribute(UserObject
,
3718 (PVOID
)InfoBuffer
->AdminComment
.AdminComment
.Buffer
,
3720 if (!NT_SUCCESS(Status
))
3722 TRACE("Status 0x%08lx\n", Status
);
3726 *Buffer
= InfoBuffer
;
3729 if (!NT_SUCCESS(Status
))
3731 if (InfoBuffer
!= NULL
)
3733 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3734 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3736 midl_user_free(InfoBuffer
);
3746 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
3747 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3749 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3755 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3756 if (InfoBuffer
== NULL
)
3757 return STATUS_INSUFFICIENT_RESOURCES
;
3759 Status
= SampGetObjectAttribute(UserObject
,
3764 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
3766 TRACE("Status 0x%08lx\n", Status
);
3770 InfoBuffer
->WorkStations
.WorkStations
.Length
= Length
- sizeof(WCHAR
);
3771 InfoBuffer
->WorkStations
.WorkStations
.MaximumLength
= Length
;
3772 InfoBuffer
->WorkStations
.WorkStations
.Buffer
= midl_user_allocate(Length
);
3773 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
== NULL
)
3775 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3779 TRACE("Length: %lu\n", Length
);
3780 Status
= SampGetObjectAttribute(UserObject
,
3783 (PVOID
)InfoBuffer
->WorkStations
.WorkStations
.Buffer
,
3785 if (!NT_SUCCESS(Status
))
3787 TRACE("Status 0x%08lx\n", Status
);
3791 *Buffer
= InfoBuffer
;
3794 if (!NT_SUCCESS(Status
))
3796 if (InfoBuffer
!= NULL
)
3798 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
3799 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
3801 midl_user_free(InfoBuffer
);
3811 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
3812 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3814 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3815 SAM_USER_FIXED_DATA FixedData
;
3821 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3822 if (InfoBuffer
== NULL
)
3823 return STATUS_INSUFFICIENT_RESOURCES
;
3825 Length
= sizeof(SAM_USER_FIXED_DATA
);
3826 Status
= SampGetObjectAttribute(UserObject
,
3831 if (!NT_SUCCESS(Status
))
3834 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
3836 *Buffer
= InfoBuffer
;
3839 if (!NT_SUCCESS(Status
))
3841 if (InfoBuffer
!= NULL
)
3843 midl_user_free(InfoBuffer
);
3853 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
3854 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3856 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3857 SAM_USER_FIXED_DATA FixedData
;
3863 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3864 if (InfoBuffer
== NULL
)
3865 return STATUS_INSUFFICIENT_RESOURCES
;
3867 Length
= sizeof(SAM_USER_FIXED_DATA
);
3868 Status
= SampGetObjectAttribute(UserObject
,
3873 if (!NT_SUCCESS(Status
))
3876 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
3877 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
3879 *Buffer
= InfoBuffer
;
3882 if (!NT_SUCCESS(Status
))
3884 if (InfoBuffer
!= NULL
)
3886 midl_user_free(InfoBuffer
);
3897 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
3898 IN USER_INFORMATION_CLASS UserInformationClass
,
3899 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
3901 PSAM_DB_OBJECT UserObject
;
3902 ACCESS_MASK DesiredAccess
;
3905 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
3906 UserHandle
, UserInformationClass
, Buffer
);
3908 switch (UserInformationClass
)
3910 case UserGeneralInformation
:
3911 case UserNameInformation
:
3912 case UserAccountNameInformation
:
3913 case UserFullNameInformation
:
3914 case UserPrimaryGroupInformation
:
3915 case UserAdminCommentInformation
:
3916 DesiredAccess
= USER_READ_GENERAL
;
3919 case UserLogonHoursInformation
:
3920 case UserHomeInformation
:
3921 case UserScriptInformation
:
3922 case UserProfileInformation
:
3923 case UserWorkStationsInformation
:
3924 DesiredAccess
= USER_READ_LOGON
;
3927 case UserControlInformation
:
3928 case UserExpiresInformation
:
3929 DesiredAccess
= USER_READ_ACCOUNT
;
3932 case UserPreferencesInformation
:
3933 DesiredAccess
= USER_READ_GENERAL
|
3934 USER_READ_PREFERENCES
;
3937 case UserLogonInformation
:
3938 case UserAccountInformation
:
3939 DesiredAccess
= USER_READ_GENERAL
|
3940 USER_READ_PREFERENCES
|
3946 return STATUS_INVALID_INFO_CLASS
;
3949 /* Validate the domain handle */
3950 Status
= SampValidateDbObject(UserHandle
,
3954 if (!NT_SUCCESS(Status
))
3956 TRACE("failed with status 0x%08lx\n", Status
);
3960 switch (UserInformationClass
)
3962 // case UserGeneralInformation:
3963 // case UserPreferencesInformation:
3964 // case UserLogonInformation:
3965 // case UserLogonHoursInformation:
3966 // case UserAccountInformation:
3968 case UserNameInformation
:
3969 Status
= SampQueryUserName(UserObject
,
3973 case UserAccountNameInformation
:
3974 Status
= SampQueryUserAccountName(UserObject
,
3978 case UserFullNameInformation
:
3979 Status
= SampQueryUserFullName(UserObject
,
3983 case UserPrimaryGroupInformation
:
3984 Status
= SampQueryUserPrimaryGroup(UserObject
,
3988 case UserHomeInformation
:
3989 Status
= SampQueryUserHome(UserObject
,
3992 case UserScriptInformation
:
3993 Status
= SampQueryUserScript(UserObject
,
3997 case UserProfileInformation
:
3998 Status
= SampQueryUserProfile(UserObject
,
4002 case UserAdminCommentInformation
:
4003 Status
= SampQueryUserAdminComment(UserObject
,
4007 case UserWorkStationsInformation
:
4008 Status
= SampQueryUserWorkStations(UserObject
,
4012 case UserControlInformation
:
4013 Status
= SampQueryUserControl(UserObject
,
4017 case UserExpiresInformation
:
4018 Status
= SampQueryUserExpires(UserObject
,
4023 Status
= STATUS_INVALID_INFO_CLASS
;
4032 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
4033 IN USER_INFORMATION_CLASS UserInformationClass
,
4034 IN PSAMPR_USER_INFO_BUFFER Buffer
)
4036 PSAM_DB_OBJECT UserObject
;
4037 ACCESS_MASK DesiredAccess
;
4040 TRACE("SamrSetInformationUser(%p %lu %p)\n",
4041 UserHandle
, UserInformationClass
, Buffer
);
4043 switch (UserInformationClass
)
4045 case UserNameInformation
:
4046 case UserAccountNameInformation
:
4047 case UserFullNameInformation
:
4048 case UserPrimaryGroupInformation
:
4049 case UserHomeInformation
:
4050 case UserScriptInformation
:
4051 case UserProfileInformation
:
4052 case UserAdminCommentInformation
:
4053 case UserWorkStationsInformation
:
4054 case UserControlInformation
:
4055 case UserExpiresInformation
:
4056 DesiredAccess
= USER_WRITE_ACCOUNT
;
4059 case UserSetPasswordInformation
:
4060 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
4064 return STATUS_INVALID_INFO_CLASS
;
4067 /* Validate the domain handle */
4068 Status
= SampValidateDbObject(UserHandle
,
4072 if (!NT_SUCCESS(Status
))
4074 TRACE("failed with status 0x%08lx\n", Status
);
4078 switch (UserInformationClass
)
4080 // case UserGeneralInformation:
4081 // case UserPreferencesInformation:
4082 // case UserLogonHoursInformation:
4084 case UserNameInformation
:
4085 Status
= SampSetObjectAttribute(UserObject
,
4088 Buffer
->Name
.UserName
.Buffer
,
4089 Buffer
->Name
.UserName
.MaximumLength
);
4090 if (!NT_SUCCESS(Status
))
4093 Status
= SampSetObjectAttribute(UserObject
,
4096 Buffer
->Name
.FullName
.Buffer
,
4097 Buffer
->Name
.FullName
.MaximumLength
);
4100 case UserAccountNameInformation
:
4101 Status
= SampSetObjectAttribute(UserObject
,
4104 Buffer
->AccountName
.UserName
.Buffer
,
4105 Buffer
->AccountName
.UserName
.MaximumLength
);
4108 case UserFullNameInformation
:
4109 Status
= SampSetObjectAttribute(UserObject
,
4112 Buffer
->FullName
.FullName
.Buffer
,
4113 Buffer
->FullName
.FullName
.MaximumLength
);
4117 case UserPrimaryGroupInformation:
4118 Status = SampSetObjectAttribute(UserObject,
4121 &Buffer->PrimaryGroup.PrimaryGroupId,
4126 case UserHomeInformation
:
4127 Status
= SampSetObjectAttribute(UserObject
,
4130 Buffer
->Home
.HomeDirectory
.Buffer
,
4131 Buffer
->Home
.HomeDirectory
.MaximumLength
);
4132 if (!NT_SUCCESS(Status
))
4135 Status
= SampSetObjectAttribute(UserObject
,
4136 L
"HomeDirectoryDrive",
4138 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
4139 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
4142 case UserScriptInformation
:
4143 Status
= SampSetObjectAttribute(UserObject
,
4146 Buffer
->Script
.ScriptPath
.Buffer
,
4147 Buffer
->Script
.ScriptPath
.MaximumLength
);
4150 case UserProfileInformation
:
4151 Status
= SampSetObjectAttribute(UserObject
,
4154 Buffer
->Profile
.ProfilePath
.Buffer
,
4155 Buffer
->Profile
.ProfilePath
.MaximumLength
);
4158 case UserAdminCommentInformation
:
4159 Status
= SampSetObjectAttribute(UserObject
,
4162 Buffer
->AdminComment
.AdminComment
.Buffer
,
4163 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
4166 case UserWorkStationsInformation
:
4167 Status
= SampSetObjectAttribute(UserObject
,
4170 Buffer
->WorkStations
.WorkStations
.Buffer
,
4171 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
4174 case UserSetPasswordInformation
:
4175 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
4176 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
4178 Status
= SampSetObjectAttribute(UserObject
,
4181 Buffer
->SetPassword
.Password
.Buffer
,
4182 Buffer
->SetPassword
.Password
.MaximumLength
);
4186 case UserControlInformation:
4187 Status = SampSetObjectAttribute(UserObject,
4188 L"UserAccountControl",
4190 &Buffer->Control.UserAccountControl,
4195 case UserExpiresInformation:
4196 Status = SampSetObjectAttribute(UserObject,
4199 &Buffer->Expires.AccountExpires,
4200 sizeof(OLD_LARGE_INTEGER));
4204 // case UserInternal1Information:
4205 // case UserParametersInformation:
4206 // case UserAllInformation:
4207 // case UserInternal4Information:
4208 // case UserInternal5Information:
4209 // case UserInternal4InformationNew:
4210 // case UserInternal5InformationNew:
4213 Status
= STATUS_INVALID_INFO_CLASS
;
4222 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
4223 IN
unsigned char LmPresent
,
4224 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
4225 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
4226 IN
unsigned char NtPresent
,
4227 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
4228 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
4229 IN
unsigned char NtCrossEncryptionPresent
,
4230 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
4231 IN
unsigned char LmCrossEncryptionPresent
,
4232 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
4235 return STATUS_NOT_IMPLEMENTED
;
4241 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
4242 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
4245 return STATUS_NOT_IMPLEMENTED
;
4251 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
4252 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4253 IN
unsigned long Index
,
4254 IN
unsigned long EntryCount
,
4255 IN
unsigned long PreferredMaximumLength
,
4256 OUT
unsigned long *TotalAvailable
,
4257 OUT
unsigned long *TotalReturned
,
4258 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4261 return STATUS_NOT_IMPLEMENTED
;
4267 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
4268 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4269 IN PRPC_UNICODE_STRING Prefix
,
4270 OUT
unsigned long *Index
)
4273 return STATUS_NOT_IMPLEMENTED
;
4279 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
4282 return STATUS_NOT_IMPLEMENTED
;
4288 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
4291 return STATUS_NOT_IMPLEMENTED
;
4297 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
4298 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
4301 return STATUS_NOT_IMPLEMENTED
;
4307 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
4308 IN PRPC_SID MemberSid
)
4311 return STATUS_NOT_IMPLEMENTED
;
4317 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
4318 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
4319 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
4322 return STATUS_NOT_IMPLEMENTED
;
4328 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
4329 IN USER_INFORMATION_CLASS UserInformationClass
,
4330 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
4333 return STATUS_NOT_IMPLEMENTED
;
4339 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
4340 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4341 IN
unsigned long Index
,
4342 IN
unsigned long EntryCount
,
4343 IN
unsigned long PreferredMaximumLength
,
4344 OUT
unsigned long *TotalAvailable
,
4345 OUT
unsigned long *TotalReturned
,
4346 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4349 return STATUS_NOT_IMPLEMENTED
;
4355 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
4356 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4357 IN PRPC_UNICODE_STRING Prefix
,
4358 OUT
unsigned long *Index
)
4361 return STATUS_NOT_IMPLEMENTED
;
4367 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
4368 IN PRPC_UNICODE_STRING Name
,
4369 IN
unsigned long AccountType
,
4370 IN ACCESS_MASK DesiredAccess
,
4371 OUT SAMPR_HANDLE
*UserHandle
,
4372 OUT
unsigned long *GrantedAccess
,
4373 OUT
unsigned long *RelativeId
)
4376 return STATUS_NOT_IMPLEMENTED
;
4382 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
4383 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4384 IN
unsigned long Index
,
4385 IN
unsigned long EntryCount
,
4386 IN
unsigned long PreferredMaximumLength
,
4387 OUT
unsigned long *TotalAvailable
,
4388 OUT
unsigned long *TotalReturned
,
4389 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4392 return STATUS_NOT_IMPLEMENTED
;
4398 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
4399 IN PSAMPR_PSID_ARRAY MembersBuffer
)
4402 return STATUS_NOT_IMPLEMENTED
;
4408 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
4409 IN PSAMPR_PSID_ARRAY MembersBuffer
)
4412 return STATUS_NOT_IMPLEMENTED
;
4418 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
4419 IN PRPC_STRING ServerName
,
4420 IN PRPC_STRING UserName
,
4421 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
4422 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
4425 return STATUS_NOT_IMPLEMENTED
;
4431 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
4432 IN PRPC_UNICODE_STRING ServerName
,
4433 IN PRPC_UNICODE_STRING UserName
,
4434 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
4435 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
4436 IN
unsigned char LmPresent
,
4437 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
4438 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
4441 return STATUS_NOT_IMPLEMENTED
;
4447 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
4448 IN PRPC_UNICODE_STRING Unused
,
4449 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
4452 return STATUS_NOT_IMPLEMENTED
;
4458 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
4459 OUT SAMPR_HANDLE
*ServerHandle
,
4460 IN ACCESS_MASK DesiredAccess
)
4463 return STATUS_NOT_IMPLEMENTED
;
4469 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
4470 IN USER_INFORMATION_CLASS UserInformationClass
,
4471 IN PSAMPR_USER_INFO_BUFFER Buffer
)
4474 return STATUS_NOT_IMPLEMENTED
;
4480 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
4483 return STATUS_NOT_IMPLEMENTED
;
4489 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
4492 return STATUS_NOT_IMPLEMENTED
;
4498 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
4501 return STATUS_NOT_IMPLEMENTED
;
4507 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
4508 OUT SAMPR_HANDLE
*ServerHandle
,
4509 IN
unsigned long ClientRevision
,
4510 IN ACCESS_MASK DesiredAccess
)
4513 return STATUS_NOT_IMPLEMENTED
;
4519 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
4522 return STATUS_NOT_IMPLEMENTED
;
4528 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
4529 IN ACCESS_MASK DesiredAccess
,
4530 IN
unsigned long InVersion
,
4531 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
4532 OUT
unsigned long *OutVersion
,
4533 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
4534 OUT SAMPR_HANDLE
*ServerHandle
)
4537 return STATUS_NOT_IMPLEMENTED
;
4543 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
4544 IN
unsigned long Rid
,
4548 return STATUS_NOT_IMPLEMENTED
;
4554 SamrSetDSRMPassword(IN handle_t BindingHandle
,
4555 IN PRPC_UNICODE_STRING Unused
,
4556 IN
unsigned long UserId
,
4557 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
4560 return STATUS_NOT_IMPLEMENTED
;
4566 SamrValidatePassword(IN handle_t Handle
,
4567 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
4568 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
4569 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
4572 return STATUS_NOT_IMPLEMENTED
;