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 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
.Sid
;
1151 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1153 if (EqualSid(TokenInfo1
->Groups
->Groups
[i
].Sid
, LsapAdministratorsSid
))
1155 OwnerSid
= LsapAdministratorsSid
;
1160 Length
= RtlLengthSid(OwnerSid
);
1161 TokenInfo1
->Owner
.Owner
= DispatchTable
.AllocateLsaHeap(Length
);
1162 if (TokenInfo1
->Owner
.Owner
== NULL
)
1163 return STATUS_INSUFFICIENT_RESOURCES
;
1165 RtlCopyMemory(TokenInfo1
->Owner
.Owner
,
1170 return STATUS_SUCCESS
;
1176 LsapAddTokenDefaultDacl(
1177 IN PVOID TokenInformation
,
1178 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1180 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1184 if (TokenInformationType
== LsaTokenInformationV1
)
1186 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1188 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1189 return STATUS_SUCCESS
;
1191 Length
= sizeof(ACL
) +
1192 (2 * sizeof(ACCESS_ALLOWED_ACE
)) +
1193 RtlLengthSid(TokenInfo1
->Owner
.Owner
) +
1194 RtlLengthSid(LsapLocalSystemSid
);
1196 Dacl
= DispatchTable
.AllocateLsaHeap(Length
);
1198 return STATUS_INSUFFICIENT_RESOURCES
;
1200 RtlCreateAcl(Dacl
, Length
, ACL_REVISION
);
1202 RtlAddAccessAllowedAce(Dacl
,
1205 TokenInfo1
->Owner
.Owner
);
1208 RtlAddAccessAllowedAce(Dacl
,
1211 LsapLocalSystemSid
);
1213 TokenInfo1
->DefaultDacl
.DefaultDacl
= Dacl
;
1216 return STATUS_SUCCESS
;
1222 LsapAddPrivilegeToTokenPrivileges(PTOKEN_PRIVILEGES
*TokenPrivileges
,
1223 PLSAPR_LUID_AND_ATTRIBUTES Privilege
)
1225 PTOKEN_PRIVILEGES LocalPrivileges
;
1226 ULONG Length
, TokenPrivilegeCount
, i
;
1227 NTSTATUS Status
= STATUS_SUCCESS
;
1229 if (*TokenPrivileges
== NULL
)
1231 Length
= sizeof(TOKEN_PRIVILEGES
) +
1232 (1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1233 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1236 if (LocalPrivileges
== NULL
)
1237 return STATUS_INSUFFICIENT_RESOURCES
;
1239 LocalPrivileges
->PrivilegeCount
= 1;
1240 LocalPrivileges
->Privileges
[0].Luid
= Privilege
->Luid
;
1241 LocalPrivileges
->Privileges
[0].Attributes
= Privilege
->Attributes
;
1245 TokenPrivilegeCount
= (*TokenPrivileges
)->PrivilegeCount
;
1247 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1249 if (RtlEqualLuid(&(*TokenPrivileges
)->Privileges
[i
].Luid
, &Privilege
->Luid
))
1250 return STATUS_SUCCESS
;
1253 Length
= sizeof(TOKEN_PRIVILEGES
) +
1254 (TokenPrivilegeCount
+ 1 - ANYSIZE_ARRAY
) * sizeof(LUID_AND_ATTRIBUTES
);
1255 LocalPrivileges
= RtlAllocateHeap(RtlGetProcessHeap(),
1258 if (LocalPrivileges
== NULL
)
1259 return STATUS_INSUFFICIENT_RESOURCES
;
1261 LocalPrivileges
->PrivilegeCount
= TokenPrivilegeCount
+ 1;
1262 for (i
= 0; i
< TokenPrivilegeCount
; i
++)
1264 LocalPrivileges
->Privileges
[i
].Luid
= (*TokenPrivileges
)->Privileges
[i
].Luid
;
1265 LocalPrivileges
->Privileges
[i
].Attributes
= (*TokenPrivileges
)->Privileges
[i
].Attributes
;
1268 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Luid
= Privilege
->Luid
;
1269 LocalPrivileges
->Privileges
[TokenPrivilegeCount
].Attributes
= Privilege
->Attributes
;
1271 RtlFreeHeap(RtlGetProcessHeap(), 0, *TokenPrivileges
);
1274 *TokenPrivileges
= LocalPrivileges
;
1282 IN PVOID TokenInformation
,
1283 IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType
)
1285 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
;
1286 LSAPR_HANDLE PolicyHandle
= NULL
;
1287 LSAPR_HANDLE AccountHandle
= NULL
;
1288 PLSAPR_PRIVILEGE_SET Privileges
= NULL
;
1292 if (TokenInformationType
== LsaTokenInformationV1
)
1294 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1296 Status
= LsarOpenPolicy(NULL
,
1300 if (!NT_SUCCESS(Status
))
1303 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1305 Status
= LsarOpenAccount(PolicyHandle
,
1306 TokenInfo1
->Groups
->Groups
[i
].Sid
,
1309 if (!NT_SUCCESS(Status
))
1312 Status
= LsarEnumeratePrivilegesAccount(AccountHandle
,
1314 if (NT_SUCCESS(Status
))
1316 for (j
= 0; j
< Privileges
->PrivilegeCount
; j
++)
1318 Status
= LsapAddPrivilegeToTokenPrivileges(&TokenInfo1
->Privileges
,
1319 &(Privileges
->Privilege
[j
]));
1320 if (!NT_SUCCESS(Status
))
1322 /* We failed, clean everything and return */
1323 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1324 LsarClose(&AccountHandle
);
1325 LsarClose(&PolicyHandle
);
1331 LsaIFree_LSAPR_PRIVILEGE_SET(Privileges
);
1335 LsarClose(&AccountHandle
);
1338 LsarClose(&PolicyHandle
);
1340 if (TokenInfo1
->Privileges
!= NULL
)
1342 for (i
= 0; i
< TokenInfo1
->Privileges
->PrivilegeCount
; i
++)
1344 if (RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeChangeNotifyPrivilege
) ||
1345 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeCreateGlobalPrivilege
) ||
1346 RtlEqualLuid(&TokenInfo1
->Privileges
->Privileges
[i
].Luid
, &SeImpersonatePrivilege
))
1348 TokenInfo1
->Privileges
->Privileges
[i
].Attributes
|= SE_PRIVILEGE_ENABLED
| SE_PRIVILEGE_ENABLED_BY_DEFAULT
;
1354 return STATUS_SUCCESS
;
1359 LsapLogonUser(PLSA_API_MSG RequestMsg
,
1360 PLSAP_LOGON_CONTEXT LogonContext
)
1362 PAUTH_PACKAGE Package
;
1363 OBJECT_ATTRIBUTES ObjectAttributes
;
1364 SECURITY_QUALITY_OF_SERVICE Qos
;
1365 LSA_TOKEN_INFORMATION_TYPE TokenInformationType
;
1366 PVOID TokenInformation
= NULL
;
1367 PLSA_TOKEN_INFORMATION_V1 TokenInfo1
= NULL
;
1368 PUNICODE_STRING AccountName
= NULL
;
1369 PUNICODE_STRING AuthenticatingAuthority
= NULL
;
1370 PUNICODE_STRING MachineName
= NULL
;
1371 PVOID LocalAuthInfo
= NULL
;
1372 PTOKEN_GROUPS LocalGroups
= NULL
;
1373 HANDLE TokenHandle
= NULL
;
1376 SECURITY_LOGON_TYPE LogonType
;
1379 PUNICODE_STRING UserName
= NULL
;
1380 PUNICODE_STRING LogonDomainName
= NULL
;
1381 // UNICODE_STRING LogonServer;
1384 TRACE("LsapLogonUser(%p %p)\n", RequestMsg
, LogonContext
);
1386 PackageId
= RequestMsg
->LogonUser
.Request
.AuthenticationPackage
;
1387 LogonType
= RequestMsg
->LogonUser
.Request
.LogonType
;
1389 /* Get the right authentication package */
1390 Package
= LsapGetAuthenticationPackage(PackageId
);
1391 if (Package
== NULL
)
1393 ERR("LsapGetAuthenticationPackage() failed to find a package\n");
1394 return STATUS_NO_SUCH_PACKAGE
;
1397 if (RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
> 0)
1399 /* Allocate the local authentication info buffer */
1400 LocalAuthInfo
= RtlAllocateHeap(RtlGetProcessHeap(),
1402 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
);
1403 if (LocalAuthInfo
== NULL
)
1405 ERR("RtlAllocateHeap() failed\n");
1406 return STATUS_INSUFFICIENT_RESOURCES
;
1409 /* Read the authentication info from the callers address space */
1410 Status
= NtReadVirtualMemory(LogonContext
->ClientProcessHandle
,
1411 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1413 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1415 if (!NT_SUCCESS(Status
))
1417 ERR("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status
);
1418 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1423 if (RequestMsg
->LogonUser
.Request
.LocalGroupsCount
> 0)
1425 Status
= LsapCopyLocalGroups(LogonContext
,
1426 RequestMsg
->LogonUser
.Request
.LocalGroups
,
1427 RequestMsg
->LogonUser
.Request
.LocalGroupsCount
,
1429 if (!NT_SUCCESS(Status
))
1431 ERR("LsapCopyLocalGroups failed (Status 0x%08lx)\n", Status
);
1435 TRACE("GroupCount: %lu\n", LocalGroups
->GroupCount
);
1438 if (Package
->LsaApLogonUserEx2
!= NULL
)
1440 Status
= Package
->LsaApLogonUserEx2((PLSA_CLIENT_REQUEST
)LogonContext
,
1441 RequestMsg
->LogonUser
.Request
.LogonType
,
1443 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1444 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1445 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1446 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1447 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1448 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1449 &TokenInformationType
,
1452 &AuthenticatingAuthority
,
1454 NULL
, /* FIXME: PSECPKG_PRIMARY_CRED PrimaryCredentials */
1455 NULL
); /* FIXME: PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials */
1457 else if (Package
->LsaApLogonUserEx
!= NULL
)
1459 Status
= Package
->LsaApLogonUserEx((PLSA_CLIENT_REQUEST
)LogonContext
,
1460 RequestMsg
->LogonUser
.Request
.LogonType
,
1462 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1463 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1464 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1465 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1466 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1467 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1468 &TokenInformationType
,
1471 &AuthenticatingAuthority
,
1476 Status
= Package
->LsaApLogonUser((PLSA_CLIENT_REQUEST
)LogonContext
,
1477 RequestMsg
->LogonUser
.Request
.LogonType
,
1479 RequestMsg
->LogonUser
.Request
.AuthenticationInformation
,
1480 RequestMsg
->LogonUser
.Request
.AuthenticationInformationLength
,
1481 &RequestMsg
->LogonUser
.Reply
.ProfileBuffer
,
1482 &RequestMsg
->LogonUser
.Reply
.ProfileBufferLength
,
1483 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1484 &RequestMsg
->LogonUser
.Reply
.SubStatus
,
1485 &TokenInformationType
,
1488 &AuthenticatingAuthority
);
1491 if (!NT_SUCCESS(Status
))
1493 ERR("LsaApLogonUser/Ex/2 failed (Status 0x%08lx)\n", Status
);
1497 if (LocalGroups
->GroupCount
> 0)
1499 /* Add local groups to the token information */
1500 Status
= LsapAddLocalGroups(TokenInformation
,
1501 TokenInformationType
,
1503 if (!NT_SUCCESS(Status
))
1505 ERR("LsapAddLocalGroupsToTokenInfo() failed (Status 0x%08lx)\n", Status
);
1510 Status
= LsapAddDefaultGroups(TokenInformation
,
1511 TokenInformationType
,
1513 if (!NT_SUCCESS(Status
))
1515 ERR("LsapAddDefaultGroups() failed (Status 0x%08lx)\n", Status
);
1519 Status
= LsapAddSamGroups(TokenInformation
,
1520 TokenInformationType
);
1521 if (!NT_SUCCESS(Status
))
1523 ERR("LsapAddSamGroups() failed (Status 0x%08lx)\n", Status
);
1527 Status
= LsapSetTokenOwner(TokenInformation
,
1528 TokenInformationType
);
1529 if (!NT_SUCCESS(Status
))
1531 ERR("LsapSetTokenOwner() failed (Status 0x%08lx)\n", Status
);
1535 Status
= LsapAddTokenDefaultDacl(TokenInformation
,
1536 TokenInformationType
);
1537 if (!NT_SUCCESS(Status
))
1539 ERR("LsapAddTokenDefaultDacl() failed (Status 0x%08lx)\n", Status
);
1543 Status
= LsapSetPrivileges(TokenInformation
,
1544 TokenInformationType
);
1545 if (!NT_SUCCESS(Status
))
1547 ERR("LsapSetPrivileges() failed (Status 0x%08lx)\n", Status
);
1551 if (TokenInformationType
== LsaTokenInformationV1
)
1553 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1555 Qos
.Length
= sizeof(SECURITY_QUALITY_OF_SERVICE
);
1556 Qos
.ImpersonationLevel
= SecurityImpersonation
;
1557 Qos
.ContextTrackingMode
= SECURITY_DYNAMIC_TRACKING
;
1558 Qos
.EffectiveOnly
= FALSE
;
1560 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
1561 ObjectAttributes
.RootDirectory
= NULL
;
1562 ObjectAttributes
.ObjectName
= NULL
;
1563 ObjectAttributes
.Attributes
= 0;
1564 ObjectAttributes
.SecurityDescriptor
= NULL
;
1565 ObjectAttributes
.SecurityQualityOfService
= &Qos
;
1567 /* Create the logon token */
1568 Status
= NtCreateToken(&TokenHandle
,
1572 &RequestMsg
->LogonUser
.Reply
.LogonId
,
1573 &TokenInfo1
->ExpirationTime
,
1576 TokenInfo1
->Privileges
,
1578 &TokenInfo1
->PrimaryGroup
,
1579 &TokenInfo1
->DefaultDacl
,
1580 &RequestMsg
->LogonUser
.Request
.SourceContext
);
1581 if (!NT_SUCCESS(Status
))
1583 ERR("NtCreateToken failed (Status 0x%08lx)\n", Status
);
1589 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1590 Status
= STATUS_NOT_IMPLEMENTED
;
1594 /* Duplicate the token handle into the client process */
1595 Status
= NtDuplicateObject(NtCurrentProcess(),
1597 LogonContext
->ClientProcessHandle
,
1598 &RequestMsg
->LogonUser
.Reply
.Token
,
1601 DUPLICATE_SAME_ACCESS
| DUPLICATE_SAME_ATTRIBUTES
| DUPLICATE_CLOSE_SOURCE
);
1602 if (!NT_SUCCESS(Status
))
1604 ERR("NtDuplicateObject failed (Status 0x%08lx)\n", Status
);
1608 // TokenHandle = NULL;
1610 if (LogonType
== Interactive
||
1611 LogonType
== Batch
||
1612 LogonType
== Service
)
1614 UserName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->UserName
;
1615 LogonDomainName
= &((PMSV1_0_INTERACTIVE_LOGON
)LocalAuthInfo
)->LogonDomainName
;
1619 FIXME("LogonType %lu is not supported yet!\n", LogonType
);
1622 Status
= LsapSetLogonSessionData(&RequestMsg
->LogonUser
.Reply
.LogonId
,
1626 TokenInfo1
->User
.User
.Sid
);
1627 if (!NT_SUCCESS(Status
))
1629 ERR("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status
);
1634 // if (!NT_SUCCESS(Status))
1636 if (TokenHandle
!= NULL
)
1637 NtClose(TokenHandle
);
1640 /* Free the local groups */
1641 if (LocalGroups
!= NULL
)
1643 for (i
= 0; i
< LocalGroups
->GroupCount
; i
++)
1645 if (LocalGroups
->Groups
[i
].Sid
!= NULL
)
1646 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
->Groups
[i
].Sid
);
1649 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups
);
1652 /* Free the local authentication info buffer */
1653 if (LocalAuthInfo
!= NULL
)
1654 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo
);
1656 /* Free the token information */
1657 if (TokenInformation
!= NULL
)
1659 if (TokenInformationType
== LsaTokenInformationV1
)
1661 TokenInfo1
= (PLSA_TOKEN_INFORMATION_V1
)TokenInformation
;
1663 if (TokenInfo1
!= NULL
)
1665 if (TokenInfo1
->User
.User
.Sid
!= NULL
)
1666 LsapFreeHeap(TokenInfo1
->User
.User
.Sid
);
1668 if (TokenInfo1
->Groups
!= NULL
)
1670 for (i
= 0; i
< TokenInfo1
->Groups
->GroupCount
; i
++)
1672 if (TokenInfo1
->Groups
->Groups
[i
].Sid
!= NULL
)
1673 LsapFreeHeap(TokenInfo1
->Groups
->Groups
[i
].Sid
);
1676 LsapFreeHeap(TokenInfo1
->Groups
);
1679 if (TokenInfo1
->PrimaryGroup
.PrimaryGroup
!= NULL
)
1680 LsapFreeHeap(TokenInfo1
->PrimaryGroup
.PrimaryGroup
);
1682 if (TokenInfo1
->Privileges
!= NULL
)
1683 LsapFreeHeap(TokenInfo1
->Privileges
);
1685 if (TokenInfo1
->Owner
.Owner
!= NULL
)
1686 LsapFreeHeap(TokenInfo1
->Owner
.Owner
);
1688 if (TokenInfo1
->DefaultDacl
.DefaultDacl
!= NULL
)
1689 LsapFreeHeap(TokenInfo1
->DefaultDacl
.DefaultDacl
);
1691 LsapFreeHeap(TokenInfo1
);
1696 FIXME("TokenInformationType %d is not supported!\n", TokenInformationType
);
1700 /* Free the account name */
1701 if (AccountName
!= NULL
)
1703 if (AccountName
->Buffer
!= NULL
)
1704 LsapFreeHeap(AccountName
->Buffer
);
1706 LsapFreeHeap(AccountName
);
1709 /* Free the authentication authority */
1710 if (AuthenticatingAuthority
!= NULL
)
1712 if (AuthenticatingAuthority
!= NULL
)
1713 LsapFreeHeap(AuthenticatingAuthority
->Buffer
);
1715 LsapFreeHeap(AuthenticatingAuthority
);
1718 /* Free the machine name */
1719 if (MachineName
!= NULL
)
1721 if (MachineName
->Buffer
!= NULL
)
1722 LsapFreeHeap(MachineName
->Buffer
);
1724 LsapFreeHeap(MachineName
);
1727 TRACE("LsapLogonUser done (Status 0x%08lx)\n", Status
);