2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/lsasrv/authpackage.c
5 * PURPOSE: Authentication package management routines
6 * COPYRIGHT: Copyright 2013 Eric Kohl
11 #include <ndk/sefuncs.h>
12 #include <ndk/umfuncs.h>
14 typedef enum _LSA_TOKEN_INFORMATION_TYPE
16 LsaTokenInformationNull
,
18 } LSA_TOKEN_INFORMATION_TYPE
, *PLSA_TOKEN_INFORMATION_TYPE
;
20 typedef struct _LSA_TOKEN_INFORMATION_V1
22 LARGE_INTEGER ExpirationTime
;
25 TOKEN_PRIMARY_GROUP PrimaryGroup
;
26 PTOKEN_PRIVILEGES Privileges
;
28 TOKEN_DEFAULT_DACL DefaultDacl
;
29 } LSA_TOKEN_INFORMATION_V1
, *PLSA_TOKEN_INFORMATION_V1
;
31 typedef PVOID PLSA_CLIENT_REQUEST
;
33 typedef NTSTATUS (NTAPI
*PLSA_CREATE_LOGON_SESSION
)(PLUID
);
34 typedef NTSTATUS (NTAPI
*PLSA_DELETE_LOGON_SESSION
)(PLUID
);
35 typedef NTSTATUS (NTAPI
*PLSA_ADD_CREDENTIAL
)(PLUID
, ULONG
, PLSA_STRING
, PLSA_STRING
);
36 typedef NTSTATUS (NTAPI
*PLSA_GET_CREDENTIALS
)(PLUID
, ULONG
, PULONG
, BOOLEAN
, PLSA_STRING
, PULONG
, PLSA_STRING
);
37 typedef NTSTATUS (NTAPI
*PLSA_DELETE_CREDENTIAL
)(PLUID
, ULONG
, PLSA_STRING
);
38 typedef PVOID (NTAPI
*PLSA_ALLOCATE_LSA_HEAP
)(ULONG
);
39 typedef VOID (NTAPI
*PLSA_FREE_LSA_HEAP
)(PVOID
);
40 typedef NTSTATUS (NTAPI
*PLSA_ALLOCATE_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, ULONG
, PVOID
*);
41 typedef NTSTATUS (NTAPI
*PLSA_FREE_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, PVOID
);
42 typedef NTSTATUS (NTAPI
*PLSA_COPY_TO_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, ULONG
,
44 typedef NTSTATUS (NTAPI
*PLSA_COPY_FROM_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
,
47 typedef struct LSA_DISPATCH_TABLE
49 PLSA_CREATE_LOGON_SESSION CreateLogonSession
;
50 PLSA_DELETE_LOGON_SESSION DeleteLogonSession
;
51 PLSA_ADD_CREDENTIAL AddCredential
;
52 PLSA_GET_CREDENTIALS GetCredentials
;
53 PLSA_DELETE_CREDENTIAL DeleteCredential
;
54 PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap
;
55 PLSA_FREE_LSA_HEAP FreeLsaHeap
;
56 PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer
;
57 PLSA_FREE_CLIENT_BUFFER FreeClientBuffer
;
58 PLSA_COPY_TO_CLIENT_BUFFER CopyToClientBuffer
;
59 PLSA_COPY_FROM_CLIENT_BUFFER CopyFromClientBuffer
;
60 } LSA_DISPATCH_TABLE
, *PLSA_DISPATCH_TABLE
;
63 typedef NTSTATUS (NTAPI
*PLSA_AP_INITIALIZE_PACKAGE
)(ULONG
, PLSA_DISPATCH_TABLE
,
64 PLSA_STRING
, PLSA_STRING
, PLSA_STRING
*);
65 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_INTERNAL
)(PLSA_CLIENT_REQUEST
, PVOID
, PVOID
,
66 ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
67 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_PASSTHROUGH
)(PLSA_CLIENT_REQUEST
,
68 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
69 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_UNTRUSTED
)(PLSA_CLIENT_REQUEST
,
70 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
71 typedef VOID (NTAPI
*PLSA_AP_LOGON_TERMINATED
)(PLUID
);
72 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_EX2
)(PLSA_CLIENT_REQUEST
,
73 SECURITY_LOGON_TYPE
, PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
,
74 PLSA_TOKEN_INFORMATION_TYPE
, PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*,
75 PUNICODE_STRING
*, PVOID
/*PSECPKG_PRIMARY_CRED*/, PVOID
/*PSECPKG_SUPPLEMENTAL_CRED_ARRAY **/);
76 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_EX
)(PLSA_CLIENT_REQUEST
,
77 SECURITY_LOGON_TYPE
, PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
,
78 PLSA_TOKEN_INFORMATION_TYPE
, PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*,
81 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_INTERNAL
)(PLSA_CLIENT_REQUEST
, SECURITY_LOGON_TYPE
,
82 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
, PLSA_TOKEN_INFORMATION_TYPE
,
83 PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*);
85 typedef struct _AUTH_PACKAGE
92 PLSA_AP_INITIALIZE_PACKAGE LsaApInitializePackage
;
93 PLSA_AP_CALL_PACKAGE_INTERNAL LsaApCallPackage
;
94 PLSA_AP_CALL_PACKAGE_PASSTHROUGH LsaApCallPackagePassthrough
;
95 PLSA_AP_CALL_PACKAGE_UNTRUSTED LsaApCallPackageUntrusted
;
96 PLSA_AP_LOGON_TERMINATED LsaApLogonTerminated
;
97 PLSA_AP_LOGON_USER_EX2 LsaApLogonUserEx2
;
98 PLSA_AP_LOGON_USER_EX LsaApLogonUserEx
;
99 PLSA_AP_LOGON_USER_INTERNAL LsaApLogonUser
;
100 } AUTH_PACKAGE
, *PAUTH_PACKAGE
;
104 LsaIFree_LSAPR_PRIVILEGE_SET(IN PLSAPR_PRIVILEGE_SET Ptr
);
106 typedef wchar_t *PSAMPR_SERVER_NAME
;
107 typedef void *SAMPR_HANDLE
;
109 typedef struct _SAMPR_SID_INFORMATION
112 } SAMPR_SID_INFORMATION
, *PSAMPR_SID_INFORMATION
;
114 typedef struct _SAMPR_PSID_ARRAY
117 PSAMPR_SID_INFORMATION Sids
;
118 } SAMPR_PSID_ARRAY
, *PSAMPR_PSID_ARRAY
;
123 PSAMPR_SERVER_NAME ServerName
,
124 SAMPR_HANDLE
*ServerHandle
,
125 ACCESS_MASK DesiredAccess
,
130 SamIFree_SAMPR_ULONG_ARRAY(
131 PSAMPR_ULONG_ARRAY Ptr
);
136 SAMPR_HANDLE
*SamHandle
);
141 SAMPR_HANDLE ServerHandle
,
142 ACCESS_MASK DesiredAccess
,
144 SAMPR_HANDLE
*DomainHandle
);
148 SamrGetAliasMembership(
149 SAMPR_HANDLE DomainHandle
,
150 PSAMPR_PSID_ARRAY SidArray
,
151 PSAMPR_ULONG_ARRAY Membership
);
154 /* GLOBALS *****************************************************************/
156 static LIST_ENTRY PackageListHead
;
157 static ULONG PackageId
;
158 static LSA_DISPATCH_TABLE DispatchTable
;
160 #define CONST_LUID(x1, x2) {x1, x2}
161 static const LUID SeChangeNotifyPrivilege
= CONST_LUID(SE_CHANGE_NOTIFY_PRIVILEGE
, 0);
162 static const LUID SeCreateGlobalPrivilege
= CONST_LUID(SE_CREATE_GLOBAL_PRIVILEGE
, 0);
163 static const LUID SeImpersonatePrivilege
= CONST_LUID(SE_IMPERSONATE_PRIVILEGE
, 0);
166 /* FUNCTIONS ***************************************************************/
171 LsapAddAuthPackage(IN PWSTR ValueName
,
174 IN ULONG ValueLength
,
176 IN PVOID EntryContext
)
178 PAUTH_PACKAGE Package
= NULL
;
179 UNICODE_STRING PackageName
;
182 NTSTATUS Status
= STATUS_SUCCESS
;
184 TRACE("LsapAddAuthPackage()\n");
186 PackageName
.Length
= (USHORT
)ValueLength
- sizeof(WCHAR
);
187 PackageName
.MaximumLength
= (USHORT
)ValueLength
;
188 PackageName
.Buffer
= ValueData
;
190 Id
= (PULONG
)Context
;
192 Package
= RtlAllocateHeap(RtlGetProcessHeap(),
194 sizeof(AUTH_PACKAGE
));
196 return STATUS_INSUFFICIENT_RESOURCES
;
198 Status
= LdrLoadDll(NULL
,
201 &Package
->ModuleHandle
);
202 if (!NT_SUCCESS(Status
))
204 TRACE("LdrLoadDll failed (Status 0x%08lx)\n", Status
);
208 RtlInitAnsiString(&ProcName
, "LsaApInitializePackage");
209 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
212 (PVOID
*)&Package
->LsaApInitializePackage
);
213 if (!NT_SUCCESS(Status
))
215 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
219 RtlInitAnsiString(&ProcName
, "LsaApCallPackage");
220 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
223 (PVOID
*)&Package
->LsaApCallPackage
);
224 if (!NT_SUCCESS(Status
))
226 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
230 RtlInitAnsiString(&ProcName
, "LsaApCallPackagePassthrough");
231 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
234 (PVOID
*)&Package
->LsaApCallPackagePassthrough
);
235 if (!NT_SUCCESS(Status
))
237 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
241 RtlInitAnsiString(&ProcName
, "LsaApCallPackageUntrusted");
242 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
245 (PVOID
*)&Package
->LsaApCallPackageUntrusted
);
246 if (!NT_SUCCESS(Status
))
248 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
252 RtlInitAnsiString(&ProcName
, "LsaApLogonTerminated");
253 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
256 (PVOID
*)&Package
->LsaApLogonTerminated
);
257 if (!NT_SUCCESS(Status
))
259 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
263 RtlInitAnsiString(&ProcName
, "LsaApLogonUserEx2");
264 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
267 (PVOID
*)&Package
->LsaApLogonUserEx2
);
268 if (!NT_SUCCESS(Status
))
270 RtlInitAnsiString(&ProcName
, "LsaApLogonUserEx");
271 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
274 (PVOID
*)&Package
->LsaApLogonUserEx
);
275 if (!NT_SUCCESS(Status
))
277 RtlInitAnsiString(&ProcName
, "LsaApLogonUser");
278 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
281 (PVOID
*)&Package
->LsaApLogonUser
);
282 if (!NT_SUCCESS(Status
))
284 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
290 /* Initialize the current package */
291 Status
= Package
->LsaApInitializePackage(*Id
,
296 if (!NT_SUCCESS(Status
))
298 TRACE("Package->LsaApInitializePackage() failed (Status 0x%08lx)\n", Status
);
302 TRACE("Package Name: %s\n", Package
->Name
->Buffer
);
307 InsertTailList(&PackageListHead
, &Package
->Entry
);
310 if (!NT_SUCCESS(Status
))
314 if (Package
->ModuleHandle
!= NULL
)
315 LdrUnloadDll(Package
->ModuleHandle
);
317 if (Package
->Name
!= NULL
)
319 if (Package
->Name
->Buffer
!= NULL
)
320 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
->Name
->Buffer
);
322 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
->Name
);
325 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
);
335 LsapGetAuthenticationPackage(IN ULONG PackageId
)
337 PLIST_ENTRY ListEntry
;
338 PAUTH_PACKAGE Package
;
340 ListEntry
= PackageListHead
.Flink
;
341 while (ListEntry
!= &PackageListHead
)
343 Package
= CONTAINING_RECORD(ListEntry
, AUTH_PACKAGE
, Entry
);
345 if (Package
->Id
== PackageId
)
350 ListEntry
= ListEntry
->Flink
;
359 LsapAllocateHeap(IN ULONG Length
)
361 return RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
367 LsapAllocateHeapZero(IN ULONG Length
)
369 return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
375 LsapFreeHeap(IN PVOID Base
)
377 RtlFreeHeap(RtlGetProcessHeap(), 0, Base
);
384 LsapAllocateClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
385 IN ULONG LengthRequired
,
386 OUT PVOID
*ClientBaseAddress
)
388 PLSAP_LOGON_CONTEXT LogonContext
;
391 *ClientBaseAddress
= NULL
;
393 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
395 Length
= LengthRequired
;
396 return NtAllocateVirtualMemory(LogonContext
->ClientProcessHandle
,
408 LsapFreeClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
409 IN PVOID ClientBaseAddress
)
411 PLSAP_LOGON_CONTEXT LogonContext
;
414 if (ClientBaseAddress
== NULL
)
415 return STATUS_SUCCESS
;
417 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
420 return NtFreeVirtualMemory(LogonContext
->ClientProcessHandle
,
430 LsapCopyToClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
432 IN PVOID ClientBaseAddress
,
433 IN PVOID BufferToCopy
)
435 PLSAP_LOGON_CONTEXT LogonContext
;
437 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
439 return NtWriteVirtualMemory(LogonContext
->ClientProcessHandle
,
450 LsapCopyFromClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
452 IN PVOID BufferToCopy
,
453 IN PVOID ClientBaseAddress
)
455 PLSAP_LOGON_CONTEXT LogonContext
;
457 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
459 return NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
468 LsapInitAuthPackages(VOID
)
470 RTL_QUERY_REGISTRY_TABLE AuthPackageTable
[] = {
471 {LsapAddAuthPackage
, 0, L
"Authentication Packages", NULL
, REG_NONE
, NULL
, 0},
472 {NULL
, 0, NULL
, NULL
, REG_NONE
, NULL
, 0}};
476 InitializeListHead(&PackageListHead
);
479 /* Initialize the dispatch table */
480 DispatchTable
.CreateLogonSession
= &LsapCreateLogonSession
;
481 DispatchTable
.DeleteLogonSession
= &LsapDeleteLogonSession
;
482 DispatchTable
.AddCredential
= &LsapAddCredential
;
483 DispatchTable
.GetCredentials
= &LsapGetCredentials
;
484 DispatchTable
.DeleteCredential
= &LsapDeleteCredential
;
485 DispatchTable
.AllocateLsaHeap
= &LsapAllocateHeapZero
;
486 DispatchTable
.FreeLsaHeap
= &LsapFreeHeap
;
487 DispatchTable
.AllocateClientBuffer
= &LsapAllocateClientBuffer
;
488 DispatchTable
.FreeClientBuffer
= &LsapFreeClientBuffer
;
489 DispatchTable
.CopyToClientBuffer
= &LsapCopyToClientBuffer
;
490 DispatchTable
.CopyFromClientBuffer
= &LsapCopyFromClientBuffer
;
492 /* Add registered authentication packages */
493 Status
= RtlQueryRegistryValues(RTL_REGISTRY_CONTROL
,
504 LsapLookupAuthenticationPackage(PLSA_API_MSG RequestMsg
,
505 PLSAP_LOGON_CONTEXT LogonContext
)
507 PLIST_ENTRY ListEntry
;
508 PAUTH_PACKAGE Package
;
509 ULONG PackageNameLength
;
512 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
514 PackageNameLength
= RequestMsg
->LookupAuthenticationPackage
.Request
.PackageNameLength
;
515 PackageName
= RequestMsg
->LookupAuthenticationPackage
.Request
.PackageName
;
517 TRACE("PackageName: %s\n", PackageName
);
519 ListEntry
= PackageListHead
.Flink
;
520 while (ListEntry
!= &PackageListHead
)
522 Package
= CONTAINING_RECORD(ListEntry
, AUTH_PACKAGE
, Entry
);
524 if ((PackageNameLength
== Package
->Name
->Length
) &&
525 (_strnicmp(PackageName
, Package
->Name
->Buffer
, Package
->Name
->Length
) == 0))
527 RequestMsg
->LookupAuthenticationPackage
.Reply
.Package
= Package
->Id
;
528 return STATUS_SUCCESS
;
531 ListEntry
= ListEntry
->Flink
;
534 return STATUS_NO_SUCH_PACKAGE
;
539 LsapCallAuthenticationPackage(PLSA_API_MSG RequestMsg
,
540 PLSAP_LOGON_CONTEXT LogonContext
)
542 PAUTH_PACKAGE Package
;
543 PVOID LocalBuffer
= NULL
;
547 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
549 PackageId
= RequestMsg
->CallAuthenticationPackage
.Request
.AuthenticationPackage
;
551 /* Get the right authentication package */
552 Package
= LsapGetAuthenticationPackage(PackageId
);
555 TRACE("LsapGetAuthenticationPackage() failed to find a package\n");
556 return STATUS_NO_SUCH_PACKAGE
;
559 if (RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
> 0)
561 LocalBuffer
= RtlAllocateHeap(RtlGetProcessHeap(),
563 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
);
564 if (LocalBuffer
== NULL
)
566 return STATUS_INSUFFICIENT_RESOURCES
;
569 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
570 RequestMsg
->CallAuthenticationPackage
.Request
.ProtocolSubmitBuffer
,
572 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
,
574 if (!NT_SUCCESS(Status
))
576 TRACE("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status
);
577 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer
);
582 Status
= Package
->LsaApCallPackage((PLSA_CLIENT_REQUEST
)LogonContext
,
584 RequestMsg
->CallAuthenticationPackage
.Request
.ProtocolSubmitBuffer
,
585 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
,
586 &RequestMsg
->CallAuthenticationPackage
.Reply
.ProtocolReturnBuffer
,
587 &RequestMsg
->CallAuthenticationPackage
.Reply
.ReturnBufferLength
,
588 &RequestMsg
->CallAuthenticationPackage
.Reply
.ProtocolStatus
);
589 if (!NT_SUCCESS(Status
))
591 TRACE("Package->LsaApCallPackage() failed (Status 0x%08lx)\n", Status
);
594 if (LocalBuffer
!= NULL
)
595 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer
);
604 IN PLSAP_LOGON_CONTEXT LogonContext
,
605 IN PTOKEN_GROUPS ClientGroups
,
606 IN ULONG ClientGroupsCount
,
607 OUT PTOKEN_GROUPS
*TokenGroups
)
609 ULONG LocalGroupsLength
= 0;
610 PTOKEN_GROUPS LocalGroups
= NULL
;
611 ULONG SidHeaderLength
= 0;
612 PSID SidHeader
= NULL
;
615 ULONG AllocatedSids
= 0;
619 LocalGroupsLength
= sizeof(TOKEN_GROUPS
) +
620 (ClientGroupsCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
621 LocalGroups
= RtlAllocateHeap(RtlGetProcessHeap(),
624 if (LocalGroups
== NULL
)
626 TRACE("RtlAllocateHeap() failed\n");
627 return STATUS_INSUFFICIENT_RESOURCES
;
630 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
635 if (!NT_SUCCESS(Status
))
639 SidHeaderLength
= RtlLengthRequiredSid(0);
640 SidHeader
= RtlAllocateHeap(RtlGetProcessHeap(),
643 if (SidHeader
== NULL
)
645 Status
= STATUS_INSUFFICIENT_RESOURCES
;
649 for (i
= 0; i
< ClientGroupsCount
; i
++)
651 SrcSid
= LocalGroups
->Groups
[i
].Sid
;
653 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
658 if (!NT_SUCCESS(Status
))
661 SidLength
= RtlLengthSid(SidHeader
);
662 TRACE("Sid %lu: Length %lu\n", i
, SidLength
);
664 DstSid
= RtlAllocateHeap(RtlGetProcessHeap(),
669 Status
= STATUS_INSUFFICIENT_RESOURCES
;
673 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
678 if (!NT_SUCCESS(Status
))
680 RtlFreeHeap(RtlGetProcessHeap(), 0, DstSid
);
684 LocalGroups
->Groups
[i
].Sid
= DstSid
;
688 *TokenGroups
= LocalGroups
;
691 if (SidHeader
!= NULL
)
692 RtlFreeHeap(RtlGetProcessHeap(), 0, SidHeader
);
694 if (!NT_SUCCESS(Status
))
696 if (LocalGroups
!= NULL
)
698 for (i
= 0; i
< AllocatedSids
; i
++)
699 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
->Groups
[i
].Sid
);
701 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
);
712 IN PVOID TokenInformation
,
713 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
714 IN PTOKEN_GROUPS LocalGroups
)
716 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
717 PTOKEN_GROUPS Groups
;
722 if (LocalGroups
== NULL
|| LocalGroups
->GroupCount
== 0)
723 return STATUS_SUCCESS
;
725 if (TokenInformationType
== LsaTokenInformationV1
)
727 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
729 if (TokenInfo1
->Groups
!= NULL
)
731 Length
= sizeof(TOKEN_GROUPS
) +
732 (LocalGroups
->GroupCount
+ TokenInfo1
->Groups
->GroupCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
734 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
737 ERR("Group buffer allocation failed!\n");
738 return STATUS_INSUFFICIENT_RESOURCES
;
741 Groups
->GroupCount
= LocalGroups
->GroupCount
+ TokenInfo1
->Groups
->GroupCount
;
743 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
745 Groups
->Groups
[i
].Sid
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
746 Groups
->Groups
[i
].Attributes
= TokenInfo1
->Groups
->Groups
[i
].Attributes
;
749 for (j
= 0; j
< LocalGroups
->GroupCount
; i
++, j
++)
751 Groups
->Groups
[i
].Sid
= LocalGroups
->Groups
[j
].Sid
;
752 Groups
->Groups
[i
].Attributes
= LocalGroups
->Groups
[j
].Attributes
;
753 LocalGroups
->Groups
[j
].Sid
= NULL
;
756 RtlFreeHeap(RtlGetProcessHeap(), 0, TokenInfo1
->Groups
);
758 TokenInfo1
->Groups
= Groups
;
762 Length
= sizeof(TOKEN_GROUPS
) +
763 (LocalGroups
->GroupCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
765 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
768 ERR("Group buffer allocation failed!\n");
769 return STATUS_INSUFFICIENT_RESOURCES
;
772 Groups
->GroupCount
= LocalGroups
->GroupCount
;
774 for (i
= 0; i
< LocalGroups
->GroupCount
; i
++)
776 Groups
->Groups
[i
].Sid
= LocalGroups
->Groups
[i
].Sid
;
777 Groups
->Groups
[i
].Attributes
= LocalGroups
->Groups
[i
].Attributes
;
780 TokenInfo1
->Groups
= Groups
;
785 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
786 return STATUS_NOT_IMPLEMENTED
;
789 return STATUS_SUCCESS
;
794 LsapAddDefaultGroups(
795 IN PVOID TokenInformation
,
796 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
797 IN SECURITY_LOGON_TYPE LogonType
)
799 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
800 PTOKEN_GROUPS Groups
;
804 if (TokenInformationType
== LsaTokenInformationV1
)
806 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
808 if (TokenInfo1
->Groups
!= NULL
)
810 Length
= sizeof(TOKEN_GROUPS
) +
811 (TokenInfo1
->Groups
->GroupCount
+ 2 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
813 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
816 ERR("Group buffer allocation failed!\n");
817 return STATUS_INSUFFICIENT_RESOURCES
;
820 Groups
->GroupCount
= TokenInfo1
->Groups
->GroupCount
;
822 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
824 Groups
->Groups
[i
].Sid
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
825 Groups
->Groups
[i
].Attributes
= TokenInfo1
->Groups
->Groups
[i
].Attributes
;
828 RtlFreeHeap(RtlGetProcessHeap(), 0, TokenInfo1
->Groups
);
830 TokenInfo1
->Groups
= Groups
;
835 Length
= sizeof(TOKEN_GROUPS
) +
836 (2 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
838 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
841 ERR("Group buffer allocation failed!\n");
842 return STATUS_INSUFFICIENT_RESOURCES
;
845 TokenInfo1
->Groups
= Groups
;
848 /* Append the World SID (aka Everyone) */
849 Length
= RtlLengthSid(LsapWorldSid
);
850 Groups
->Groups
[Groups
->GroupCount
].Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
853 if (Groups
->Groups
[Groups
->GroupCount
].Sid
== NULL
)
854 return STATUS_INSUFFICIENT_RESOURCES
;
856 RtlCopyMemory(Groups
->Groups
[Groups
->GroupCount
].Sid
,
860 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
861 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
863 Groups
->GroupCount
++;
865 /* Append the logon type SID */
869 SrcSid
= LsapInteractiveSid
;
873 SrcSid
= LsapNetworkSid
;
877 SrcSid
= LsapBatchSid
;
881 SrcSid
= LsapServiceSid
;
885 FIXME("LogonType %d is not supported!\n", LogonType
);
886 return STATUS_NOT_IMPLEMENTED
;
889 Length
= RtlLengthSid(SrcSid
);
890 Groups
->Groups
[Groups
->GroupCount
].Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
893 if (Groups
->Groups
[Groups
->GroupCount
].Sid
== NULL
)
894 return STATUS_INSUFFICIENT_RESOURCES
;
896 RtlCopyMemory(Groups
->Groups
[Groups
->GroupCount
].Sid
,
900 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
901 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
903 Groups
->GroupCount
++;
907 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
908 return STATUS_NOT_IMPLEMENTED
;
911 return STATUS_SUCCESS
;
917 LsapAppendSidToGroups(
918 IN PTOKEN_GROUPS
*TokenGroups
,
922 PTOKEN_GROUPS Groups
;
927 Sid
= LsapAppendRidToSid(DomainSid
, RelativeId
);
930 ERR("Group SID creation failed!\n");
931 return STATUS_INSUFFICIENT_RESOURCES
;
934 if (*TokenGroups
== NULL
)
936 Length
= sizeof(TOKEN_GROUPS
) +
937 (1 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
939 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
942 ERR("Group buffer allocation failed!\n");
943 return STATUS_INSUFFICIENT_RESOURCES
;
946 Groups
->GroupCount
= 1;
948 Groups
->Groups
[0].Sid
= Sid
;
949 Groups
->Groups
[0].Attributes
=
950 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
952 *TokenGroups
= Groups
;
956 for (i
= 0; i
< (*TokenGroups
)->GroupCount
; i
++)
958 if (RtlEqualSid((*TokenGroups
)->Groups
[i
].Sid
, Sid
))
960 RtlFreeHeap(RtlGetProcessHeap(), 0, Sid
);
961 return STATUS_SUCCESS
;
965 Length
= sizeof(TOKEN_GROUPS
) +
966 ((*TokenGroups
)->GroupCount
+ 1 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
968 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
971 ERR("Group buffer allocation failed!\n");
972 return STATUS_INSUFFICIENT_RESOURCES
;
975 Groups
->GroupCount
= (*TokenGroups
)->GroupCount
;
977 for (i
= 0; i
< (*TokenGroups
)->GroupCount
; i
++)
979 Groups
->Groups
[i
].Sid
= (*TokenGroups
)->Groups
[i
].Sid
;
980 Groups
->Groups
[i
].Attributes
= (*TokenGroups
)->Groups
[i
].Attributes
;
983 Groups
->Groups
[Groups
->GroupCount
].Sid
= Sid
;
984 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
985 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
987 Groups
->GroupCount
++;
989 RtlFreeHeap(RtlGetProcessHeap(), 0, *TokenGroups
);
991 *TokenGroups
= Groups
;
994 return STATUS_SUCCESS
;
1001 IN PVOID TokenInformation
,
1002 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1004 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1005 SAMPR_HANDLE ServerHandle
= NULL
;
1006 SAMPR_HANDLE BuiltinDomainHandle
= NULL
;
1007 SAMPR_HANDLE AccountDomainHandle
= NULL
;
1008 SAMPR_PSID_ARRAY SidArray
;
1009 SAMPR_ULONG_ARRAY BuiltinMembership
;
1010 SAMPR_ULONG_ARRAY AccountMembership
;
1012 NTSTATUS Status
= STATUS_SUCCESS
;
1014 if (TokenInformationType
!= LsaTokenInformationV1
)
1015 return STATUS_SUCCESS
;
1017 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1019 SidArray
.Count
= TokenInfo1
->Groups
->GroupCount
+ 1;
1020 SidArray
.Sids
= RtlAllocateHeap(RtlGetProcessHeap(),
1022 (TokenInfo1
->Groups
->GroupCount
+ 1) * sizeof(PRPC_SID
));
1023 if (SidArray
.Sids
== NULL
)
1024 return STATUS_INSUFFICIENT_RESOURCES
;
1026 SidArray
.Sids
[0].SidPointer
= TokenInfo1
->User
.User
.Sid
;
1027 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1028 SidArray
.Sids
[i
+ 1].SidPointer
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
1030 BuiltinMembership
.Element
= NULL
;
1031 AccountMembership
.Element
= NULL
;
1033 Status
= SamIConnect(NULL
,
1035 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1037 if (!NT_SUCCESS(Status
))
1039 TRACE("SamIConnect failed (Status %08lx)\n", Status
);
1043 Status
= SamrOpenDomain(ServerHandle
,
1044 DOMAIN_GET_ALIAS_MEMBERSHIP
,
1046 &BuiltinDomainHandle
);
1047 if (!NT_SUCCESS(Status
))
1049 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status
);
1053 Status
= SamrOpenDomain(ServerHandle
,
1054 DOMAIN_GET_ALIAS_MEMBERSHIP
,
1056 &AccountDomainHandle
);
1057 if (!NT_SUCCESS(Status
))
1059 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status
);
1063 Status
= SamrGetAliasMembership(BuiltinDomainHandle
,
1065 &BuiltinMembership
);
1066 if (!NT_SUCCESS(Status
))
1068 TRACE("SamrGetAliasMembership failed (Status %08lx)\n", Status
);
1072 Status
= SamrGetAliasMembership(AccountDomainHandle
,
1074 &AccountMembership
);
1075 if (!NT_SUCCESS(Status
))
1077 TRACE("SamrGetAliasMembership failed (Status %08lx)\n", Status
);
1081 TRACE("Builtin Memberships: %lu\n", BuiltinMembership
.Count
);
1082 for (i
= 0; i
< BuiltinMembership
.Count
; i
++)
1084 TRACE("RID %lu: %lu (0x%lx)\n", i
, BuiltinMembership
.Element
[i
], BuiltinMembership
.Element
[i
]);
1085 Status
= LsapAppendSidToGroups(&TokenInfo1
->Groups
,
1087 BuiltinMembership
.Element
[i
]);
1088 if (!NT_SUCCESS(Status
))
1090 TRACE("LsapAppendSidToGroups failed (Status %08lx)\n", Status
);
1095 TRACE("Account Memberships: %lu\n", AccountMembership
.Count
);
1096 for (i
= 0; i
< AccountMembership
.Count
; i
++)
1098 TRACE("RID %lu: %lu (0x%lx)\n", i
, AccountMembership
.Element
[i
], AccountMembership
.Element
[i
]);
1099 Status
= LsapAppendSidToGroups(&TokenInfo1
->Groups
,
1101 AccountMembership
.Element
[i
]);
1102 if (!NT_SUCCESS(Status
))
1104 TRACE("LsapAppendSidToGroups failed (Status %08lx)\n", Status
);
1110 RtlFreeHeap(RtlGetProcessHeap(), 0, SidArray
.Sids
);
1112 if (AccountMembership
.Element
!= NULL
)
1113 SamIFree_SAMPR_ULONG_ARRAY(&AccountMembership
);
1115 if (BuiltinMembership
.Element
!= NULL
)
1116 SamIFree_SAMPR_ULONG_ARRAY(&BuiltinMembership
);
1118 if (AccountDomainHandle
!= NULL
)
1119 SamrCloseHandle(&AccountDomainHandle
);
1121 if (BuiltinDomainHandle
!= NULL
)
1122 SamrCloseHandle(&BuiltinDomainHandle
);
1124 if (ServerHandle
!= NULL
)
1125 SamrCloseHandle(&ServerHandle
);
1129 return STATUS_SUCCESS
;
1136 IN PVOID TokenInformation
,
1137 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1139 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1140 PSID_AND_ATTRIBUTES OwnerSid
= NULL
;
1143 if (TokenInformationType
== LsaTokenInformationV1
)
1145 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1147 if (TokenInfo1
->Owner
.Owner
!= NULL
)
1148 return STATUS_SUCCESS
;
1150 OwnerSid
= &TokenInfo1
->User
.User
;
1151 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1153 if (EqualSid(TokenInfo1
->Groups
->Groups
[i
].Sid
, LsapAdministratorsSid
))
1155 OwnerSid
= &TokenInfo1
->Groups
->Groups
[i
];
1160 Length
= RtlLengthSid(OwnerSid
->Sid
);
1161 TokenInfo1
->Owner
.Owner
= DispatchTable
.AllocateLsaHeap(Length
);
1162 if (TokenInfo1
->Owner
.Owner
== NULL
)
1163 return STATUS_INSUFFICIENT_RESOURCES
;
1165 RtlCopyMemory(TokenInfo1
->Owner
.Owner
,
1168 OwnerSid
->Attributes
|= SE_GROUP_OWNER
;
1171 return STATUS_SUCCESS
;
1177 LsapAddTokenDefaultDacl(
1178 IN PVOID TokenInformation
,
1179 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1181 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1185 if (TokenInformationType
== LsaTokenInformationV1
)
1187 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1189 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1190 return STATUS_SUCCESS
;
1192 Length
= sizeof(ACL
) +
1193 (2 * sizeof(ACCESS_ALLOWED_ACE
)) +
1194 RtlLengthSid(TokenInfo1
->Owner
.Owner
) +
1195 RtlLengthSid(LsapLocalSystemSid
);
1197 Dacl
= DispatchTable
.AllocateLsaHeap(Length
);
1199 return STATUS_INSUFFICIENT_RESOURCES
;
1201 RtlCreateAcl(Dacl
, Length
, ACL_REVISION
);
1203 RtlAddAccessAllowedAce(Dacl
,
1206 TokenInfo1
->Owner
.Owner
);
1209 RtlAddAccessAllowedAce(Dacl
,
1212 LsapLocalSystemSid
);
1214 TokenInfo1
->DefaultDacl
.DefaultDacl
= Dacl
;
1217 return STATUS_SUCCESS
;
1223 LsapAddPrivilegeToTokenPrivileges(PTOKEN_PRIVILEGES
*TokenPrivileges
,
1224 PLSAPR_LUID_AND_ATTRIBUTES Privilege
)
1226 PTOKEN_PRIVILEGES LocalPrivileges
;
1227 ULONG Length
, TokenPrivilegeCount
, i
;
1228 NTSTATUS Status
= STATUS_SUCCESS
;
1230 if (*TokenPrivileges
== NULL
)
1232 Length
= sizeof(TOKEN_PRIVILEGES
) +
1233 (1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1234 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1237 if (LocalPrivileges
== NULL
)
1238 return STATUS_INSUFFICIENT_RESOURCES
;
1240 LocalPrivileges
->PrivilegeCount
= 1;
1241 LocalPrivileges
->Privileges
[0].Luid
= Privilege
->Luid
;
1242 LocalPrivileges
->Privileges
[0].Attributes
= Privilege
->Attributes
;
1246 TokenPrivilegeCount
= (*TokenPrivileges
)->PrivilegeCount
;
1248 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1250 if (RtlEqualLuid(&(*TokenPrivileges
)->Privileges
[i
].Luid
, &Privilege
->Luid
))
1251 return STATUS_SUCCESS
;
1254 Length
= sizeof(TOKEN_PRIVILEGES
) +
1255 (TokenPrivilegeCount
+ 1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1256 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1259 if (LocalPrivileges
== NULL
)
1260 return STATUS_INSUFFICIENT_RESOURCES
;
1262 LocalPrivileges
->PrivilegeCount
= TokenPrivilegeCount
+ 1;
1263 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1265 LocalPrivileges
->Privileges
[i
].Luid
= (*TokenPrivileges
)->Privileges
[i
].Luid
;
1266 LocalPrivileges
->Privileges
[i
].Attributes
= (*TokenPrivileges
)->Privileges
[i
].Attributes
;
1269 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Luid
= Privilege
->Luid
;
1270 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Attributes
= Privilege
->Attributes
;
1272 RtlFreeHeap(RtlGetProcessHeap(), 0, *TokenPrivileges
);
1275 *TokenPrivileges
= LocalPrivileges
;
1283 IN PVOID TokenInformation
,
1284 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1286 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1287 LSAPR_HANDLE PolicyHandle
= NULL
;
1288 LSAPR_HANDLE AccountHandle
= NULL
;
1289 PLSAPR_PRIVILEGE_SET Privileges
= NULL
;
1293 if (TokenInformationType
== LsaTokenInformationV1
)
1295 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1297 Status
= LsarOpenPolicy(NULL
,
1301 if (!NT_SUCCESS(Status
))
1304 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1306 Status
= LsarOpenAccount(PolicyHandle
,
1307 TokenInfo1
->Groups
->Groups
[i
].Sid
,
1310 if (!NT_SUCCESS(Status
))
1313 Status
= LsarEnumeratePrivilegesAccount(AccountHandle
,
1315 if (NT_SUCCESS(Status
))
1317 for (j
= 0; j
< Privileges
->PrivilegeCount
; j
++)
1319 Status
= LsapAddPrivilegeToTokenPrivileges(&TokenInfo1
->Privileges
,
1320 &(Privileges
->Privilege
[j
]));
1321 if (!NT_SUCCESS(Status
))
1323 /* We failed, clean everything and return */
1324 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1325 LsarClose(&AccountHandle
);
1326 LsarClose(&PolicyHandle
);
1332 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1336 LsarClose(&AccountHandle
);
1339 LsarClose(&PolicyHandle
);
1341 if (TokenInfo1
->Privileges
!= NULL
)
1343 for (i
= 0; i
< TokenInfo1
->Privileges
->PrivilegeCount
; i
++)
1345 if (RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeChangeNotifyPrivilege
) ||
1346 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeCreateGlobalPrivilege
) ||
1347 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeImpersonatePrivilege
))
1349 TokenInfo1
->Privileges
->Privileges
[i
].Attributes
|= SE_PRIVILEGE_ENABLED
| SE_PRIVILEGE_ENABLED_BY_DEFAULT
;
1355 return STATUS_SUCCESS
;
1360 LsapLogonUser(PLSA_API_MSG RequestMsg
,
1361 PLSAP_LOGON_CONTEXT LogonContext
)
1363 PAUTH_PACKAGE Package
;
1364 OBJECT_ATTRIBUTES ObjectAttributes
;
1365 SECURITY_QUALITY_OF_SERVICE Qos
;
1366 LSA_TOKEN_INFORMATION_TYPE TokenInformationType
;
1367 PVOID TokenInformation
= NULL
;
1368 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
= NULL
;
1369 PUNICODE_STRING AccountName
= NULL
;
1370 PUNICODE_STRING AuthenticatingAuthority
= NULL
;
1371 PUNICODE_STRING MachineName
= NULL
;
1372 PVOID LocalAuthInfo
= NULL
;
1373 PTOKEN_GROUPS LocalGroups
= NULL
;
1374 HANDLE TokenHandle
= NULL
;
1377 SECURITY_LOGON_TYPE LogonType
;
1380 PUNICODE_STRING UserName
= NULL
;
1381 PUNICODE_STRING LogonDomainName
= NULL
;
1382 // UNICODE_STRING LogonServer;
1385 TRACE("LsapLogonUser(%p %p)\n", RequestMsg
, LogonContext
);
1387 PackageId
= RequestMsg
->LogonUser
.Request
.AuthenticationPackage
;
1388 LogonType
= RequestMsg
->LogonUser
.Request
.LogonType
;
1390 /* Get the right authentication package */
1391 Package
= LsapGetAuthenticationPackage(PackageId
);
1392 if (Package
== NULL
)
1394 ERR("LsapGetAuthenticationPackage() failed to find a package\n");
1395 return STATUS_NO_SUCH_PACKAGE
;
1398 if (RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
> 0)
1400 /* Allocate the local authentication info buffer */
1401 LocalAuthInfo
= RtlAllocateHeap(RtlGetProcessHeap(),
1403 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
);
1404 if (LocalAuthInfo
== NULL
)
1406 ERR("RtlAllocateHeap() failed\n");
1407 return STATUS_INSUFFICIENT_RESOURCES
;
1410 /* Read the authentication info from the callers address space */
1411 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
1412 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1414 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1416 if (!NT_SUCCESS(Status
))
1418 ERR("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status
);
1419 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1424 if (RequestMsg
->LogonUser
.Request
.LocalGroupsCount
> 0)
1426 Status
= LsapCopyLocalGroups(LogonContext
,
1427 RequestMsg
->LogonUser
.Request
.LocalGroups
,
1428 RequestMsg
->LogonUser
.Request
.LocalGroupsCount
,
1430 if (!NT_SUCCESS(Status
))
1432 ERR("LsapCopyLocalGroups failed (Status 0x%08lx)\n", Status
);
1436 TRACE("GroupCount: %lu\n", LocalGroups
->GroupCount
);
1439 if (Package
->LsaApLogonUserEx2
!= NULL
)
1441 Status
= Package
->LsaApLogonUserEx2((PLSA_CLIENT_REQUEST
)LogonContext
,
1442 RequestMsg
->LogonUser
.Request
.LogonType
,
1444 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1445 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1446 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1447 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1448 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1449 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1450 &TokenInformationType
,
1453 &AuthenticatingAuthority
,
1455 NULL
, /* FIXME: PSECPKG_PRIMARY_CRED PrimaryCredentials */
1456 NULL
); /* FIXME: PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials */
1458 else if (Package
->LsaApLogonUserEx
!= NULL
)
1460 Status
= Package
->LsaApLogonUserEx((PLSA_CLIENT_REQUEST
)LogonContext
,
1461 RequestMsg
->LogonUser
.Request
.LogonType
,
1463 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1464 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1465 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1466 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1467 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1468 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1469 &TokenInformationType
,
1472 &AuthenticatingAuthority
,
1477 Status
= Package
->LsaApLogonUser((PLSA_CLIENT_REQUEST
)LogonContext
,
1478 RequestMsg
->LogonUser
.Request
.LogonType
,
1480 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1481 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1482 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1483 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1484 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1485 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1486 &TokenInformationType
,
1489 &AuthenticatingAuthority
);
1492 if (!NT_SUCCESS(Status
))
1494 ERR("LsaApLogonUser/Ex/2 failed (Status 0x%08lx)\n", Status
);
1498 if (LocalGroups
->GroupCount
> 0)
1500 /* Add local groups to the token information */
1501 Status
= LsapAddLocalGroups(TokenInformation
,
1502 TokenInformationType
,
1504 if (!NT_SUCCESS(Status
))
1506 ERR("LsapAddLocalGroupsToTokenInfo() failed (Status 0x%08lx)\n", Status
);
1511 Status
= LsapAddDefaultGroups(TokenInformation
,
1512 TokenInformationType
,
1514 if (!NT_SUCCESS(Status
))
1516 ERR("LsapAddDefaultGroups() failed (Status 0x%08lx)\n", Status
);
1520 Status
= LsapAddSamGroups(TokenInformation
,
1521 TokenInformationType
);
1522 if (!NT_SUCCESS(Status
))
1524 ERR("LsapAddSamGroups() failed (Status 0x%08lx)\n", Status
);
1528 Status
= LsapSetTokenOwner(TokenInformation
,
1529 TokenInformationType
);
1530 if (!NT_SUCCESS(Status
))
1532 ERR("LsapSetTokenOwner() failed (Status 0x%08lx)\n", Status
);
1536 Status
= LsapAddTokenDefaultDacl(TokenInformation
,
1537 TokenInformationType
);
1538 if (!NT_SUCCESS(Status
))
1540 ERR("LsapAddTokenDefaultDacl() failed (Status 0x%08lx)\n", Status
);
1544 Status
= LsapSetPrivileges(TokenInformation
,
1545 TokenInformationType
);
1546 if (!NT_SUCCESS(Status
))
1548 ERR("LsapSetPrivileges() failed (Status 0x%08lx)\n", Status
);
1552 if (TokenInformationType
== LsaTokenInformationV1
)
1554 TOKEN_PRIVILEGES NoPrivilege
= {0};
1555 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1557 Qos
.Length
= sizeof(SECURITY_QUALITY_OF_SERVICE
);
1558 Qos
.ImpersonationLevel
= SecurityImpersonation
;
1559 Qos
.ContextTrackingMode
= SECURITY_DYNAMIC_TRACKING
;
1560 Qos
.EffectiveOnly
= FALSE
;
1562 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
1563 ObjectAttributes
.RootDirectory
= NULL
;
1564 ObjectAttributes
.ObjectName
= NULL
;
1565 ObjectAttributes
.Attributes
= 0;
1566 ObjectAttributes
.SecurityDescriptor
= NULL
;
1567 ObjectAttributes
.SecurityQualityOfService
= &Qos
;
1569 /* Create the logon token */
1570 Status
= NtCreateToken(&TokenHandle
,
1573 (RequestMsg
->LogonUser
.Request
.LogonType
== Network
) ? TokenImpersonation
: TokenPrimary
,
1574 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1575 &TokenInfo1
->ExpirationTime
,
1578 TokenInfo1
->Privileges
? TokenInfo1
->Privileges
1581 &TokenInfo1
->PrimaryGroup
,
1582 &TokenInfo1
->DefaultDacl
,
1583 &RequestMsg
->LogonUser
.Request
.SourceContext
);
1584 if (!NT_SUCCESS(Status
))
1586 ERR("NtCreateToken failed (Status 0x%08lx)\n", Status
);
1592 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1593 Status
= STATUS_NOT_IMPLEMENTED
;
1597 /* Duplicate the token handle into the client process */
1598 Status
= NtDuplicateObject(NtCurrentProcess(),
1600 LogonContext
->ClientProcessHandle
,
1601 &RequestMsg
->LogonUser
.Reply
.Token
,
1604 DUPLICATE_SAME_ACCESS
| DUPLICATE_SAME_ATTRIBUTES
| DUPLICATE_CLOSE_SOURCE
);
1605 if (!NT_SUCCESS(Status
))
1607 ERR("NtDuplicateObject failed (Status 0x%08lx)\n", Status
);
1611 // TokenHandle = NULL;
1613 if (LogonType
== Interactive
||
1614 LogonType
== Batch
||
1615 LogonType
== Service
)
1617 UserName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->UserName
;
1618 LogonDomainName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->LogonDomainName
;
1622 FIXME("LogonType %lu is not supported yet!\n", LogonType
);
1625 Status
= LsapSetLogonSessionData(&RequestMsg
->LogonUser
.Reply
.LogonId
,
1629 TokenInfo1
->User
.User
.Sid
);
1630 if (!NT_SUCCESS(Status
))
1632 ERR("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status
);
1637 // if (!NT_SUCCESS(Status))
1639 if (TokenHandle
!= NULL
)
1640 NtClose(TokenHandle
);
1643 /* Free the local groups */
1644 if (LocalGroups
!= NULL
)
1646 for (i
= 0; i
< LocalGroups
->GroupCount
; i
++)
1648 if (LocalGroups
->Groups
[i
].Sid
!= NULL
)
1649 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
->Groups
[i
].Sid
);
1652 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
);
1655 /* Free the local authentication info buffer */
1656 if (LocalAuthInfo
!= NULL
)
1657 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1659 /* Free the token information */
1660 if (TokenInformation
!= NULL
)
1662 if (TokenInformationType
== LsaTokenInformationV1
)
1664 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1666 if (TokenInfo1
!= NULL
)
1668 if (TokenInfo1
->User
.User
.Sid
!= NULL
)
1669 LsapFreeHeap(TokenInfo1
->User
.User
.Sid
);
1671 if (TokenInfo1
->Groups
!= NULL
)
1673 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1675 if (TokenInfo1
->Groups
->Groups
[i
].Sid
!= NULL
)
1676 LsapFreeHeap(TokenInfo1
->Groups
->Groups
[i
].Sid
);
1679 LsapFreeHeap(TokenInfo1
->Groups
);
1682 if (TokenInfo1
->PrimaryGroup
.PrimaryGroup
!= NULL
)
1683 LsapFreeHeap(TokenInfo1
->PrimaryGroup
.PrimaryGroup
);
1685 if (TokenInfo1
->Privileges
!= NULL
)
1686 LsapFreeHeap(TokenInfo1
->Privileges
);
1688 if (TokenInfo1
->Owner
.Owner
!= NULL
)
1689 LsapFreeHeap(TokenInfo1
->Owner
.Owner
);
1691 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1692 LsapFreeHeap(TokenInfo1
->DefaultDacl
.DefaultDacl
);
1694 LsapFreeHeap(TokenInfo1
);
1699 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1703 /* Free the account name */
1704 if (AccountName
!= NULL
)
1706 if (AccountName
->Buffer
!= NULL
)
1707 LsapFreeHeap(AccountName
->Buffer
);
1709 LsapFreeHeap(AccountName
);
1712 /* Free the authentication authority */
1713 if (AuthenticatingAuthority
!= NULL
)
1715 if (AuthenticatingAuthority
!= NULL
)
1716 LsapFreeHeap(AuthenticatingAuthority
->Buffer
);
1718 LsapFreeHeap(AuthenticatingAuthority
);
1721 /* Free the machine name */
1722 if (MachineName
!= NULL
)
1724 if (MachineName
->Buffer
!= NULL
)
1725 LsapFreeHeap(MachineName
->Buffer
);
1727 LsapFreeHeap(MachineName
);
1730 TRACE("LsapLogonUser done (Status 0x%08lx)\n", Status
);