2 * PROJECT: Authentication Package DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/msv1_0/msv1_0.c
6 * COPYRIGHT: Copyright 2013 Eric Kohl
9 /* INCLUDES ****************************************************************/
13 WINE_DEFAULT_DEBUG_CHANNEL(msv1_0
);
16 /* GLOBALS *****************************************************************/
18 LSA_DISPATCH_TABLE DispatchTable
;
21 /* FUNCTIONS ***************************************************************/
25 GetDomainSid(PRPC_SID
*Sid
)
27 LSAPR_HANDLE PolicyHandle
= NULL
;
28 PLSAPR_POLICY_INFORMATION PolicyInfo
= NULL
;
32 Status
= LsaIOpenPolicyTrusted(&PolicyHandle
);
33 if (!NT_SUCCESS(Status
))
35 TRACE("LsaIOpenPolicyTrusted() failed (Status 0x%08lx)\n", Status
);
39 Status
= LsarQueryInformationPolicy(PolicyHandle
,
40 PolicyAccountDomainInformation
,
42 if (!NT_SUCCESS(Status
))
44 TRACE("LsarQueryInformationPolicy() failed (Status 0x%08lx)\n", Status
);
48 Length
= RtlLengthSid(PolicyInfo
->PolicyAccountDomainInfo
.Sid
);
50 *Sid
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
53 ERR("Failed to allocate SID\n");
54 Status
= STATUS_INSUFFICIENT_RESOURCES
;
58 memcpy(*Sid
, PolicyInfo
->PolicyAccountDomainInfo
.Sid
, Length
);
61 if (PolicyInfo
!= NULL
)
62 LsaIFree_LSAPR_POLICY_INFORMATION(PolicyAccountDomainInformation
,
65 if (PolicyHandle
!= NULL
)
66 LsarClose(&PolicyHandle
);
77 LsaApCallPackage(IN PLSA_CLIENT_REQUEST ClientRequest
,
78 IN PVOID ProtocolSubmitBuffer
,
79 IN PVOID ClientBufferBase
,
80 IN ULONG SubmitBufferLength
,
81 OUT PVOID
*ProtocolReturnBuffer
,
82 OUT PULONG ReturnBufferLength
,
83 OUT PNTSTATUS ProtocolStatus
)
86 return STATUS_NOT_IMPLEMENTED
;
95 LsaApCallPackagePassthrough(IN PLSA_CLIENT_REQUEST ClientRequest
,
96 IN PVOID ProtocolSubmitBuffer
,
97 IN PVOID ClientBufferBase
,
98 IN ULONG SubmitBufferLength
,
99 OUT PVOID
*ProtocolReturnBuffer
,
100 OUT PULONG ReturnBufferLength
,
101 OUT PNTSTATUS ProtocolStatus
)
104 return STATUS_NOT_IMPLEMENTED
;
113 LsaApCallPackageUntrusted(IN PLSA_CLIENT_REQUEST ClientRequest
,
114 IN PVOID ProtocolSubmitBuffer
,
115 IN PVOID ClientBufferBase
,
116 IN ULONG SubmitBufferLength
,
117 OUT PVOID
*ProtocolReturnBuffer
,
118 OUT PULONG ReturnBufferLength
,
119 OUT PNTSTATUS ProtocolStatus
)
122 return STATUS_NOT_IMPLEMENTED
;
131 LsaApInitializePackage(IN ULONG AuthenticationPackageId
,
132 IN PLSA_DISPATCH_TABLE LsaDispatchTable
,
133 IN PLSA_STRING Database OPTIONAL
,
134 IN PLSA_STRING Confidentiality OPTIONAL
,
135 OUT PLSA_STRING
*AuthenticationPackageName
)
137 PANSI_STRING NameString
;
140 TRACE("(%lu %p %p %p %p)\n",
141 AuthenticationPackageId
, LsaDispatchTable
, Database
,
142 Confidentiality
, AuthenticationPackageName
);
144 /* Get the dispatch table entries */
145 DispatchTable
.AllocateLsaHeap
= LsaDispatchTable
->AllocateLsaHeap
;
146 DispatchTable
.FreeLsaHeap
= LsaDispatchTable
->FreeLsaHeap
;
147 DispatchTable
.AllocateClientBuffer
= LsaDispatchTable
->AllocateClientBuffer
;
148 DispatchTable
.FreeClientBuffer
= LsaDispatchTable
->FreeClientBuffer
;
149 DispatchTable
.CopyToClientBuffer
= LsaDispatchTable
->CopyToClientBuffer
;
150 DispatchTable
.CopyFromClientBuffer
= LsaDispatchTable
->CopyFromClientBuffer
;
153 /* Return the package name */
154 NameString
= DispatchTable
.AllocateLsaHeap(sizeof(LSA_STRING
));
155 if (NameString
== NULL
)
156 return STATUS_INSUFFICIENT_RESOURCES
;
158 NameBuffer
= DispatchTable
.AllocateLsaHeap(sizeof(MSV1_0_PACKAGE_NAME
));
159 if (NameBuffer
== NULL
)
161 DispatchTable
.FreeLsaHeap(NameString
);
162 return STATUS_INSUFFICIENT_RESOURCES
;
165 strcpy(NameBuffer
, MSV1_0_PACKAGE_NAME
);
167 RtlInitAnsiString(NameString
, NameBuffer
);
169 *AuthenticationPackageName
= (PLSA_STRING
)NameString
;
171 return STATUS_SUCCESS
;
180 LsaApLogonTerminated(IN PLUID LogonId
)
191 LsaApLogonUser(IN PLSA_CLIENT_REQUEST ClientRequest
,
192 IN SECURITY_LOGON_TYPE LogonType
,
193 IN PVOID AuthenticationInformation
,
194 IN PVOID ClientAuthenticationBase
,
195 IN ULONG AuthenticationInformationLength
,
196 OUT PVOID
*ProfileBuffer
,
197 OUT PULONG ProfileBufferLength
,
199 OUT PNTSTATUS SubStatus
,
200 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
201 OUT PVOID
*TokenInformation
,
202 OUT PLSA_UNICODE_STRING
*AccountName
,
203 OUT PLSA_UNICODE_STRING
*AuthenticatingAuthority
)
205 PMSV1_0_INTERACTIVE_LOGON LogonInfo
;
207 SAMPR_HANDLE ServerHandle
= NULL
;
208 SAMPR_HANDLE DomainHandle
= NULL
;
209 PRPC_SID AccountDomainSid
= NULL
;
210 RPC_UNICODE_STRING Names
[1];
211 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
212 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
217 TRACE("LogonType: %lu\n", LogonType
);
218 TRACE("AuthenticationInformation: %p\n", AuthenticationInformation
);
219 TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength
);
222 *ProfileBuffer
= NULL
;
223 *ProfileBufferLength
= 0;
224 *SubStatus
= STATUS_SUCCESS
;
226 if (LogonType
== Interactive
||
227 LogonType
== Batch
||
228 LogonType
== Service
)
232 LogonInfo
= (PMSV1_0_INTERACTIVE_LOGON
)AuthenticationInformation
;
234 /* Fix-up pointers in the authentication info */
235 PtrOffset
= (ULONG_PTR
)AuthenticationInformation
- (ULONG_PTR
)ClientAuthenticationBase
;
237 LogonInfo
->LogonDomainName
.Buffer
= (PWSTR
)((ULONG_PTR
)LogonInfo
->LogonDomainName
.Buffer
+ PtrOffset
);
238 LogonInfo
->UserName
.Buffer
= (PWSTR
)((ULONG_PTR
)LogonInfo
->UserName
.Buffer
+ PtrOffset
);
239 LogonInfo
->Password
.Buffer
= (PWSTR
)((ULONG_PTR
)LogonInfo
->Password
.Buffer
+ PtrOffset
);
241 TRACE("Domain: %S\n", LogonInfo
->LogonDomainName
.Buffer
);
242 TRACE("User: %S\n", LogonInfo
->UserName
.Buffer
);
243 TRACE("Password: %S\n", LogonInfo
->Password
.Buffer
);
247 FIXME("LogonType %lu is not supported yet!\n", LogonType
);
248 return STATUS_NOT_IMPLEMENTED
;
251 Status
= GetDomainSid(&AccountDomainSid
);
252 if (!NT_SUCCESS(Status
))
254 TRACE("GetDomainSid() failed (Status 0x%08lx)\n", Status
);
258 /* Connect to the SAM server */
259 Status
= SamIConnect(NULL
,
261 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
263 if (!NT_SUCCESS(Status
))
265 TRACE("SamIConnect() failed (Status 0x%08lx)\n", Status
);
269 /* Open the account domain */
270 Status
= SamrOpenDomain(ServerHandle
,
274 if (!NT_SUCCESS(Status
))
276 TRACE("SamrOpenDomain failed (Status %08lx)\n", Status
);
280 Names
[0].Length
= LogonInfo
->UserName
.Length
;
281 Names
[0].MaximumLength
= LogonInfo
->UserName
.MaximumLength
;
282 Names
[0].Buffer
= LogonInfo
->UserName
.Buffer
;
284 /* Try to get the RID for the user name */
285 Status
= SamrLookupNamesInDomain(DomainHandle
,
290 if (!NT_SUCCESS(Status
))
292 TRACE("SamrLookupNamesInDomain failed (Status %08lx)\n", Status
);
293 Status
= STATUS_NO_SUCH_USER
;
297 /* Fail, if it is not a user account */
298 if (Use
.Element
[0] != SidTypeUser
)
300 TRACE("Account is not a user account!\n");
301 Status
= STATUS_NO_SUCH_USER
;
308 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
309 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
311 if (DomainHandle
!= NULL
)
312 SamrCloseHandle(&DomainHandle
);
314 if (ServerHandle
!= NULL
)
315 SamrCloseHandle(&ServerHandle
);
317 if (AccountDomainSid
!= NULL
)
318 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
320 TRACE("LsaApLogonUser done (Status %08lx)\n", Status
);
331 LsaApLogonUserEx(IN PLSA_CLIENT_REQUEST ClientRequest
,
332 IN SECURITY_LOGON_TYPE LogonType
,
333 IN PVOID AuthenticationInformation
,
334 IN PVOID ClientAuthenticationBase
,
335 IN ULONG AuthenticationInformationLength
,
336 OUT PVOID
*ProfileBuffer
,
337 OUT PULONG ProfileBufferLength
,
339 OUT PNTSTATUS SubStatus
,
340 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
341 OUT PVOID
*TokenInformation
,
342 OUT PUNICODE_STRING
*AccountName
,
343 OUT PUNICODE_STRING
*AuthenticatingAuthority
,
344 OUT PUNICODE_STRING
*MachineName
)
348 TRACE("LogonType: %lu\n", LogonType
);
349 TRACE("AuthenticationInformation: %p\n", AuthenticationInformation
);
350 TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength
);
352 return STATUS_NOT_IMPLEMENTED
;
361 LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest
,
362 IN SECURITY_LOGON_TYPE LogonType
,
363 IN PVOID ProtocolSubmitBuffer
,
364 IN PVOID ClientBufferBase
,
365 IN ULONG SubmitBufferSize
,
366 OUT PVOID
*ProfileBuffer
,
367 OUT PULONG ProfileBufferSize
,
369 OUT PNTSTATUS SubStatus
,
370 OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType
,
371 OUT PVOID
*TokenInformation
,
372 OUT PUNICODE_STRING
*AccountName
,
373 OUT PUNICODE_STRING
*AuthenticatingAuthority
,
374 OUT PUNICODE_STRING
*MachineName
,
375 OUT PSECPKG_PRIMARY_CRED PrimaryCredentials
,
376 OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY
*SupplementalCredentials
)
380 TRACE("LogonType: %lu\n", LogonType
);
381 TRACE("ProtocolSubmitBuffer: %p\n", ProtocolSubmitBuffer
);
382 TRACE("SubmitBufferSize: %lu\n", SubmitBufferSize
);
385 return STATUS_NOT_IMPLEMENTED
;