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_NULL
22 LARGE_INTEGER ExpirationTime
;
24 } LSA_TOKEN_INFORMATION_NULL
, *PLSA_TOKEN_INFORMATION_NULL
;
26 typedef struct _LSA_TOKEN_INFORMATION_V1
28 LARGE_INTEGER ExpirationTime
;
31 TOKEN_PRIMARY_GROUP PrimaryGroup
;
32 PTOKEN_PRIVILEGES Privileges
;
34 TOKEN_DEFAULT_DACL DefaultDacl
;
35 } LSA_TOKEN_INFORMATION_V1
, *PLSA_TOKEN_INFORMATION_V1
;
37 typedef PVOID PLSA_CLIENT_REQUEST
;
39 typedef NTSTATUS (NTAPI
*PLSA_CREATE_LOGON_SESSION
)(PLUID
);
40 typedef NTSTATUS (NTAPI
*PLSA_DELETE_LOGON_SESSION
)(PLUID
);
41 typedef NTSTATUS (NTAPI
*PLSA_ADD_CREDENTIAL
)(PLUID
, ULONG
, PLSA_STRING
, PLSA_STRING
);
42 typedef NTSTATUS (NTAPI
*PLSA_GET_CREDENTIALS
)(PLUID
, ULONG
, PULONG
, BOOLEAN
, PLSA_STRING
, PULONG
, PLSA_STRING
);
43 typedef NTSTATUS (NTAPI
*PLSA_DELETE_CREDENTIAL
)(PLUID
, ULONG
, PLSA_STRING
);
44 typedef PVOID (NTAPI
*PLSA_ALLOCATE_LSA_HEAP
)(ULONG
);
45 typedef VOID (NTAPI
*PLSA_FREE_LSA_HEAP
)(PVOID
);
46 typedef NTSTATUS (NTAPI
*PLSA_ALLOCATE_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, ULONG
, PVOID
*);
47 typedef NTSTATUS (NTAPI
*PLSA_FREE_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, PVOID
);
48 typedef NTSTATUS (NTAPI
*PLSA_COPY_TO_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
, ULONG
,
50 typedef NTSTATUS (NTAPI
*PLSA_COPY_FROM_CLIENT_BUFFER
)(PLSA_CLIENT_REQUEST
,
53 typedef struct LSA_DISPATCH_TABLE
55 PLSA_CREATE_LOGON_SESSION CreateLogonSession
;
56 PLSA_DELETE_LOGON_SESSION DeleteLogonSession
;
57 PLSA_ADD_CREDENTIAL AddCredential
;
58 PLSA_GET_CREDENTIALS GetCredentials
;
59 PLSA_DELETE_CREDENTIAL DeleteCredential
;
60 PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap
;
61 PLSA_FREE_LSA_HEAP FreeLsaHeap
;
62 PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer
;
63 PLSA_FREE_CLIENT_BUFFER FreeClientBuffer
;
64 PLSA_COPY_TO_CLIENT_BUFFER CopyToClientBuffer
;
65 PLSA_COPY_FROM_CLIENT_BUFFER CopyFromClientBuffer
;
66 } LSA_DISPATCH_TABLE
, *PLSA_DISPATCH_TABLE
;
69 typedef NTSTATUS (NTAPI
*PLSA_AP_INITIALIZE_PACKAGE
)(ULONG
, PLSA_DISPATCH_TABLE
,
70 PLSA_STRING
, PLSA_STRING
, PLSA_STRING
*);
71 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_INTERNAL
)(PLSA_CLIENT_REQUEST
, PVOID
, PVOID
,
72 ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
73 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_PASSTHROUGH
)(PLSA_CLIENT_REQUEST
,
74 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
75 typedef NTSTATUS (NTAPI
*PLSA_AP_CALL_PACKAGE_UNTRUSTED
)(PLSA_CLIENT_REQUEST
,
76 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PNTSTATUS
);
77 typedef VOID (NTAPI
*PLSA_AP_LOGON_TERMINATED
)(PLUID
);
78 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_EX2
)(PLSA_CLIENT_REQUEST
,
79 SECURITY_LOGON_TYPE
, PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
,
80 PLSA_TOKEN_INFORMATION_TYPE
, PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*,
81 PUNICODE_STRING
*, PVOID
/*PSECPKG_PRIMARY_CRED*/, PVOID
/*PSECPKG_SUPPLEMENTAL_CRED_ARRAY **/);
82 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_EX
)(PLSA_CLIENT_REQUEST
,
83 SECURITY_LOGON_TYPE
, PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
,
84 PLSA_TOKEN_INFORMATION_TYPE
, PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*,
87 typedef NTSTATUS (NTAPI
*PLSA_AP_LOGON_USER_INTERNAL
)(PLSA_CLIENT_REQUEST
, SECURITY_LOGON_TYPE
,
88 PVOID
, PVOID
, ULONG
, PVOID
*, PULONG
, PLUID
, PNTSTATUS
, PLSA_TOKEN_INFORMATION_TYPE
,
89 PVOID
*, PUNICODE_STRING
*, PUNICODE_STRING
*);
91 typedef struct _AUTH_PACKAGE
98 PLSA_AP_INITIALIZE_PACKAGE LsaApInitializePackage
;
99 PLSA_AP_CALL_PACKAGE_INTERNAL LsaApCallPackage
;
100 PLSA_AP_CALL_PACKAGE_PASSTHROUGH LsaApCallPackagePassthrough
;
101 PLSA_AP_CALL_PACKAGE_UNTRUSTED LsaApCallPackageUntrusted
;
102 PLSA_AP_LOGON_TERMINATED LsaApLogonTerminated
;
103 PLSA_AP_LOGON_USER_EX2 LsaApLogonUserEx2
;
104 PLSA_AP_LOGON_USER_EX LsaApLogonUserEx
;
105 PLSA_AP_LOGON_USER_INTERNAL LsaApLogonUser
;
106 } AUTH_PACKAGE
, *PAUTH_PACKAGE
;
110 LsaIFree_LSAPR_PRIVILEGE_SET(IN PLSAPR_PRIVILEGE_SET Ptr
);
112 typedef wchar_t *PSAMPR_SERVER_NAME
;
113 typedef void *SAMPR_HANDLE
;
115 typedef struct _SAMPR_SID_INFORMATION
118 } SAMPR_SID_INFORMATION
, *PSAMPR_SID_INFORMATION
;
120 typedef struct _SAMPR_PSID_ARRAY
123 PSAMPR_SID_INFORMATION Sids
;
124 } SAMPR_PSID_ARRAY
, *PSAMPR_PSID_ARRAY
;
129 PSAMPR_SERVER_NAME ServerName
,
130 SAMPR_HANDLE
*ServerHandle
,
131 ACCESS_MASK DesiredAccess
,
136 SamIFree_SAMPR_ULONG_ARRAY(
137 PSAMPR_ULONG_ARRAY Ptr
);
142 SAMPR_HANDLE
*SamHandle
);
147 SAMPR_HANDLE ServerHandle
,
148 ACCESS_MASK DesiredAccess
,
150 SAMPR_HANDLE
*DomainHandle
);
154 SamrGetAliasMembership(
155 SAMPR_HANDLE DomainHandle
,
156 PSAMPR_PSID_ARRAY SidArray
,
157 PSAMPR_ULONG_ARRAY Membership
);
160 /* GLOBALS *****************************************************************/
162 static LIST_ENTRY PackageListHead
;
163 static ULONG PackageId
;
164 static LSA_DISPATCH_TABLE DispatchTable
;
166 #define CONST_LUID(x1, x2) {x1, x2}
167 static const LUID SeChangeNotifyPrivilege
= CONST_LUID(SE_CHANGE_NOTIFY_PRIVILEGE
, 0);
168 static const LUID SeCreateGlobalPrivilege
= CONST_LUID(SE_CREATE_GLOBAL_PRIVILEGE
, 0);
169 static const LUID SeImpersonatePrivilege
= CONST_LUID(SE_IMPERSONATE_PRIVILEGE
, 0);
172 /* FUNCTIONS ***************************************************************/
177 LsapAddAuthPackage(IN PWSTR ValueName
,
180 IN ULONG ValueLength
,
182 IN PVOID EntryContext
)
184 PAUTH_PACKAGE Package
= NULL
;
185 UNICODE_STRING PackageName
;
188 NTSTATUS Status
= STATUS_SUCCESS
;
190 TRACE("LsapAddAuthPackage()\n");
192 PackageName
.Length
= (USHORT
)ValueLength
- sizeof(WCHAR
);
193 PackageName
.MaximumLength
= (USHORT
)ValueLength
;
194 PackageName
.Buffer
= ValueData
;
196 Id
= (PULONG
)Context
;
198 Package
= RtlAllocateHeap(RtlGetProcessHeap(),
200 sizeof(AUTH_PACKAGE
));
202 return STATUS_INSUFFICIENT_RESOURCES
;
204 Status
= LdrLoadDll(NULL
,
207 &Package
->ModuleHandle
);
208 if (!NT_SUCCESS(Status
))
210 TRACE("LdrLoadDll failed (Status 0x%08lx)\n", Status
);
214 RtlInitAnsiString(&ProcName
, "LsaApInitializePackage");
215 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
218 (PVOID
*)&Package
->LsaApInitializePackage
);
219 if (!NT_SUCCESS(Status
))
221 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
225 RtlInitAnsiString(&ProcName
, "LsaApCallPackage");
226 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
229 (PVOID
*)&Package
->LsaApCallPackage
);
230 if (!NT_SUCCESS(Status
))
232 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
236 RtlInitAnsiString(&ProcName
, "LsaApCallPackagePassthrough");
237 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
240 (PVOID
*)&Package
->LsaApCallPackagePassthrough
);
241 if (!NT_SUCCESS(Status
))
243 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
247 RtlInitAnsiString(&ProcName
, "LsaApCallPackageUntrusted");
248 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
251 (PVOID
*)&Package
->LsaApCallPackageUntrusted
);
252 if (!NT_SUCCESS(Status
))
254 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
258 RtlInitAnsiString(&ProcName
, "LsaApLogonTerminated");
259 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
262 (PVOID
*)&Package
->LsaApLogonTerminated
);
263 if (!NT_SUCCESS(Status
))
265 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
269 RtlInitAnsiString(&ProcName
, "LsaApLogonUserEx2");
270 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
273 (PVOID
*)&Package
->LsaApLogonUserEx2
);
274 if (!NT_SUCCESS(Status
))
276 RtlInitAnsiString(&ProcName
, "LsaApLogonUserEx");
277 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
280 (PVOID
*)&Package
->LsaApLogonUserEx
);
281 if (!NT_SUCCESS(Status
))
283 RtlInitAnsiString(&ProcName
, "LsaApLogonUser");
284 Status
= LdrGetProcedureAddress(Package
->ModuleHandle
,
287 (PVOID
*)&Package
->LsaApLogonUser
);
288 if (!NT_SUCCESS(Status
))
290 TRACE("LdrGetProcedureAddress() failed (Status 0x%08lx)\n", Status
);
296 /* Initialize the current package */
297 Status
= Package
->LsaApInitializePackage(*Id
,
302 if (!NT_SUCCESS(Status
))
304 TRACE("Package->LsaApInitializePackage() failed (Status 0x%08lx)\n", Status
);
308 TRACE("Package Name: %s\n", Package
->Name
->Buffer
);
313 InsertTailList(&PackageListHead
, &Package
->Entry
);
316 if (!NT_SUCCESS(Status
))
320 if (Package
->ModuleHandle
!= NULL
)
321 LdrUnloadDll(Package
->ModuleHandle
);
323 if (Package
->Name
!= NULL
)
325 if (Package
->Name
->Buffer
!= NULL
)
326 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
->Name
->Buffer
);
328 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
->Name
);
331 RtlFreeHeap(RtlGetProcessHeap(), 0, Package
);
341 LsapGetAuthenticationPackage(IN ULONG PackageId
)
343 PLIST_ENTRY ListEntry
;
344 PAUTH_PACKAGE Package
;
346 ListEntry
= PackageListHead
.Flink
;
347 while (ListEntry
!= &PackageListHead
)
349 Package
= CONTAINING_RECORD(ListEntry
, AUTH_PACKAGE
, Entry
);
351 if (Package
->Id
== PackageId
)
356 ListEntry
= ListEntry
->Flink
;
365 LsapAllocateHeap(IN ULONG Length
)
367 return RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
373 LsapAllocateHeapZero(IN ULONG Length
)
375 return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
381 LsapFreeHeap(IN PVOID Base
)
383 RtlFreeHeap(RtlGetProcessHeap(), 0, Base
);
390 LsapAllocateClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
391 IN ULONG LengthRequired
,
392 OUT PVOID
*ClientBaseAddress
)
394 PLSAP_LOGON_CONTEXT LogonContext
;
397 *ClientBaseAddress
= NULL
;
399 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
401 Length
= LengthRequired
;
402 return NtAllocateVirtualMemory(LogonContext
->ClientProcessHandle
,
414 LsapFreeClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
415 IN PVOID ClientBaseAddress
)
417 PLSAP_LOGON_CONTEXT LogonContext
;
420 if (ClientBaseAddress
== NULL
)
421 return STATUS_SUCCESS
;
423 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
426 return NtFreeVirtualMemory(LogonContext
->ClientProcessHandle
,
436 LsapCopyToClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
438 IN PVOID ClientBaseAddress
,
439 IN PVOID BufferToCopy
)
441 PLSAP_LOGON_CONTEXT LogonContext
;
443 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
445 return NtWriteVirtualMemory(LogonContext
->ClientProcessHandle
,
456 LsapCopyFromClientBuffer(IN PLSA_CLIENT_REQUEST ClientRequest
,
458 IN PVOID BufferToCopy
,
459 IN PVOID ClientBaseAddress
)
461 PLSAP_LOGON_CONTEXT LogonContext
;
463 LogonContext
= (PLSAP_LOGON_CONTEXT
)ClientRequest
;
465 return NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
474 LsapInitAuthPackages(VOID
)
476 RTL_QUERY_REGISTRY_TABLE AuthPackageTable
[] = {
477 {LsapAddAuthPackage
, 0, L
"Authentication Packages", NULL
, REG_NONE
, NULL
, 0},
478 {NULL
, 0, NULL
, NULL
, REG_NONE
, NULL
, 0}};
482 InitializeListHead(&PackageListHead
);
485 /* Initialize the dispatch table */
486 DispatchTable
.CreateLogonSession
= &LsapCreateLogonSession
;
487 DispatchTable
.DeleteLogonSession
= &LsapDeleteLogonSession
;
488 DispatchTable
.AddCredential
= &LsapAddCredential
;
489 DispatchTable
.GetCredentials
= &LsapGetCredentials
;
490 DispatchTable
.DeleteCredential
= &LsapDeleteCredential
;
491 DispatchTable
.AllocateLsaHeap
= &LsapAllocateHeapZero
;
492 DispatchTable
.FreeLsaHeap
= &LsapFreeHeap
;
493 DispatchTable
.AllocateClientBuffer
= &LsapAllocateClientBuffer
;
494 DispatchTable
.FreeClientBuffer
= &LsapFreeClientBuffer
;
495 DispatchTable
.CopyToClientBuffer
= &LsapCopyToClientBuffer
;
496 DispatchTable
.CopyFromClientBuffer
= &LsapCopyFromClientBuffer
;
498 /* Add registered authentication packages */
499 Status
= RtlQueryRegistryValues(RTL_REGISTRY_CONTROL
,
510 LsapLookupAuthenticationPackage(PLSA_API_MSG RequestMsg
,
511 PLSAP_LOGON_CONTEXT LogonContext
)
513 PLIST_ENTRY ListEntry
;
514 PAUTH_PACKAGE Package
;
515 ULONG PackageNameLength
;
518 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
520 PackageNameLength
= RequestMsg
->LookupAuthenticationPackage
.Request
.PackageNameLength
;
521 PackageName
= RequestMsg
->LookupAuthenticationPackage
.Request
.PackageName
;
523 TRACE("PackageName: %s\n", PackageName
);
525 ListEntry
= PackageListHead
.Flink
;
526 while (ListEntry
!= &PackageListHead
)
528 Package
= CONTAINING_RECORD(ListEntry
, AUTH_PACKAGE
, Entry
);
530 if ((PackageNameLength
== Package
->Name
->Length
) &&
531 (_strnicmp(PackageName
, Package
->Name
->Buffer
, Package
->Name
->Length
) == 0))
533 RequestMsg
->LookupAuthenticationPackage
.Reply
.Package
= Package
->Id
;
534 return STATUS_SUCCESS
;
537 ListEntry
= ListEntry
->Flink
;
540 return STATUS_NO_SUCH_PACKAGE
;
545 LsapCallAuthenticationPackage(PLSA_API_MSG RequestMsg
,
546 PLSAP_LOGON_CONTEXT LogonContext
)
548 PAUTH_PACKAGE Package
;
549 PVOID LocalBuffer
= NULL
;
553 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
555 PackageId
= RequestMsg
->CallAuthenticationPackage
.Request
.AuthenticationPackage
;
557 /* Get the right authentication package */
558 Package
= LsapGetAuthenticationPackage(PackageId
);
561 TRACE("LsapGetAuthenticationPackage() failed to find a package\n");
562 return STATUS_NO_SUCH_PACKAGE
;
565 if (RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
> 0)
567 LocalBuffer
= RtlAllocateHeap(RtlGetProcessHeap(),
569 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
);
570 if (LocalBuffer
== NULL
)
572 return STATUS_INSUFFICIENT_RESOURCES
;
575 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
576 RequestMsg
->CallAuthenticationPackage
.Request
.ProtocolSubmitBuffer
,
578 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
,
580 if (!NT_SUCCESS(Status
))
582 TRACE("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status
);
583 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer
);
588 Status
= Package
->LsaApCallPackage((PLSA_CLIENT_REQUEST
)LogonContext
,
590 RequestMsg
->CallAuthenticationPackage
.Request
.ProtocolSubmitBuffer
,
591 RequestMsg
->CallAuthenticationPackage
.Request
.SubmitBufferLength
,
592 &RequestMsg
->CallAuthenticationPackage
.Reply
.ProtocolReturnBuffer
,
593 &RequestMsg
->CallAuthenticationPackage
.Reply
.ReturnBufferLength
,
594 &RequestMsg
->CallAuthenticationPackage
.Reply
.ProtocolStatus
);
595 if (!NT_SUCCESS(Status
))
597 TRACE("Package->LsaApCallPackage() failed (Status 0x%08lx)\n", Status
);
600 if (LocalBuffer
!= NULL
)
601 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer
);
610 IN PLSAP_LOGON_CONTEXT LogonContext
,
611 IN PTOKEN_GROUPS ClientGroups
,
612 IN ULONG ClientGroupsCount
,
613 OUT PTOKEN_GROUPS
*TokenGroups
)
615 ULONG LocalGroupsLength
= 0;
616 PTOKEN_GROUPS LocalGroups
= NULL
;
617 ULONG SidHeaderLength
= 0;
618 PSID SidHeader
= NULL
;
621 ULONG AllocatedSids
= 0;
625 LocalGroupsLength
= sizeof(TOKEN_GROUPS
) +
626 (ClientGroupsCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
627 LocalGroups
= RtlAllocateHeap(RtlGetProcessHeap(),
630 if (LocalGroups
== NULL
)
632 TRACE("RtlAllocateHeap() failed\n");
633 return STATUS_INSUFFICIENT_RESOURCES
;
636 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
641 if (!NT_SUCCESS(Status
))
645 SidHeaderLength
= RtlLengthRequiredSid(0);
646 SidHeader
= RtlAllocateHeap(RtlGetProcessHeap(),
649 if (SidHeader
== NULL
)
651 Status
= STATUS_INSUFFICIENT_RESOURCES
;
655 for (i
= 0; i
< ClientGroupsCount
; i
++)
657 SrcSid
= LocalGroups
->Groups
[i
].Sid
;
659 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
664 if (!NT_SUCCESS(Status
))
667 SidLength
= RtlLengthSid(SidHeader
);
668 TRACE("Sid %lu: Length %lu\n", i
, SidLength
);
670 DstSid
= RtlAllocateHeap(RtlGetProcessHeap(),
675 Status
= STATUS_INSUFFICIENT_RESOURCES
;
679 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
684 if (!NT_SUCCESS(Status
))
686 RtlFreeHeap(RtlGetProcessHeap(), 0, DstSid
);
690 LocalGroups
->Groups
[i
].Sid
= DstSid
;
694 *TokenGroups
= LocalGroups
;
697 if (SidHeader
!= NULL
)
698 RtlFreeHeap(RtlGetProcessHeap(), 0, SidHeader
);
700 if (!NT_SUCCESS(Status
))
702 if (LocalGroups
!= NULL
)
704 for (i
= 0; i
< AllocatedSids
; i
++)
705 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
->Groups
[i
].Sid
);
707 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
);
718 IN PVOID TokenInformation
,
719 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
720 IN PTOKEN_GROUPS LocalGroups
)
722 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
723 PTOKEN_GROUPS Groups
;
728 if (LocalGroups
== NULL
|| LocalGroups
->GroupCount
== 0)
729 return STATUS_SUCCESS
;
731 if (TokenInformationType
== LsaTokenInformationV1
)
733 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
735 if (TokenInfo1
->Groups
!= NULL
)
737 Length
= sizeof(TOKEN_GROUPS
) +
738 (LocalGroups
->GroupCount
+ TokenInfo1
->Groups
->GroupCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
740 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
743 ERR("Group buffer allocation failed!\n");
744 return STATUS_INSUFFICIENT_RESOURCES
;
747 Groups
->GroupCount
= LocalGroups
->GroupCount
+ TokenInfo1
->Groups
->GroupCount
;
749 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
751 Groups
->Groups
[i
].Sid
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
752 Groups
->Groups
[i
].Attributes
= TokenInfo1
->Groups
->Groups
[i
].Attributes
;
755 for (j
= 0; j
< LocalGroups
->GroupCount
; i
++, j
++)
757 Groups
->Groups
[i
].Sid
= LocalGroups
->Groups
[j
].Sid
;
758 Groups
->Groups
[i
].Attributes
= LocalGroups
->Groups
[j
].Attributes
;
759 LocalGroups
->Groups
[j
].Sid
= NULL
;
762 RtlFreeHeap(RtlGetProcessHeap(), 0, TokenInfo1
->Groups
);
764 TokenInfo1
->Groups
= Groups
;
768 Length
= sizeof(TOKEN_GROUPS
) +
769 (LocalGroups
->GroupCount
- ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
771 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
774 ERR("Group buffer allocation failed!\n");
775 return STATUS_INSUFFICIENT_RESOURCES
;
778 Groups
->GroupCount
= LocalGroups
->GroupCount
;
780 for (i
= 0; i
< LocalGroups
->GroupCount
; i
++)
782 Groups
->Groups
[i
].Sid
= LocalGroups
->Groups
[i
].Sid
;
783 Groups
->Groups
[i
].Attributes
= LocalGroups
->Groups
[i
].Attributes
;
786 TokenInfo1
->Groups
= Groups
;
791 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
792 return STATUS_NOT_IMPLEMENTED
;
795 return STATUS_SUCCESS
;
800 LsapAddDefaultGroups(
801 IN PVOID TokenInformation
,
802 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
803 IN SECURITY_LOGON_TYPE LogonType
)
805 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
806 PTOKEN_GROUPS Groups
;
810 if (TokenInformationType
== LsaTokenInformationV1
)
812 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
814 if (TokenInfo1
->Groups
!= NULL
)
816 Length
= sizeof(TOKEN_GROUPS
) +
817 (TokenInfo1
->Groups
->GroupCount
+ 2 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
819 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
822 ERR("Group buffer allocation failed!\n");
823 return STATUS_INSUFFICIENT_RESOURCES
;
826 Groups
->GroupCount
= TokenInfo1
->Groups
->GroupCount
;
828 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
830 Groups
->Groups
[i
].Sid
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
831 Groups
->Groups
[i
].Attributes
= TokenInfo1
->Groups
->Groups
[i
].Attributes
;
834 RtlFreeHeap(RtlGetProcessHeap(), 0, TokenInfo1
->Groups
);
836 TokenInfo1
->Groups
= Groups
;
841 Length
= sizeof(TOKEN_GROUPS
) +
842 (2 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
844 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
847 ERR("Group buffer allocation failed!\n");
848 return STATUS_INSUFFICIENT_RESOURCES
;
851 TokenInfo1
->Groups
= Groups
;
854 /* Append the World SID (aka Everyone) */
855 Length
= RtlLengthSid(LsapWorldSid
);
856 Groups
->Groups
[Groups
->GroupCount
].Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
859 if (Groups
->Groups
[Groups
->GroupCount
].Sid
== NULL
)
860 return STATUS_INSUFFICIENT_RESOURCES
;
862 RtlCopyMemory(Groups
->Groups
[Groups
->GroupCount
].Sid
,
866 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
867 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
869 Groups
->GroupCount
++;
871 /* Append the logon type SID */
875 SrcSid
= LsapInteractiveSid
;
879 SrcSid
= LsapNetworkSid
;
883 SrcSid
= LsapBatchSid
;
887 SrcSid
= LsapServiceSid
;
891 FIXME("LogonType %d is not supported!\n", LogonType
);
892 return STATUS_NOT_IMPLEMENTED
;
895 Length
= RtlLengthSid(SrcSid
);
896 Groups
->Groups
[Groups
->GroupCount
].Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
899 if (Groups
->Groups
[Groups
->GroupCount
].Sid
== NULL
)
900 return STATUS_INSUFFICIENT_RESOURCES
;
902 RtlCopyMemory(Groups
->Groups
[Groups
->GroupCount
].Sid
,
906 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
907 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
909 Groups
->GroupCount
++;
913 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
914 return STATUS_NOT_IMPLEMENTED
;
917 return STATUS_SUCCESS
;
923 LsapAppendSidToGroups(
924 IN PTOKEN_GROUPS
*TokenGroups
,
928 PTOKEN_GROUPS Groups
;
933 Sid
= LsapAppendRidToSid(DomainSid
, RelativeId
);
936 ERR("Group SID creation failed!\n");
937 return STATUS_INSUFFICIENT_RESOURCES
;
940 if (*TokenGroups
== NULL
)
942 Length
= sizeof(TOKEN_GROUPS
) +
943 (1 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
945 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
948 ERR("Group buffer allocation failed!\n");
949 return STATUS_INSUFFICIENT_RESOURCES
;
952 Groups
->GroupCount
= 1;
954 Groups
->Groups
[0].Sid
= Sid
;
955 Groups
->Groups
[0].Attributes
=
956 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
958 *TokenGroups
= Groups
;
962 for (i
= 0; i
< (*TokenGroups
)->GroupCount
; i
++)
964 if (RtlEqualSid((*TokenGroups
)->Groups
[i
].Sid
, Sid
))
966 RtlFreeHeap(RtlGetProcessHeap(), 0, Sid
);
967 return STATUS_SUCCESS
;
971 Length
= sizeof(TOKEN_GROUPS
) +
972 ((*TokenGroups
)->GroupCount
+ 1 - ANYSIZE_ARRAY
) * sizeof(SID_AND_ATTRIBUTES
);
974 Groups
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Length
);
977 ERR("Group buffer allocation failed!\n");
978 return STATUS_INSUFFICIENT_RESOURCES
;
981 Groups
->GroupCount
= (*TokenGroups
)->GroupCount
;
983 for (i
= 0; i
< (*TokenGroups
)->GroupCount
; i
++)
985 Groups
->Groups
[i
].Sid
= (*TokenGroups
)->Groups
[i
].Sid
;
986 Groups
->Groups
[i
].Attributes
= (*TokenGroups
)->Groups
[i
].Attributes
;
989 Groups
->Groups
[Groups
->GroupCount
].Sid
= Sid
;
990 Groups
->Groups
[Groups
->GroupCount
].Attributes
=
991 SE_GROUP_ENABLED
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_MANDATORY
;
993 Groups
->GroupCount
++;
995 RtlFreeHeap(RtlGetProcessHeap(), 0, *TokenGroups
);
997 *TokenGroups
= Groups
;
1000 return STATUS_SUCCESS
;
1007 IN PVOID TokenInformation
,
1008 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1010 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1011 SAMPR_HANDLE ServerHandle
= NULL
;
1012 SAMPR_HANDLE BuiltinDomainHandle
= NULL
;
1013 SAMPR_HANDLE AccountDomainHandle
= NULL
;
1014 SAMPR_PSID_ARRAY SidArray
;
1015 SAMPR_ULONG_ARRAY BuiltinMembership
;
1016 SAMPR_ULONG_ARRAY AccountMembership
;
1018 NTSTATUS Status
= STATUS_SUCCESS
;
1020 if (TokenInformationType
!= LsaTokenInformationV1
)
1021 return STATUS_SUCCESS
;
1023 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1025 SidArray
.Count
= TokenInfo1
->Groups
->GroupCount
+ 1;
1026 SidArray
.Sids
= RtlAllocateHeap(RtlGetProcessHeap(),
1028 (TokenInfo1
->Groups
->GroupCount
+ 1) * sizeof(PRPC_SID
));
1029 if (SidArray
.Sids
== NULL
)
1030 return STATUS_INSUFFICIENT_RESOURCES
;
1032 SidArray
.Sids
[0].SidPointer
= TokenInfo1
->User
.User
.Sid
;
1033 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1034 SidArray
.Sids
[i
+ 1].SidPointer
= TokenInfo1
->Groups
->Groups
[i
].Sid
;
1036 BuiltinMembership
.Element
= NULL
;
1037 AccountMembership
.Element
= NULL
;
1039 Status
= SamIConnect(NULL
,
1041 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1043 if (!NT_SUCCESS(Status
))
1045 TRACE("SamIConnect failed (Status %08lx)\n", Status
);
1049 Status
= SamrOpenDomain(ServerHandle
,
1050 DOMAIN_GET_ALIAS_MEMBERSHIP
,
1052 &BuiltinDomainHandle
);
1053 if (!NT_SUCCESS(Status
))
1055 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status
);
1059 Status
= SamrOpenDomain(ServerHandle
,
1060 DOMAIN_GET_ALIAS_MEMBERSHIP
,
1062 &AccountDomainHandle
);
1063 if (!NT_SUCCESS(Status
))
1065 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status
);
1069 Status
= SamrGetAliasMembership(BuiltinDomainHandle
,
1071 &BuiltinMembership
);
1072 if (!NT_SUCCESS(Status
))
1074 TRACE("SamrGetAliasMembership failed (Status %08lx)\n", Status
);
1078 Status
= SamrGetAliasMembership(AccountDomainHandle
,
1080 &AccountMembership
);
1081 if (!NT_SUCCESS(Status
))
1083 TRACE("SamrGetAliasMembership failed (Status %08lx)\n", Status
);
1087 TRACE("Builtin Memberships: %lu\n", BuiltinMembership
.Count
);
1088 for (i
= 0; i
< BuiltinMembership
.Count
; i
++)
1090 TRACE("RID %lu: %lu (0x%lx)\n", i
, BuiltinMembership
.Element
[i
], BuiltinMembership
.Element
[i
]);
1091 Status
= LsapAppendSidToGroups(&TokenInfo1
->Groups
,
1093 BuiltinMembership
.Element
[i
]);
1094 if (!NT_SUCCESS(Status
))
1096 TRACE("LsapAppendSidToGroups failed (Status %08lx)\n", Status
);
1101 TRACE("Account Memberships: %lu\n", AccountMembership
.Count
);
1102 for (i
= 0; i
< AccountMembership
.Count
; i
++)
1104 TRACE("RID %lu: %lu (0x%lx)\n", i
, AccountMembership
.Element
[i
], AccountMembership
.Element
[i
]);
1105 Status
= LsapAppendSidToGroups(&TokenInfo1
->Groups
,
1107 AccountMembership
.Element
[i
]);
1108 if (!NT_SUCCESS(Status
))
1110 TRACE("LsapAppendSidToGroups failed (Status %08lx)\n", Status
);
1116 RtlFreeHeap(RtlGetProcessHeap(), 0, SidArray
.Sids
);
1118 if (AccountMembership
.Element
!= NULL
)
1119 SamIFree_SAMPR_ULONG_ARRAY(&AccountMembership
);
1121 if (BuiltinMembership
.Element
!= NULL
)
1122 SamIFree_SAMPR_ULONG_ARRAY(&BuiltinMembership
);
1124 if (AccountDomainHandle
!= NULL
)
1125 SamrCloseHandle(&AccountDomainHandle
);
1127 if (BuiltinDomainHandle
!= NULL
)
1128 SamrCloseHandle(&BuiltinDomainHandle
);
1130 if (ServerHandle
!= NULL
)
1131 SamrCloseHandle(&ServerHandle
);
1135 return STATUS_SUCCESS
;
1142 IN PVOID TokenInformation
,
1143 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1145 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1146 PSID_AND_ATTRIBUTES OwnerSid
= NULL
;
1149 if (TokenInformationType
== LsaTokenInformationV1
)
1151 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1153 if (TokenInfo1
->Owner
.Owner
!= NULL
)
1154 return STATUS_SUCCESS
;
1156 OwnerSid
= &TokenInfo1
->User
.User
;
1157 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1159 if (EqualSid(TokenInfo1
->Groups
->Groups
[i
].Sid
, LsapAdministratorsSid
))
1161 OwnerSid
= &TokenInfo1
->Groups
->Groups
[i
];
1166 Length
= RtlLengthSid(OwnerSid
->Sid
);
1167 TokenInfo1
->Owner
.Owner
= DispatchTable
.AllocateLsaHeap(Length
);
1168 if (TokenInfo1
->Owner
.Owner
== NULL
)
1169 return STATUS_INSUFFICIENT_RESOURCES
;
1171 RtlCopyMemory(TokenInfo1
->Owner
.Owner
,
1174 OwnerSid
->Attributes
|= SE_GROUP_OWNER
;
1177 return STATUS_SUCCESS
;
1183 LsapAddTokenDefaultDacl(
1184 IN PVOID TokenInformation
,
1185 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1187 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1191 if (TokenInformationType
== LsaTokenInformationV1
)
1193 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1195 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1196 return STATUS_SUCCESS
;
1198 Length
= sizeof(ACL
) +
1199 (2 * sizeof(ACCESS_ALLOWED_ACE
)) +
1200 RtlLengthSid(TokenInfo1
->Owner
.Owner
) +
1201 RtlLengthSid(LsapLocalSystemSid
);
1203 Dacl
= DispatchTable
.AllocateLsaHeap(Length
);
1205 return STATUS_INSUFFICIENT_RESOURCES
;
1207 RtlCreateAcl(Dacl
, Length
, ACL_REVISION
);
1209 RtlAddAccessAllowedAce(Dacl
,
1212 TokenInfo1
->Owner
.Owner
);
1215 RtlAddAccessAllowedAce(Dacl
,
1218 LsapLocalSystemSid
);
1220 TokenInfo1
->DefaultDacl
.DefaultDacl
= Dacl
;
1223 return STATUS_SUCCESS
;
1229 LsapAddPrivilegeToTokenPrivileges(PTOKEN_PRIVILEGES
*TokenPrivileges
,
1230 PLSAPR_LUID_AND_ATTRIBUTES Privilege
)
1232 PTOKEN_PRIVILEGES LocalPrivileges
;
1233 ULONG Length
, TokenPrivilegeCount
, i
;
1234 NTSTATUS Status
= STATUS_SUCCESS
;
1236 if (*TokenPrivileges
== NULL
)
1238 Length
= sizeof(TOKEN_PRIVILEGES
) +
1239 (1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1240 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1243 if (LocalPrivileges
== NULL
)
1244 return STATUS_INSUFFICIENT_RESOURCES
;
1246 LocalPrivileges
->PrivilegeCount
= 1;
1247 LocalPrivileges
->Privileges
[0].Luid
= Privilege
->Luid
;
1248 LocalPrivileges
->Privileges
[0].Attributes
= Privilege
->Attributes
;
1252 TokenPrivilegeCount
= (*TokenPrivileges
)->PrivilegeCount
;
1254 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1256 if (RtlEqualLuid(&(*TokenPrivileges
)->Privileges
[i
].Luid
, &Privilege
->Luid
))
1257 return STATUS_SUCCESS
;
1260 Length
= sizeof(TOKEN_PRIVILEGES
) +
1261 (TokenPrivilegeCount
+ 1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1262 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1265 if (LocalPrivileges
== NULL
)
1266 return STATUS_INSUFFICIENT_RESOURCES
;
1268 LocalPrivileges
->PrivilegeCount
= TokenPrivilegeCount
+ 1;
1269 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1271 LocalPrivileges
->Privileges
[i
].Luid
= (*TokenPrivileges
)->Privileges
[i
].Luid
;
1272 LocalPrivileges
->Privileges
[i
].Attributes
= (*TokenPrivileges
)->Privileges
[i
].Attributes
;
1275 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Luid
= Privilege
->Luid
;
1276 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Attributes
= Privilege
->Attributes
;
1278 RtlFreeHeap(RtlGetProcessHeap(), 0, *TokenPrivileges
);
1281 *TokenPrivileges
= LocalPrivileges
;
1289 IN PVOID TokenInformation
,
1290 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1292 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1293 LSAPR_HANDLE PolicyHandle
= NULL
;
1294 LSAPR_HANDLE AccountHandle
= NULL
;
1295 PLSAPR_PRIVILEGE_SET Privileges
= NULL
;
1299 if (TokenInformationType
== LsaTokenInformationV1
)
1301 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1303 Status
= LsarOpenPolicy(NULL
,
1307 if (!NT_SUCCESS(Status
))
1310 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1312 Status
= LsarOpenAccount(PolicyHandle
,
1313 TokenInfo1
->Groups
->Groups
[i
].Sid
,
1316 if (!NT_SUCCESS(Status
))
1319 Status
= LsarEnumeratePrivilegesAccount(AccountHandle
,
1321 if (NT_SUCCESS(Status
))
1323 for (j
= 0; j
< Privileges
->PrivilegeCount
; j
++)
1325 Status
= LsapAddPrivilegeToTokenPrivileges(&TokenInfo1
->Privileges
,
1326 &(Privileges
->Privilege
[j
]));
1327 if (!NT_SUCCESS(Status
))
1329 /* We failed, clean everything and return */
1330 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1331 LsarClose(&AccountHandle
);
1332 LsarClose(&PolicyHandle
);
1338 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1342 LsarClose(&AccountHandle
);
1345 LsarClose(&PolicyHandle
);
1347 if (TokenInfo1
->Privileges
!= NULL
)
1349 for (i
= 0; i
< TokenInfo1
->Privileges
->PrivilegeCount
; i
++)
1351 if (RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeChangeNotifyPrivilege
) ||
1352 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeCreateGlobalPrivilege
) ||
1353 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeImpersonatePrivilege
))
1355 TokenInfo1
->Privileges
->Privileges
[i
].Attributes
|= SE_PRIVILEGE_ENABLED
| SE_PRIVILEGE_ENABLED_BY_DEFAULT
;
1361 return STATUS_SUCCESS
;
1366 LsapLogonUser(PLSA_API_MSG RequestMsg
,
1367 PLSAP_LOGON_CONTEXT LogonContext
)
1369 PAUTH_PACKAGE Package
;
1370 OBJECT_ATTRIBUTES ObjectAttributes
;
1371 SECURITY_QUALITY_OF_SERVICE Qos
;
1372 LSA_TOKEN_INFORMATION_TYPE TokenInformationType
;
1373 PVOID TokenInformation
= NULL
;
1374 PLSA_TOKEN_INFORMATION_NULL TokenInfo0
= NULL
;
1375 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
= NULL
;
1376 PUNICODE_STRING AccountName
= NULL
;
1377 PUNICODE_STRING AuthenticatingAuthority
= NULL
;
1378 PUNICODE_STRING MachineName
= NULL
;
1379 PVOID LocalAuthInfo
= NULL
;
1380 PTOKEN_GROUPS LocalGroups
= NULL
;
1381 HANDLE TokenHandle
= NULL
;
1384 SECURITY_LOGON_TYPE LogonType
;
1387 PUNICODE_STRING UserName
= NULL
;
1388 PUNICODE_STRING LogonDomainName
= NULL
;
1389 // UNICODE_STRING LogonServer;
1392 TRACE("LsapLogonUser(%p %p)\n", RequestMsg
, LogonContext
);
1394 PackageId
= RequestMsg
->LogonUser
.Request
.AuthenticationPackage
;
1395 LogonType
= RequestMsg
->LogonUser
.Request
.LogonType
;
1397 /* Get the right authentication package */
1398 Package
= LsapGetAuthenticationPackage(PackageId
);
1399 if (Package
== NULL
)
1401 ERR("LsapGetAuthenticationPackage() failed to find a package\n");
1402 return STATUS_NO_SUCH_PACKAGE
;
1405 if (RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
> 0)
1407 /* Allocate the local authentication info buffer */
1408 LocalAuthInfo
= RtlAllocateHeap(RtlGetProcessHeap(),
1410 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
);
1411 if (LocalAuthInfo
== NULL
)
1413 ERR("RtlAllocateHeap() failed\n");
1414 return STATUS_INSUFFICIENT_RESOURCES
;
1417 /* Read the authentication info from the callers address space */
1418 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
1419 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1421 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1423 if (!NT_SUCCESS(Status
))
1425 ERR("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status
);
1426 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1431 if (RequestMsg
->LogonUser
.Request
.LocalGroupsCount
> 0)
1433 Status
= LsapCopyLocalGroups(LogonContext
,
1434 RequestMsg
->LogonUser
.Request
.LocalGroups
,
1435 RequestMsg
->LogonUser
.Request
.LocalGroupsCount
,
1437 if (!NT_SUCCESS(Status
))
1439 ERR("LsapCopyLocalGroups failed (Status 0x%08lx)\n", Status
);
1443 TRACE("GroupCount: %lu\n", LocalGroups
->GroupCount
);
1446 if (Package
->LsaApLogonUserEx2
!= NULL
)
1448 Status
= Package
->LsaApLogonUserEx2((PLSA_CLIENT_REQUEST
)LogonContext
,
1449 RequestMsg
->LogonUser
.Request
.LogonType
,
1451 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1452 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1453 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1454 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1455 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1456 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1457 &TokenInformationType
,
1460 &AuthenticatingAuthority
,
1462 NULL
, /* FIXME: PSECPKG_PRIMARY_CRED PrimaryCredentials */
1463 NULL
); /* FIXME: PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials */
1465 else if (Package
->LsaApLogonUserEx
!= NULL
)
1467 Status
= Package
->LsaApLogonUserEx((PLSA_CLIENT_REQUEST
)LogonContext
,
1468 RequestMsg
->LogonUser
.Request
.LogonType
,
1470 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1471 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1472 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1473 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1474 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1475 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1476 &TokenInformationType
,
1479 &AuthenticatingAuthority
,
1484 Status
= Package
->LsaApLogonUser((PLSA_CLIENT_REQUEST
)LogonContext
,
1485 RequestMsg
->LogonUser
.Request
.LogonType
,
1487 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1488 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1489 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1490 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1491 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1492 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1493 &TokenInformationType
,
1496 &AuthenticatingAuthority
);
1499 if (!NT_SUCCESS(Status
))
1501 ERR("LsaApLogonUser/Ex/2 failed (Status 0x%08lx)\n", Status
);
1505 if (LocalGroups
->GroupCount
> 0)
1507 /* Add local groups to the token information */
1508 Status
= LsapAddLocalGroups(TokenInformation
,
1509 TokenInformationType
,
1511 if (!NT_SUCCESS(Status
))
1513 ERR("LsapAddLocalGroupsToTokenInfo() failed (Status 0x%08lx)\n", Status
);
1518 Status
= LsapAddDefaultGroups(TokenInformation
,
1519 TokenInformationType
,
1521 if (!NT_SUCCESS(Status
))
1523 ERR("LsapAddDefaultGroups() failed (Status 0x%08lx)\n", Status
);
1527 Status
= LsapAddSamGroups(TokenInformation
,
1528 TokenInformationType
);
1529 if (!NT_SUCCESS(Status
))
1531 ERR("LsapAddSamGroups() failed (Status 0x%08lx)\n", Status
);
1535 Status
= LsapSetTokenOwner(TokenInformation
,
1536 TokenInformationType
);
1537 if (!NT_SUCCESS(Status
))
1539 ERR("LsapSetTokenOwner() failed (Status 0x%08lx)\n", Status
);
1543 Status
= LsapAddTokenDefaultDacl(TokenInformation
,
1544 TokenInformationType
);
1545 if (!NT_SUCCESS(Status
))
1547 ERR("LsapAddTokenDefaultDacl() failed (Status 0x%08lx)\n", Status
);
1551 Status
= LsapSetPrivileges(TokenInformation
,
1552 TokenInformationType
);
1553 if (!NT_SUCCESS(Status
))
1555 ERR("LsapSetPrivileges() failed (Status 0x%08lx)\n", Status
);
1559 if (TokenInformationType
== LsaTokenInformationNull
)
1561 TOKEN_USER TokenUser
;
1562 TOKEN_PRIMARY_GROUP TokenPrimaryGroup
;
1563 TOKEN_GROUPS NoGroups
= {0};
1564 TOKEN_PRIVILEGES NoPrivileges
= {0};
1566 TokenInfo0
= (PLSA_TOKEN_INFORMATION_NULL
)TokenInformation
;
1568 TokenUser
.User
.Sid
= LsapWorldSid
;
1569 TokenUser
.User
.Attributes
= 0;
1570 TokenPrimaryGroup
.PrimaryGroup
= LsapWorldSid
;
1572 Qos
.Length
= sizeof(SECURITY_QUALITY_OF_SERVICE
);
1573 Qos
.ImpersonationLevel
= SecurityImpersonation
;
1574 Qos
.ContextTrackingMode
= SECURITY_STATIC_TRACKING
;
1575 Qos
.EffectiveOnly
= TRUE
;
1577 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
1578 ObjectAttributes
.RootDirectory
= NULL
;
1579 ObjectAttributes
.ObjectName
= NULL
;
1580 ObjectAttributes
.Attributes
= 0;
1581 ObjectAttributes
.SecurityDescriptor
= NULL
;
1582 ObjectAttributes
.SecurityQualityOfService
= &Qos
;
1584 /* Create the logon token */
1585 Status
= NtCreateToken(&TokenHandle
,
1589 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1590 &TokenInfo0
->ExpirationTime
,
1597 &RequestMsg
->LogonUser
.Request
.SourceContext
);
1599 else if (TokenInformationType
== LsaTokenInformationV1
)
1601 TOKEN_PRIVILEGES NoPrivileges
= {0};
1603 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1605 Qos
.Length
= sizeof(SECURITY_QUALITY_OF_SERVICE
);
1606 Qos
.ImpersonationLevel
= SecurityImpersonation
;
1607 Qos
.ContextTrackingMode
= SECURITY_DYNAMIC_TRACKING
;
1608 Qos
.EffectiveOnly
= FALSE
;
1610 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
1611 ObjectAttributes
.RootDirectory
= NULL
;
1612 ObjectAttributes
.ObjectName
= NULL
;
1613 ObjectAttributes
.Attributes
= 0;
1614 ObjectAttributes
.SecurityDescriptor
= NULL
;
1615 ObjectAttributes
.SecurityQualityOfService
= &Qos
;
1617 /* Create the logon token */
1618 Status
= NtCreateToken(&TokenHandle
,
1621 (RequestMsg
->LogonUser
.Request
.LogonType
== Network
) ? TokenImpersonation
: TokenPrimary
,
1622 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1623 &TokenInfo1
->ExpirationTime
,
1626 TokenInfo1
->Privileges
? TokenInfo1
->Privileges
: &NoPrivileges
,
1628 &TokenInfo1
->PrimaryGroup
,
1629 &TokenInfo1
->DefaultDacl
,
1630 &RequestMsg
->LogonUser
.Request
.SourceContext
);
1631 if (!NT_SUCCESS(Status
))
1633 ERR("NtCreateToken failed (Status 0x%08lx)\n", Status
);
1639 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1640 Status
= STATUS_NOT_IMPLEMENTED
;
1644 if (LogonType
== Interactive
||
1645 LogonType
== Batch
||
1646 LogonType
== Service
)
1648 UserName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->UserName
;
1649 LogonDomainName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->LogonDomainName
;
1653 FIXME("LogonType %lu is not supported yet!\n", LogonType
);
1656 Status
= LsapSetLogonSessionData(&RequestMsg
->LogonUser
.Reply
.LogonId
,
1660 TokenInfo1
->User
.User
.Sid
);
1661 if (!NT_SUCCESS(Status
))
1663 ERR("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status
);
1668 * Duplicate the token handle into the client process.
1669 * This must be the last step because we cannot
1670 * close the duplicated token handle in case something fails.
1672 Status
= NtDuplicateObject(NtCurrentProcess(),
1674 LogonContext
->ClientProcessHandle
,
1675 &RequestMsg
->LogonUser
.Reply
.Token
,
1678 DUPLICATE_SAME_ACCESS
| DUPLICATE_SAME_ATTRIBUTES
| DUPLICATE_CLOSE_SOURCE
);
1679 if (!NT_SUCCESS(Status
))
1681 ERR("NtDuplicateObject failed (Status 0x%08lx)\n", Status
);
1686 if (!NT_SUCCESS(Status
))
1688 /* Notify the authentification package of the failure */
1689 Package
->LsaApLogonTerminated(&RequestMsg
->LogonUser
.Reply
.LogonId
);
1691 /* Delete the logon session */
1692 LsapDeleteLogonSession(&RequestMsg
->LogonUser
.Reply
.LogonId
);
1694 /* Release the profile buffer */
1695 LsapFreeClientBuffer((PLSA_CLIENT_REQUEST
)LogonContext
,
1696 RequestMsg
->LogonUser
.Reply
.ProfileBuffer
);
1697 RequestMsg
->LogonUser
.Reply
.ProfileBuffer
= NULL
;
1700 if (TokenHandle
!= NULL
)
1701 NtClose(TokenHandle
);
1703 /* Free the local groups */
1704 if (LocalGroups
!= NULL
)
1706 for (i
= 0; i
< LocalGroups
->GroupCount
; i
++)
1708 if (LocalGroups
->Groups
[i
].Sid
!= NULL
)
1709 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
->Groups
[i
].Sid
);
1712 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
);
1715 /* Free the local authentication info buffer */
1716 if (LocalAuthInfo
!= NULL
)
1717 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1719 /* Free the token information */
1720 if (TokenInformation
!= NULL
)
1722 if (TokenInformationType
== LsaTokenInformationNull
)
1724 TokenInfo0
= (PLSA_TOKEN_INFORMATION_NULL
)TokenInformation
;
1726 if (TokenInfo0
!= NULL
)
1728 if (TokenInfo0
->Groups
!= NULL
)
1730 for (i
= 0; i
< TokenInfo0
->Groups
->GroupCount
; i
++)
1732 if (TokenInfo0
->Groups
->Groups
[i
].Sid
!= NULL
)
1733 LsapFreeHeap(TokenInfo0
->Groups
->Groups
[i
].Sid
);
1736 LsapFreeHeap(TokenInfo0
->Groups
);
1739 LsapFreeHeap(TokenInfo0
);
1742 else if (TokenInformationType
== LsaTokenInformationV1
)
1744 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1746 if (TokenInfo1
!= NULL
)
1748 if (TokenInfo1
->User
.User
.Sid
!= NULL
)
1749 LsapFreeHeap(TokenInfo1
->User
.User
.Sid
);
1751 if (TokenInfo1
->Groups
!= NULL
)
1753 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1755 if (TokenInfo1
->Groups
->Groups
[i
].Sid
!= NULL
)
1756 LsapFreeHeap(TokenInfo1
->Groups
->Groups
[i
].Sid
);
1759 LsapFreeHeap(TokenInfo1
->Groups
);
1762 if (TokenInfo1
->PrimaryGroup
.PrimaryGroup
!= NULL
)
1763 LsapFreeHeap(TokenInfo1
->PrimaryGroup
.PrimaryGroup
);
1765 if (TokenInfo1
->Privileges
!= NULL
)
1766 LsapFreeHeap(TokenInfo1
->Privileges
);
1768 if (TokenInfo1
->Owner
.Owner
!= NULL
)
1769 LsapFreeHeap(TokenInfo1
->Owner
.Owner
);
1771 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1772 LsapFreeHeap(TokenInfo1
->DefaultDacl
.DefaultDacl
);
1774 LsapFreeHeap(TokenInfo1
);
1779 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1783 /* Free the account name */
1784 if (AccountName
!= NULL
)
1786 if (AccountName
->Buffer
!= NULL
)
1787 LsapFreeHeap(AccountName
->Buffer
);
1789 LsapFreeHeap(AccountName
);
1792 /* Free the authentication authority */
1793 if (AuthenticatingAuthority
!= NULL
)
1795 if (AuthenticatingAuthority
!= NULL
)
1796 LsapFreeHeap(AuthenticatingAuthority
->Buffer
);
1798 LsapFreeHeap(AuthenticatingAuthority
);
1801 /* Free the machine name */
1802 if (MachineName
!= NULL
)
1804 if (MachineName
->Buffer
!= NULL
)
1805 LsapFreeHeap(MachineName
->Buffer
);
1807 LsapFreeHeap(MachineName
);
1810 TRACE("LsapLogonUser done (Status 0x%08lx)\n", Status
);