[MSGINA]
[reactos.git] / reactos / dll / win32 / msgina / lsa.c
1 /*
2 * PROJECT: ReactOS msgina.dll
3 * FILE: dll/win32/msgina/gui.c
4 * PURPOSE: ReactOS Logon GINA DLL
5 * PROGRAMMER: Eric Kohl
6 */
7
8 #include "msgina.h"
9
10 NTSTATUS
11 ConnectToLsa(
12 PGINA_CONTEXT pgContext)
13 {
14 LSA_STRING LogonProcessName;
15 LSA_STRING PackageName;
16 LSA_OPERATIONAL_MODE SecurityMode = 0;
17 NTSTATUS Status;
18
19 /* We are already connected to the LSA */
20 if (pgContext->LsaHandle != NULL)
21 return STATUS_SUCCESS;
22
23 /* Connect to the LSA server */
24 RtlInitAnsiString((PANSI_STRING)&LogonProcessName,
25 "MSGINA");
26
27 Status = LsaRegisterLogonProcess(&LogonProcessName,
28 &pgContext->LsaHandle,
29 &SecurityMode);
30 if (!NT_SUCCESS(Status))
31 {
32 ERR("LsaRegisterLogonProcess failed (Status 0x%08lx)\n", Status);
33 return Status;
34 }
35
36 /* Get the authentication package */
37 RtlInitAnsiString((PANSI_STRING)&PackageName,
38 MSV1_0_PACKAGE_NAME);
39
40 Status = LsaLookupAuthenticationPackage(pgContext->LsaHandle,
41 &PackageName,
42 &pgContext->AuthenticationPackage);
43 if (!NT_SUCCESS(Status))
44 {
45 ERR("LsaLookupAuthenticationPackage failed (Status 0x%08lx)\n", Status);
46 }
47
48 return Status;
49 }
50
51
52 NTSTATUS
53 MyLogonUser(
54 HANDLE LsaHandle,
55 ULONG AuthenticationPackage,
56 LPWSTR lpszUsername,
57 LPWSTR lpszDomain,
58 LPWSTR lpszPassword,
59 PHANDLE phToken,
60 PNTSTATUS SubStatus)
61 {
62 SID_IDENTIFIER_AUTHORITY LocalAuthority = {SECURITY_LOCAL_SID_AUTHORITY};
63 SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY};
64 PSID LogonSid = NULL;
65 PSID LocalSid = NULL;
66 LSA_STRING OriginName;
67 UNICODE_STRING DomainName;
68 UNICODE_STRING UserName;
69 UNICODE_STRING Password;
70 PMSV1_0_INTERACTIVE_LOGON AuthInfo = NULL;
71 ULONG AuthInfoLength;
72 ULONG_PTR Ptr;
73 TOKEN_SOURCE TokenSource;
74 PTOKEN_GROUPS TokenGroups = NULL;
75 PMSV1_0_INTERACTIVE_PROFILE ProfileBuffer = NULL;
76 ULONG ProfileBufferLength = 0;
77 LUID Luid = {0, 0};
78 LUID LogonId = {0, 0};
79 HANDLE TokenHandle = NULL;
80 QUOTA_LIMITS QuotaLimits;
81 NTSTATUS Status;
82
83 *phToken = NULL;
84
85 RtlInitAnsiString((PANSI_STRING)&OriginName,
86 "MSGINA Logon");
87
88 RtlInitUnicodeString(&DomainName,
89 lpszDomain);
90
91 RtlInitUnicodeString(&UserName,
92 lpszUsername);
93
94 RtlInitUnicodeString(&Password,
95 lpszPassword);
96
97 AuthInfoLength = sizeof(MSV1_0_INTERACTIVE_LOGON)+
98 DomainName.MaximumLength +
99 UserName.MaximumLength +
100 Password.MaximumLength;
101
102 AuthInfo = RtlAllocateHeap(RtlGetProcessHeap(),
103 HEAP_ZERO_MEMORY,
104 AuthInfoLength);
105 if (AuthInfo == NULL)
106 {
107 Status = STATUS_INSUFFICIENT_RESOURCES;
108 goto done;
109 }
110
111 AuthInfo->MessageType = MsV1_0InteractiveLogon;
112
113 Ptr = (ULONG_PTR)AuthInfo + sizeof(MSV1_0_INTERACTIVE_LOGON);
114
115 AuthInfo->LogonDomainName.Length = DomainName.Length;
116 AuthInfo->LogonDomainName.MaximumLength = DomainName.MaximumLength;
117 AuthInfo->LogonDomainName.Buffer = (DomainName.Buffer == NULL) ? NULL : (PWCHAR)Ptr;
118 if (DomainName.MaximumLength > 0)
119 {
120 RtlCopyMemory(AuthInfo->LogonDomainName.Buffer,
121 DomainName.Buffer,
122 DomainName.MaximumLength);
123
124 Ptr += DomainName.MaximumLength;
125 }
126
127 AuthInfo->UserName.Length = UserName.Length;
128 AuthInfo->UserName.MaximumLength = UserName.MaximumLength;
129 AuthInfo->UserName.Buffer = (PWCHAR)Ptr;
130 if (UserName.MaximumLength > 0)
131 RtlCopyMemory(AuthInfo->UserName.Buffer,
132 UserName.Buffer,
133 UserName.MaximumLength);
134
135 Ptr += UserName.MaximumLength;
136
137 AuthInfo->Password.Length = Password.Length;
138 AuthInfo->Password.MaximumLength = Password.MaximumLength;
139 AuthInfo->Password.Buffer = (PWCHAR)Ptr;
140 if (Password.MaximumLength > 0)
141 RtlCopyMemory(AuthInfo->Password.Buffer,
142 Password.Buffer,
143 Password.MaximumLength);
144
145 /* Create the Logon SID*/
146 AllocateLocallyUniqueId(&LogonId);
147 Status = RtlAllocateAndInitializeSid(&SystemAuthority,
148 SECURITY_LOGON_IDS_RID_COUNT,
149 SECURITY_LOGON_IDS_RID,
150 LogonId.HighPart,
151 LogonId.LowPart,
152 SECURITY_NULL_RID,
153 SECURITY_NULL_RID,
154 SECURITY_NULL_RID,
155 SECURITY_NULL_RID,
156 SECURITY_NULL_RID,
157 &LogonSid);
158 if (!NT_SUCCESS(Status))
159 goto done;
160
161 /* Create the Local SID*/
162 Status = RtlAllocateAndInitializeSid(&LocalAuthority,
163 1,
164 SECURITY_LOCAL_RID,
165 SECURITY_NULL_RID,
166 SECURITY_NULL_RID,
167 SECURITY_NULL_RID,
168 SECURITY_NULL_RID,
169 SECURITY_NULL_RID,
170 SECURITY_NULL_RID,
171 SECURITY_NULL_RID,
172 &LocalSid);
173 if (!NT_SUCCESS(Status))
174 goto done;
175
176 /* Allocate and set the token groups */
177 TokenGroups = RtlAllocateHeap(RtlGetProcessHeap(),
178 HEAP_ZERO_MEMORY,
179 sizeof(TOKEN_GROUPS) + ((2 - ANYSIZE_ARRAY) * sizeof(SID_AND_ATTRIBUTES)));
180 if (TokenGroups == NULL)
181 {
182 Status = STATUS_INSUFFICIENT_RESOURCES;
183 goto done;
184 }
185
186 TokenGroups->GroupCount = 2;
187 TokenGroups->Groups[0].Sid = LogonSid;
188 TokenGroups->Groups[0].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED |
189 SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_LOGON_ID;
190 TokenGroups->Groups[1].Sid = LocalSid;
191 TokenGroups->Groups[1].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED |
192 SE_GROUP_ENABLED_BY_DEFAULT;
193
194 /* Set the token source */
195 strcpy(TokenSource.SourceName, "LogonUser");
196 AllocateLocallyUniqueId(&TokenSource.SourceIdentifier);
197
198 Status = LsaLogonUser(LsaHandle,
199 &OriginName,
200 Interactive,
201 AuthenticationPackage,
202 (PVOID)AuthInfo,
203 AuthInfoLength,
204 TokenGroups,
205 &TokenSource,
206 (PVOID*)&ProfileBuffer,
207 &ProfileBufferLength,
208 &Luid,
209 &TokenHandle,
210 &QuotaLimits,
211 SubStatus);
212 if (!NT_SUCCESS(Status))
213 {
214 ERR("LsaLogonUser failed (Status 0x%08lx)\n", Status);
215 goto done;
216 }
217
218 if (ProfileBuffer != NULL)
219 {
220 TRACE("ProfileBuffer: %p\n", ProfileBuffer);
221 TRACE("MessageType: %u\n", ProfileBuffer->MessageType);
222
223 TRACE("FullName: %p\n", ProfileBuffer->FullName.Buffer);
224 TRACE("FullName: %S\n", ProfileBuffer->FullName.Buffer);
225
226 TRACE("LogonServer: %p\n", ProfileBuffer->LogonServer.Buffer);
227 TRACE("LogonServer: %S\n", ProfileBuffer->LogonServer.Buffer);
228 }
229
230 TRACE("Luid: 0x%08lx%08lx\n", Luid.HighPart, Luid.LowPart);
231
232 if (TokenHandle != NULL)
233 {
234 TRACE("TokenHandle: %p\n", TokenHandle);
235 }
236
237 *phToken = TokenHandle;
238
239 done:
240 if (ProfileBuffer != NULL)
241 LsaFreeReturnBuffer(ProfileBuffer);
242
243 if (!NT_SUCCESS(Status))
244 {
245 if (TokenHandle != NULL)
246 CloseHandle(TokenHandle);
247 }
248
249 if (TokenGroups != NULL)
250 RtlFreeHeap(RtlGetProcessHeap(), 0, TokenGroups);
251
252 if (LocalSid != NULL)
253 RtlFreeSid(LocalSid);
254
255 if (LogonSid != NULL)
256 RtlFreeSid(LogonSid);
257
258 if (AuthInfo != NULL)
259 RtlFreeHeap(RtlGetProcessHeap(), 0, AuthInfo);
260
261 return Status;
262 }
263
264 /* EOF */