[MSV1_0]
[reactos.git] / reactos / dll / win32 / msv1_0 / msv1_0.c
1 /*
2 * PROJECT: Authentication Package DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/msv1_0/msv1_0.c
5 * PURPOSE: Main file
6 * COPYRIGHT: Copyright 2013 Eric Kohl
7 */
8
9 /* INCLUDES ****************************************************************/
10
11 #include "msv1_0.h"
12
13 WINE_DEFAULT_DEBUG_CHANNEL(msv1_0);
14
15
16 /* GLOBALS *****************************************************************/
17
18 LSA_DISPATCH_TABLE DispatchTable;
19
20
21 /* FUNCTIONS ***************************************************************/
22
23 static
24 NTSTATUS
25 GetDomainSid(PRPC_SID *Sid)
26 {
27 LSAPR_HANDLE PolicyHandle = NULL;
28 PLSAPR_POLICY_INFORMATION PolicyInfo = NULL;
29 ULONG Length = 0;
30 NTSTATUS Status;
31
32 Status = LsaIOpenPolicyTrusted(&PolicyHandle);
33 if (!NT_SUCCESS(Status))
34 {
35 TRACE("LsaIOpenPolicyTrusted() failed (Status 0x%08lx)\n", Status);
36 return Status;
37 }
38
39 Status = LsarQueryInformationPolicy(PolicyHandle,
40 PolicyAccountDomainInformation,
41 &PolicyInfo);
42 if (!NT_SUCCESS(Status))
43 {
44 TRACE("LsarQueryInformationPolicy() failed (Status 0x%08lx)\n", Status);
45 goto done;
46 }
47
48 Length = RtlLengthSid(PolicyInfo->PolicyAccountDomainInfo.Sid);
49
50 *Sid = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length);
51 if (*Sid == NULL)
52 {
53 ERR("Failed to allocate SID\n");
54 Status = STATUS_INSUFFICIENT_RESOURCES;
55 goto done;
56 }
57
58 memcpy(*Sid, PolicyInfo->PolicyAccountDomainInfo.Sid, Length);
59
60 done:
61 if (PolicyInfo != NULL)
62 LsaIFree_LSAPR_POLICY_INFORMATION(PolicyAccountDomainInformation,
63 PolicyInfo);
64
65 if (PolicyHandle != NULL)
66 LsarClose(&PolicyHandle);
67
68 return Status;
69 }
70
71
72 static
73 NTSTATUS
74 BuildInteractiveProfileBuffer(IN PLSA_CLIENT_REQUEST ClientRequest,
75 IN PSAMPR_USER_INFO_BUFFER UserInfo,
76 IN PUNICODE_STRING LogonServer,
77 OUT PMSV1_0_INTERACTIVE_PROFILE *ProfileBuffer,
78 OUT PULONG ProfileBufferLength)
79 {
80 PMSV1_0_INTERACTIVE_PROFILE LocalBuffer = NULL;
81 PVOID ClientBaseAddress = NULL;
82 LPWSTR Ptr;
83 ULONG BufferLength;
84 NTSTATUS Status;
85
86 *ProfileBuffer = NULL;
87 *ProfileBufferLength = 0;
88
89 BufferLength = sizeof(MSV1_0_INTERACTIVE_PROFILE) +
90 UserInfo->All.FullName.Length + sizeof(WCHAR) +
91 UserInfo->All.HomeDirectory.Length + sizeof(WCHAR) +
92 UserInfo->All.HomeDirectoryDrive.Length + sizeof(WCHAR) +
93 UserInfo->All.ScriptPath.Length + sizeof(WCHAR) +
94 UserInfo->All.ProfilePath.Length + sizeof(WCHAR) +
95 LogonServer->Length + sizeof(WCHAR);
96
97 LocalBuffer = DispatchTable.AllocateLsaHeap(BufferLength);
98 if (LocalBuffer == NULL)
99 {
100 TRACE("Failed to allocate the local buffer!\n");
101 Status = STATUS_INSUFFICIENT_RESOURCES;
102 goto done;
103 }
104
105 Status = DispatchTable.AllocateClientBuffer(ClientRequest,
106 BufferLength,
107 &ClientBaseAddress);
108 if (!NT_SUCCESS(Status))
109 {
110 TRACE("DispatchTable.AllocateClientBuffer failed (Status 0x%08lx)\n", Status);
111 goto done;
112 }
113
114 TRACE("ClientBaseAddress: %p\n", ClientBaseAddress);
115
116 Ptr = (LPWSTR)((ULONG_PTR)LocalBuffer + sizeof(MSV1_0_INTERACTIVE_PROFILE));
117
118 LocalBuffer->MessageType = MsV1_0InteractiveProfile;
119 LocalBuffer->LogonCount = UserInfo->All.LogonCount;
120 LocalBuffer->BadPasswordCount = UserInfo->All.BadPasswordCount;
121 // LARGE_INTEGER LogonTime;
122 // LARGE_INTEGER LogoffTime;
123 // LARGE_INTEGER KickOffTime;
124 // LARGE_INTEGER PasswordLastSet;
125 // LARGE_INTEGER PasswordCanChange;
126 // LARGE_INTEGER PasswordMustChange;
127
128 LocalBuffer->LogonScript.Length = UserInfo->All.ScriptPath.Length;
129 LocalBuffer->LogonScript.MaximumLength = UserInfo->All.ScriptPath.Length + sizeof(WCHAR);
130 LocalBuffer->LogonScript.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);
131 memcpy(Ptr,
132 UserInfo->All.ScriptPath.Buffer,
133 UserInfo->All.ScriptPath.Length);
134
135 Ptr = (LPWSTR)((ULONG_PTR)Ptr + LocalBuffer->LogonScript.MaximumLength);
136
137 LocalBuffer->HomeDirectory.Length = UserInfo->All.HomeDirectory.Length;
138 LocalBuffer->HomeDirectory.MaximumLength = UserInfo->All.HomeDirectory.Length + sizeof(WCHAR);
139 LocalBuffer->HomeDirectory.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);
140 memcpy(Ptr,
141 UserInfo->All.HomeDirectory.Buffer,
142 UserInfo->All.HomeDirectory.Length);
143
144 Ptr = (LPWSTR)((ULONG_PTR)Ptr + LocalBuffer->HomeDirectory.MaximumLength);
145
146 LocalBuffer->FullName.Length = UserInfo->All.FullName.Length;
147 LocalBuffer->FullName.MaximumLength = UserInfo->All.FullName.Length + sizeof(WCHAR);
148 LocalBuffer->FullName.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);
149 memcpy(Ptr,
150 UserInfo->All.FullName.Buffer,
151 UserInfo->All.FullName.Length);
152 TRACE("FullName.Buffer: %p\n", LocalBuffer->FullName.Buffer);
153
154 Ptr = (LPWSTR)((ULONG_PTR)Ptr + LocalBuffer->FullName.MaximumLength);
155
156 LocalBuffer->ProfilePath.Length = UserInfo->All.ProfilePath.Length;
157 LocalBuffer->ProfilePath.MaximumLength = UserInfo->All.ProfilePath.Length + sizeof(WCHAR);
158 LocalBuffer->ProfilePath.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);
159 memcpy(Ptr,
160 UserInfo->All.ProfilePath.Buffer,
161 UserInfo->All.ProfilePath.Length);
162
163 Ptr = (LPWSTR)((ULONG_PTR)Ptr + LocalBuffer->ProfilePath.MaximumLength);
164
165 LocalBuffer->HomeDirectoryDrive.Length = UserInfo->All.HomeDirectoryDrive.Length;
166 LocalBuffer->HomeDirectoryDrive.MaximumLength = UserInfo->All.HomeDirectoryDrive.Length + sizeof(WCHAR);
167 LocalBuffer->HomeDirectoryDrive.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);
168 memcpy(Ptr,
169 UserInfo->All.HomeDirectoryDrive.Buffer,
170 UserInfo->All.HomeDirectoryDrive.Length);
171
172 Ptr = (LPWSTR)((ULONG_PTR)Ptr + LocalBuffer->HomeDirectoryDrive.MaximumLength);
173
174 LocalBuffer->LogonServer.Length = LogonServer->Length;
175 LocalBuffer->LogonServer.MaximumLength = LogonServer->Length + sizeof(WCHAR);
176 LocalBuffer->LogonServer.Buffer = (LPWSTR)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)Ptr - (ULONG_PTR)LocalBuffer);;
177 memcpy(Ptr,
178 LogonServer->Buffer,
179 LogonServer->Length);
180
181 LocalBuffer->UserFlags = 0;
182
183 Status = DispatchTable.CopyToClientBuffer(ClientRequest,
184 BufferLength,
185 ClientBaseAddress,
186 LocalBuffer);
187 if (!NT_SUCCESS(Status))
188 {
189 TRACE("DispatchTable.CopyToClientBuffer failed (Status 0x%08lx)\n", Status);
190 goto done;
191 }
192
193 *ProfileBuffer = (PMSV1_0_INTERACTIVE_PROFILE)ClientBaseAddress;
194 *ProfileBufferLength = BufferLength;
195
196 done:
197 if (LocalBuffer != NULL)
198 DispatchTable.FreeLsaHeap(LocalBuffer);
199
200 if (!NT_SUCCESS(Status))
201 {
202 if (ClientBaseAddress != NULL)
203 DispatchTable.FreeClientBuffer(ClientRequest,
204 ClientBaseAddress);
205 }
206
207 return Status;
208 }
209
210
211 /*
212 * @unimplemented
213 */
214 NTSTATUS
215 NTAPI
216 LsaApCallPackage(IN PLSA_CLIENT_REQUEST ClientRequest,
217 IN PVOID ProtocolSubmitBuffer,
218 IN PVOID ClientBufferBase,
219 IN ULONG SubmitBufferLength,
220 OUT PVOID *ProtocolReturnBuffer,
221 OUT PULONG ReturnBufferLength,
222 OUT PNTSTATUS ProtocolStatus)
223 {
224 TRACE("()\n");
225 return STATUS_NOT_IMPLEMENTED;
226 }
227
228
229 /*
230 * @unimplemented
231 */
232 NTSTATUS
233 NTAPI
234 LsaApCallPackagePassthrough(IN PLSA_CLIENT_REQUEST ClientRequest,
235 IN PVOID ProtocolSubmitBuffer,
236 IN PVOID ClientBufferBase,
237 IN ULONG SubmitBufferLength,
238 OUT PVOID *ProtocolReturnBuffer,
239 OUT PULONG ReturnBufferLength,
240 OUT PNTSTATUS ProtocolStatus)
241 {
242 TRACE("()\n");
243 return STATUS_NOT_IMPLEMENTED;
244 }
245
246
247 /*
248 * @unimplemented
249 */
250 NTSTATUS
251 NTAPI
252 LsaApCallPackageUntrusted(IN PLSA_CLIENT_REQUEST ClientRequest,
253 IN PVOID ProtocolSubmitBuffer,
254 IN PVOID ClientBufferBase,
255 IN ULONG SubmitBufferLength,
256 OUT PVOID *ProtocolReturnBuffer,
257 OUT PULONG ReturnBufferLength,
258 OUT PNTSTATUS ProtocolStatus)
259 {
260 TRACE("()\n");
261 return STATUS_NOT_IMPLEMENTED;
262 }
263
264
265 /*
266 * @unimplemented
267 */
268 NTSTATUS
269 NTAPI
270 LsaApInitializePackage(IN ULONG AuthenticationPackageId,
271 IN PLSA_DISPATCH_TABLE LsaDispatchTable,
272 IN PLSA_STRING Database OPTIONAL,
273 IN PLSA_STRING Confidentiality OPTIONAL,
274 OUT PLSA_STRING *AuthenticationPackageName)
275 {
276 PANSI_STRING NameString;
277 PCHAR NameBuffer;
278
279 TRACE("(%lu %p %p %p %p)\n",
280 AuthenticationPackageId, LsaDispatchTable, Database,
281 Confidentiality, AuthenticationPackageName);
282
283 /* Get the dispatch table entries */
284 DispatchTable.AllocateLsaHeap = LsaDispatchTable->AllocateLsaHeap;
285 DispatchTable.FreeLsaHeap = LsaDispatchTable->FreeLsaHeap;
286 DispatchTable.AllocateClientBuffer = LsaDispatchTable->AllocateClientBuffer;
287 DispatchTable.FreeClientBuffer = LsaDispatchTable->FreeClientBuffer;
288 DispatchTable.CopyToClientBuffer = LsaDispatchTable->CopyToClientBuffer;
289 DispatchTable.CopyFromClientBuffer = LsaDispatchTable->CopyFromClientBuffer;
290
291
292 /* Return the package name */
293 NameString = DispatchTable.AllocateLsaHeap(sizeof(LSA_STRING));
294 if (NameString == NULL)
295 return STATUS_INSUFFICIENT_RESOURCES;
296
297 NameBuffer = DispatchTable.AllocateLsaHeap(sizeof(MSV1_0_PACKAGE_NAME));
298 if (NameBuffer == NULL)
299 {
300 DispatchTable.FreeLsaHeap(NameString);
301 return STATUS_INSUFFICIENT_RESOURCES;
302 }
303
304 strcpy(NameBuffer, MSV1_0_PACKAGE_NAME);
305
306 RtlInitAnsiString(NameString, NameBuffer);
307
308 *AuthenticationPackageName = (PLSA_STRING)NameString;
309
310 return STATUS_SUCCESS;
311 }
312
313
314 /*
315 * @unimplemented
316 */
317 VOID
318 NTAPI
319 LsaApLogonTerminated(IN PLUID LogonId)
320 {
321 TRACE("()\n");
322 }
323
324
325 /*
326 * @unimplemented
327 */
328 NTSTATUS
329 NTAPI
330 LsaApLogonUser(IN PLSA_CLIENT_REQUEST ClientRequest,
331 IN SECURITY_LOGON_TYPE LogonType,
332 IN PVOID AuthenticationInformation,
333 IN PVOID ClientAuthenticationBase,
334 IN ULONG AuthenticationInformationLength,
335 OUT PVOID *ProfileBuffer,
336 OUT PULONG ProfileBufferLength,
337 OUT PLUID LogonId,
338 OUT PNTSTATUS SubStatus,
339 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
340 OUT PVOID *TokenInformation,
341 OUT PLSA_UNICODE_STRING *AccountName,
342 OUT PLSA_UNICODE_STRING *AuthenticatingAuthority)
343 {
344 PMSV1_0_INTERACTIVE_LOGON LogonInfo;
345
346 SAMPR_HANDLE ServerHandle = NULL;
347 SAMPR_HANDLE DomainHandle = NULL;
348 SAMPR_HANDLE UserHandle = NULL;
349 PRPC_SID AccountDomainSid = NULL;
350 RPC_UNICODE_STRING Names[1];
351 SAMPR_ULONG_ARRAY RelativeIds = {0, NULL};
352 SAMPR_ULONG_ARRAY Use = {0, NULL};
353 PSAMPR_USER_INFO_BUFFER UserInfo = NULL;
354 UNICODE_STRING LogonServer;
355 NTSTATUS Status;
356
357 TRACE("()\n");
358
359 TRACE("LogonType: %lu\n", LogonType);
360 TRACE("AuthenticationInformation: %p\n", AuthenticationInformation);
361 TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength);
362
363
364 *ProfileBuffer = NULL;
365 *ProfileBufferLength = 0;
366 *SubStatus = STATUS_SUCCESS;
367
368 if (LogonType == Interactive ||
369 LogonType == Batch ||
370 LogonType == Service)
371 {
372 ULONG_PTR PtrOffset;
373
374 LogonInfo = (PMSV1_0_INTERACTIVE_LOGON)AuthenticationInformation;
375
376 /* Fix-up pointers in the authentication info */
377 PtrOffset = (ULONG_PTR)AuthenticationInformation - (ULONG_PTR)ClientAuthenticationBase;
378
379 LogonInfo->LogonDomainName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->LogonDomainName.Buffer + PtrOffset);
380 LogonInfo->UserName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->UserName.Buffer + PtrOffset);
381 LogonInfo->Password.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->Password.Buffer + PtrOffset);
382
383 TRACE("Domain: %S\n", LogonInfo->LogonDomainName.Buffer);
384 TRACE("User: %S\n", LogonInfo->UserName.Buffer);
385 TRACE("Password: %S\n", LogonInfo->Password.Buffer);
386
387 RtlInitUnicodeString(&LogonServer, L"Testserver");
388 }
389 else
390 {
391 FIXME("LogonType %lu is not supported yet!\n", LogonType);
392 return STATUS_NOT_IMPLEMENTED;
393 }
394
395 Status = GetDomainSid(&AccountDomainSid);
396 if (!NT_SUCCESS(Status))
397 {
398 TRACE("GetDomainSid() failed (Status 0x%08lx)\n", Status);
399 return Status;
400 }
401
402 /* Connect to the SAM server */
403 Status = SamIConnect(NULL,
404 &ServerHandle,
405 SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
406 TRUE);
407 if (!NT_SUCCESS(Status))
408 {
409 TRACE("SamIConnect() failed (Status 0x%08lx)\n", Status);
410 goto done;
411 }
412
413 /* Open the account domain */
414 Status = SamrOpenDomain(ServerHandle,
415 DOMAIN_LOOKUP,
416 AccountDomainSid,
417 &DomainHandle);
418 if (!NT_SUCCESS(Status))
419 {
420 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status);
421 goto done;
422 }
423
424 Names[0].Length = LogonInfo->UserName.Length;
425 Names[0].MaximumLength = LogonInfo->UserName.MaximumLength;
426 Names[0].Buffer = LogonInfo->UserName.Buffer;
427
428 /* Try to get the RID for the user name */
429 Status = SamrLookupNamesInDomain(DomainHandle,
430 1,
431 Names,
432 &RelativeIds,
433 &Use);
434 if (!NT_SUCCESS(Status))
435 {
436 TRACE("SamrLookupNamesInDomain failed (Status %08lx)\n", Status);
437 Status = STATUS_NO_SUCH_USER;
438 goto done;
439 }
440
441 /* Fail, if it is not a user account */
442 if (Use.Element[0] != SidTypeUser)
443 {
444 TRACE("Account is not a user account!\n");
445 Status = STATUS_NO_SUCH_USER;
446 goto done;
447 }
448
449 /* Open the user object */
450 Status = SamrOpenUser(DomainHandle,
451 USER_READ_GENERAL | USER_READ_LOGON |
452 USER_READ_ACCOUNT | USER_READ_PREFERENCES, /* FIXME */
453 RelativeIds.Element[0],
454 &UserHandle);
455 if (!NT_SUCCESS(Status))
456 {
457 TRACE("SamrOpenUser failed (Status %08lx)\n", Status);
458 goto done;
459 }
460
461 Status = SamrQueryInformationUser(UserHandle,
462 UserAllInformation,
463 &UserInfo);
464 if (!NT_SUCCESS(Status))
465 {
466 TRACE("SamrQueryInformationUser failed (Status %08lx)\n", Status);
467 goto done;
468 }
469
470
471 TRACE("UserName: %S\n", UserInfo->All.UserName.Buffer);
472
473 /* FIXME: Check restrictions */
474
475 /* FIXME: Check the password */
476 if ((UserInfo->All.UserAccountControl & USER_PASSWORD_NOT_REQUIRED) == 0)
477 {
478 FIXME("Must check the password!\n");
479
480 }
481
482 /* Return logon information */
483
484 /* Create and return a new logon id */
485 Status = NtAllocateLocallyUniqueId(LogonId);
486 if (!NT_SUCCESS(Status))
487 {
488 TRACE("NtAllocateLocallyUniqueId failed (Status %08lx)\n", Status);
489 goto done;
490 }
491
492 /* Build and fill the interactve profile buffer */
493 Status = BuildInteractiveProfileBuffer(ClientRequest,
494 UserInfo,
495 &LogonServer,
496 (PMSV1_0_INTERACTIVE_PROFILE*)ProfileBuffer,
497 ProfileBufferLength);
498 if (!NT_SUCCESS(Status))
499 {
500 TRACE("BuildInteractiveProfileBuffer failed (Status %08lx)\n", Status);
501 goto done;
502 }
503
504 /* Return the token information type */
505 *TokenInformationType = LsaTokenInformationV1;
506
507 done:
508 if (!NT_SUCCESS(Status))
509 {
510 if (*ProfileBuffer != NULL)
511 {
512 DispatchTable.FreeClientBuffer(ClientRequest,
513 *ProfileBuffer);
514 *ProfileBuffer = NULL;
515 }
516 }
517
518 if (UserHandle != NULL)
519 SamrCloseHandle(&UserHandle);
520
521 SamIFree_SAMPR_USER_INFO_BUFFER(UserInfo,
522 UserAllInformation);
523 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds);
524 SamIFree_SAMPR_ULONG_ARRAY(&Use);
525
526 if (DomainHandle != NULL)
527 SamrCloseHandle(&DomainHandle);
528
529 if (ServerHandle != NULL)
530 SamrCloseHandle(&ServerHandle);
531
532 if (AccountDomainSid != NULL)
533 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid);
534
535 TRACE("LsaApLogonUser done (Status %08lx)\n", Status);
536
537 return Status;
538 }
539
540
541 /*
542 * @unimplemented
543 */
544 NTSTATUS
545 NTAPI
546 LsaApLogonUserEx(IN PLSA_CLIENT_REQUEST ClientRequest,
547 IN SECURITY_LOGON_TYPE LogonType,
548 IN PVOID AuthenticationInformation,
549 IN PVOID ClientAuthenticationBase,
550 IN ULONG AuthenticationInformationLength,
551 OUT PVOID *ProfileBuffer,
552 OUT PULONG ProfileBufferLength,
553 OUT PLUID LogonId,
554 OUT PNTSTATUS SubStatus,
555 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
556 OUT PVOID *TokenInformation,
557 OUT PUNICODE_STRING *AccountName,
558 OUT PUNICODE_STRING *AuthenticatingAuthority,
559 OUT PUNICODE_STRING *MachineName)
560 {
561 TRACE("()\n");
562
563 TRACE("LogonType: %lu\n", LogonType);
564 TRACE("AuthenticationInformation: %p\n", AuthenticationInformation);
565 TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength);
566
567 return STATUS_NOT_IMPLEMENTED;
568 }
569
570
571 /*
572 * @unimplemented
573 */
574 NTSTATUS
575 NTAPI
576 LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest,
577 IN SECURITY_LOGON_TYPE LogonType,
578 IN PVOID ProtocolSubmitBuffer,
579 IN PVOID ClientBufferBase,
580 IN ULONG SubmitBufferSize,
581 OUT PVOID *ProfileBuffer,
582 OUT PULONG ProfileBufferSize,
583 OUT PLUID LogonId,
584 OUT PNTSTATUS SubStatus,
585 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
586 OUT PVOID *TokenInformation,
587 OUT PUNICODE_STRING *AccountName,
588 OUT PUNICODE_STRING *AuthenticatingAuthority,
589 OUT PUNICODE_STRING *MachineName,
590 OUT PSECPKG_PRIMARY_CRED PrimaryCredentials,
591 OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials)
592 {
593 TRACE("()\n");
594
595 TRACE("LogonType: %lu\n", LogonType);
596 TRACE("ProtocolSubmitBuffer: %p\n", ProtocolSubmitBuffer);
597 TRACE("SubmitBufferSize: %lu\n", SubmitBufferSize);
598
599
600 return STATUS_NOT_IMPLEMENTED;
601 }
602
603 /* EOF */