3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/secur32/lsa.c
6 * PURPOSE: Client-side LSA functions
11 /* INCLUDES ******************************************************************/
14 #include <ddk/ntddk.h>
16 #include <lsass/lsass.h>
19 /* GLOBALS *******************************************************************/
21 extern HANDLE Secur32Heap;
23 /* FUNCTIONS *****************************************************************/
26 LsaDeregisterLogonProcess(HANDLE LsaHandle)
28 LSASS_REQUEST Request;
32 Request.Header.DataSize = 0;
33 Request.Header.MessageSize = sizeof(LSASS_REQUEST);
34 Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
35 Status = NtRequestWaitReplyPort(LsaHandle,
38 if (!NT_SUCCESS(Status))
43 if (!NT_SUCCESS(Reply.Status))
52 LsaConnectUntrusted(PHANDLE LsaHandle)
54 return(STATUS_UNSUCCESSFUL);
58 LsaCallAuthenticationPackage(HANDLE LsaHandle,
59 ULONG AuthenticationPackage,
60 PVOID ProtocolSubmitBuffer,
61 ULONG SubmitBufferLength,
62 PVOID* ProtocolReturnBuffer,
63 PULONG ReturnBufferLength,
64 PNTSTATUS ProtocolStatus)
66 PLSASS_REQUEST Request;
68 UCHAR RawRequest[MAX_MESSAGE_DATA];
69 UCHAR RawReply[MAX_MESSAGE_DATA];
73 Request = (PLSASS_REQUEST)RawRequest;
74 Reply = (PLSASS_REPLY)RawReply;
76 Request->Header.DataSize = sizeof(LSASS_REQUEST) + SubmitBufferLength -
78 Request->Header.MessageSize =
79 Request->Header.DataSize + sizeof(LPC_MESSAGE);
80 Request->Type = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE;
81 Request->d.CallAuthenticationPackageRequest.AuthenticationPackage =
82 AuthenticationPackage;
83 Request->d.CallAuthenticationPackageRequest.InBufferLength =
85 memcpy(Request->d.CallAuthenticationPackageRequest.InBuffer,
89 Status = NtRequestWaitReplyPort(LsaHandle,
92 if (!NT_SUCCESS(Status))
97 if (!NT_SUCCESS(Reply->Status))
99 return(Reply->Status);
102 OutBufferSize = Reply->d.CallAuthenticationPackageReply.OutBufferLength;
103 *ProtocolReturnBuffer = RtlAllocateHeap(Secur32Heap,
106 *ReturnBufferLength = OutBufferSize;
107 memcpy(*ProtocolReturnBuffer,
108 Reply->d.CallAuthenticationPackageReply.OutBuffer,
109 *ReturnBufferLength);
115 LsaFreeReturnBuffer(PVOID Buffer)
117 return(RtlFreeHeap(Secur32Heap, 0, Buffer));
121 LsaLookupAuthenticationPackage(HANDLE LsaHandle,
122 PLSA_STRING PackageName,
123 PULONG AuthenticationPackage)
126 PLSASS_REQUEST Request;
127 UCHAR RawRequest[MAX_MESSAGE_DATA];
130 Request = (PLSASS_REQUEST)RawRequest;
131 Request->Header.DataSize = sizeof(LSASS_REQUEST) + PackageName->Length -
133 Request->Header.MessageSize = Request->Header.DataSize +
135 Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
137 Status = NtRequestWaitReplyPort(LsaHandle,
140 if (!NT_SUCCESS(Status))
144 if (!NT_SUCCESS(Reply.Status))
146 return(Reply.Status);
149 *AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package;
151 return(Reply.Status);
155 LsaLogonUser(HANDLE LsaHandle,
156 PLSA_STRING OriginName,
157 SECURITY_LOGON_TYPE LogonType,
158 ULONG AuthenticationPackage,
159 PVOID AuthenticationInformation,
160 ULONG AuthenticationInformationLength,
161 PTOKEN_GROUPS LocalGroups,
162 PTOKEN_SOURCE SourceContext,
163 PVOID* ProfileBuffer,
164 PULONG ProfileBufferLength,
167 PQUOTA_LIMITS Quotas,
172 PLSASS_REQUEST Request;
173 UCHAR RawMessage[MAX_MESSAGE_DATA];
175 UCHAR RawReply[MAX_MESSAGE_DATA];
178 RequestLength = sizeof(LSASS_REQUEST) - sizeof(LPC_MESSAGE);
179 RequestLength = RequestLength + (OriginName->Length * sizeof(WCHAR));
180 RequestLength = RequestLength + AuthenticationInformationLength;
181 RequestLength = RequestLength +
182 (LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
185 Request = (PLSASS_REQUEST)RawMessage;
187 Request->d.LogonUserRequest.OriginNameLength = OriginName->Length;
188 Request->d.LogonUserRequest.OriginName = (PWSTR)&RawMessage[CurrentLength];
189 memcpy((PWSTR)&RawMessage[CurrentLength],
191 OriginName->Length * sizeof(WCHAR));
192 CurrentLength = CurrentLength + (OriginName->Length * sizeof(WCHAR));
194 Request->d.LogonUserRequest.LogonType = LogonType;
196 Request->d.LogonUserRequest.AuthenticationPackage =
197 AuthenticationPackage;
199 Request->d.LogonUserRequest.AuthenticationInformation =
200 (PVOID)&RawMessage[CurrentLength];
201 Request->d.LogonUserRequest.AuthenticationInformationLength =
202 AuthenticationInformationLength;
203 memcpy((PVOID)&RawMessage[CurrentLength],
204 AuthenticationInformation,
205 AuthenticationInformationLength);
206 CurrentLength = CurrentLength + AuthenticationInformationLength;
208 Request->d.LogonUserRequest.LocalGroupsCount = LocalGroups->GroupCount;
209 Request->d.LogonUserRequest.LocalGroups =
210 (PSID_AND_ATTRIBUTES)&RawMessage[CurrentLength];
211 memcpy((PSID_AND_ATTRIBUTES)&RawMessage[CurrentLength],
213 LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
215 Request->d.LogonUserRequest.SourceContext = *SourceContext;
217 Request->Type = LSASS_REQUEST_LOGON_USER;
218 Request->Header.DataSize = RequestLength - sizeof(LPC_MESSAGE);
219 Request->Header.MessageSize = RequestLength + sizeof(LPC_MESSAGE);
221 Reply = (PLSASS_REPLY)RawReply;
223 Status = NtRequestWaitReplyPort(LsaHandle,
226 if (!NT_SUCCESS(Status))
231 *SubStatus = Reply->d.LogonUserReply.SubStatus;
233 if (!NT_SUCCESS(Reply->Status))
238 *ProfileBuffer = RtlAllocateHeap(Secur32Heap,
240 Reply->d.LogonUserReply.ProfileBufferLength);
241 memcpy(*ProfileBuffer,
242 (PVOID)((ULONG)Reply->d.LogonUserReply.Data +
243 (ULONG)Reply->d.LogonUserReply.ProfileBuffer),
244 Reply->d.LogonUserReply.ProfileBufferLength);
245 *LogonId = Reply->d.LogonUserReply.LogonId;
246 *Token = Reply->d.LogonUserReply.Token;
248 &Reply->d.LogonUserReply.Quotas,
249 sizeof(Reply->d.LogonUserReply.Quotas));
255 LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
257 PLSA_OPERATIONAL_MODE OperationalMode)
259 UNICODE_STRING Portname = UNICODE_STRING_INITIALIZER(L"\\SeLsaCommandPort");
260 ULONG ConnectInfoLength;
262 LSASS_REQUEST Request;
265 ConnectInfoLength = 0;
266 Status = NtConnectPort(Handle,
274 if (!NT_SUCCESS(Status))
279 Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
280 Request.Header.DataSize = sizeof(LSASS_REQUEST) -
282 Request.Header.MessageSize = sizeof(LSASS_REQUEST);
284 Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
285 wcscpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
286 LsaLogonProcessName->Buffer);
288 Status = NtRequestWaitReplyPort(*Handle,
291 if (!NT_SUCCESS(Status))
294 *Handle = INVALID_HANDLE_VALUE;
298 if (!NT_SUCCESS(Reply.Status))
301 *Handle = INVALID_HANDLE_VALUE;
305 *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
307 return(Reply.Status);