1 /* $Id: lsa.c,v 1.2 2001/06/25 12:32:56 ekohl Exp $
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
-
77 sizeof(LPC_MESSAGE_HEADER
);
78 Request
->Header
.MessageSize
=
79 Request
->Header
.DataSize
+ sizeof(LPC_MESSAGE_HEADER
);
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
-
132 sizeof(LPC_MESSAGE_HEADER
);
133 Request
->Header
.MessageSize
= Request
->Header
.DataSize
+
134 sizeof(LPC_MESSAGE_HEADER
);
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_HEADER
);
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_HEADER
);
219 Request
->Header
.MessageSize
= RequestLength
+ sizeof(LPC_MESSAGE_HEADER
);
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
;
260 ULONG ConnectInfoLength
;
262 LSASS_REQUEST Request
;
265 RtlInitUnicodeString(&Portname
, L
"\\SeLsaCommandPort");
266 ConnectInfoLength
= 0;
267 Status
= NtConnectPort(Handle
,
275 if (!NT_SUCCESS(Status
))
280 Request
.Type
= LSASS_REQUEST_REGISTER_LOGON_PROCESS
;
281 Request
.Header
.DataSize
= sizeof(LSASS_REQUEST
) -
282 sizeof(LPC_MESSAGE_HEADER
);
283 Request
.Header
.MessageSize
= sizeof(LSASS_REQUEST
);
285 Request
.d
.RegisterLogonProcessRequest
.Length
= LsaLogonProcessName
->Length
;
286 wcscpy(Request
.d
.RegisterLogonProcessRequest
.LogonProcessNameBuffer
,
287 LsaLogonProcessName
->Buffer
);
289 Status
= NtRequestWaitReplyPort(*Handle
,
292 if (!NT_SUCCESS(Status
))
295 *Handle
= INVALID_HANDLE_VALUE
;
299 if (!NT_SUCCESS(Reply
.Status
))
302 *Handle
= INVALID_HANDLE_VALUE
;
306 *OperationalMode
= Reply
.d
.RegisterLogonProcessReply
.OperationalMode
;
308 return(Reply
.Status
);