ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

lsa.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS system libraries
00004  * FILE:            lib/lsalib/lsa.c
00005  * PURPOSE:         Client-side LSA functions
00006  * UPDATE HISTORY:
00007  *                  Created 05/08/00
00008  */
00009 
00010 /* INCLUDES ******************************************************************/
00011 
00012 #include <ndk/lpctypes.h>
00013 #include <ndk/lpcfuncs.h>
00014 #include <ndk/rtlfuncs.h>
00015 #include <psdk/ntsecapi.h>
00016 #include <lsass/lsass.h>
00017 
00018 #define NDEBUG
00019 #include <debug.h>
00020 
00021 /* GLOBALS *******************************************************************/
00022 
00023 extern HANDLE Secur32Heap;
00024 
00025 /* FUNCTIONS *****************************************************************/
00026 
00027 /*
00028  * @implemented
00029  */
00030 NTSTATUS WINAPI
00031 LsaDeregisterLogonProcess(HANDLE LsaHandle)
00032 {
00033     LSASS_REQUEST Request;
00034     LSASS_REPLY Reply;
00035     NTSTATUS Status;
00036 
00037     Request.Header.u1.s1.DataLength = 0;
00038     Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
00039     Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
00040     Status = ZwRequestWaitReplyPort(LsaHandle,
00041                                     &Request.Header,
00042                                     &Reply.Header);
00043     if (!NT_SUCCESS(Status))
00044     {
00045         return Status;
00046     }
00047 
00048     if (!NT_SUCCESS(Reply.Status))
00049     {
00050         return Reply.Status;
00051     }
00052 
00053     return Status;
00054 }
00055 
00056 
00057 /*
00058  * @unimplemented
00059  */
00060 NTSTATUS WINAPI
00061 LsaConnectUntrusted(PHANDLE LsaHandle)
00062 {
00063     UNIMPLEMENTED;
00064     return STATUS_NOT_IMPLEMENTED;
00065 }
00066 
00067 
00068 /*
00069  * @implemented
00070  */
00071 NTSTATUS WINAPI
00072 LsaCallAuthenticationPackage(HANDLE LsaHandle,
00073                              ULONG AuthenticationPackage,
00074                              PVOID ProtocolSubmitBuffer,
00075                              ULONG SubmitBufferLength,
00076                              PVOID *ProtocolReturnBuffer,
00077                              PULONG ReturnBufferLength,
00078                              PNTSTATUS ProtocolStatus)
00079 {
00080     PLSASS_REQUEST Request;
00081     PLSASS_REPLY Reply;
00082     LSASS_REQUEST RawRequest;
00083     LSASS_REPLY RawReply;
00084     NTSTATUS Status;
00085     ULONG OutBufferSize;
00086 
00087     Request = (PLSASS_REQUEST)&RawRequest;
00088     Reply = (PLSASS_REPLY)&RawReply;
00089 
00090     Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + SubmitBufferLength -
00091         sizeof(PORT_MESSAGE);
00092     Request->Header.u1.s1.TotalLength =
00093         Request->Header.u1.s1.DataLength + sizeof(PORT_MESSAGE);
00094     Request->Type = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE;
00095     Request->d.CallAuthenticationPackageRequest.AuthenticationPackage =
00096         AuthenticationPackage;
00097     Request->d.CallAuthenticationPackageRequest.InBufferLength =
00098         SubmitBufferLength;
00099     memcpy(Request->d.CallAuthenticationPackageRequest.InBuffer,
00100            ProtocolSubmitBuffer,
00101            SubmitBufferLength);
00102 
00103     Status = ZwRequestWaitReplyPort(LsaHandle,
00104                                     &Request->Header,
00105                                     &Reply->Header);
00106     if (!NT_SUCCESS(Status))
00107     {
00108         return Status;
00109     }
00110 
00111     if (!NT_SUCCESS(Reply->Status))
00112     {
00113         return Reply->Status;
00114     }
00115 
00116     OutBufferSize = Reply->d.CallAuthenticationPackageReply.OutBufferLength;
00117     *ProtocolReturnBuffer = RtlAllocateHeap(Secur32Heap,
00118                                             0,
00119                                             OutBufferSize);
00120     *ReturnBufferLength = OutBufferSize;
00121     memcpy(*ProtocolReturnBuffer,
00122            Reply->d.CallAuthenticationPackageReply.OutBuffer,
00123            *ReturnBufferLength);
00124 
00125     return Status;
00126 }
00127 
00128 
00129 /*
00130  * @implemented
00131  */
00132 NTSTATUS WINAPI
00133 LsaFreeReturnBuffer(PVOID Buffer)
00134 {
00135     return RtlFreeHeap(Secur32Heap, 0, Buffer);
00136 }
00137 
00138 
00139 /*
00140  * @implemented
00141  */
00142 NTSTATUS WINAPI
00143 LsaLookupAuthenticationPackage(HANDLE LsaHandle,
00144                                PLSA_STRING PackageName,
00145                                PULONG AuthenticationPackage)
00146 {
00147     NTSTATUS Status;
00148     PLSASS_REQUEST Request;
00149     LSASS_REQUEST RawRequest;
00150     LSASS_REPLY Reply;
00151 
00152     Request = (PLSASS_REQUEST)&RawRequest;
00153     Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + PackageName->Length -
00154         sizeof(PORT_MESSAGE);
00155     Request->Header.u1.s1.TotalLength = Request->Header.u1.s1.DataLength +
00156         sizeof(PORT_MESSAGE);
00157     Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
00158 
00159     Status = ZwRequestWaitReplyPort(LsaHandle,
00160                                     &Request->Header,
00161                                     &Reply.Header);
00162     if (!NT_SUCCESS(Status))
00163     {
00164         return Status;
00165     }
00166 
00167     if (!NT_SUCCESS(Reply.Status))
00168     {
00169         return Reply.Status;
00170     }
00171 
00172     *AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package;
00173 
00174     return Reply.Status;
00175 }
00176 
00177 
00178 /*
00179  * @implemented
00180  */
00181 NTSTATUS WINAPI
00182 LsaLogonUser(HANDLE LsaHandle,
00183              PLSA_STRING OriginName,
00184              SECURITY_LOGON_TYPE LogonType,
00185              ULONG AuthenticationPackage,
00186              PVOID AuthenticationInformation,
00187              ULONG AuthenticationInformationLength,
00188              PTOKEN_GROUPS LocalGroups,
00189              PTOKEN_SOURCE SourceContext,
00190              PVOID *ProfileBuffer,
00191              PULONG ProfileBufferLength,
00192              PLUID LogonId,
00193              PHANDLE Token,
00194              PQUOTA_LIMITS Quotas,
00195              PNTSTATUS SubStatus)
00196 {
00197     ULONG RequestLength;
00198     ULONG CurrentLength;
00199     PLSASS_REQUEST Request;
00200     LSASS_REQUEST RawMessage;
00201     PLSASS_REPLY Reply;
00202     LSASS_REPLY RawReply;
00203     NTSTATUS Status;
00204 
00205     RequestLength = sizeof(LSASS_REQUEST) - sizeof(PORT_MESSAGE);
00206     RequestLength = RequestLength + (OriginName->Length * sizeof(WCHAR));
00207     RequestLength = RequestLength + AuthenticationInformationLength;
00208     RequestLength = RequestLength +
00209         (LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
00210 
00211     CurrentLength = 0;
00212     Request = (PLSASS_REQUEST)&RawMessage;
00213 
00214     Request->d.LogonUserRequest.OriginNameLength = OriginName->Length;
00215     Request->d.LogonUserRequest.OriginName = (PWSTR)&RawMessage + CurrentLength;
00216     memcpy((PWSTR)&RawMessage + CurrentLength,
00217            OriginName->Buffer,
00218            OriginName->Length * sizeof(WCHAR));
00219     CurrentLength = CurrentLength + (OriginName->Length * sizeof(WCHAR));
00220 
00221     Request->d.LogonUserRequest.LogonType = LogonType;
00222 
00223     Request->d.LogonUserRequest.AuthenticationPackage =
00224         AuthenticationPackage;
00225 
00226     Request->d.LogonUserRequest.AuthenticationInformation =
00227         (PVOID)((ULONG_PTR)&RawMessage + CurrentLength);
00228     Request->d.LogonUserRequest.AuthenticationInformationLength =
00229         AuthenticationInformationLength;
00230     memcpy((PVOID)((ULONG_PTR)&RawMessage + CurrentLength),
00231            AuthenticationInformation,
00232            AuthenticationInformationLength);
00233     CurrentLength = CurrentLength + AuthenticationInformationLength;
00234 
00235     Request->d.LogonUserRequest.LocalGroupsCount = LocalGroups->GroupCount;
00236     Request->d.LogonUserRequest.LocalGroups =
00237         (PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength;
00238     memcpy((PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength,
00239            LocalGroups->Groups,
00240            LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
00241 
00242     Request->d.LogonUserRequest.SourceContext = *SourceContext;
00243 
00244     Request->Type = LSASS_REQUEST_LOGON_USER;
00245     Request->Header.u1.s1.DataLength = RequestLength - sizeof(PORT_MESSAGE);
00246     Request->Header.u1.s1.TotalLength = RequestLength + sizeof(PORT_MESSAGE);
00247 
00248     Reply = (PLSASS_REPLY)&RawReply;
00249 
00250     Status = ZwRequestWaitReplyPort(LsaHandle,
00251                                    &Request->Header,
00252                                    &Reply->Header);
00253     if (!NT_SUCCESS(Status))
00254     {
00255         return Status;
00256     }
00257 
00258     *SubStatus = Reply->d.LogonUserReply.SubStatus;
00259 
00260     if (!NT_SUCCESS(Reply->Status))
00261     {
00262         return Status;
00263     }
00264 
00265     *ProfileBuffer = RtlAllocateHeap(Secur32Heap,
00266                                      0,
00267                                      Reply->d.LogonUserReply.ProfileBufferLength);
00268     memcpy(*ProfileBuffer,
00269            (PVOID)((ULONG_PTR)Reply->d.LogonUserReply.Data +
00270                    (ULONG_PTR)Reply->d.LogonUserReply.ProfileBuffer),
00271            Reply->d.LogonUserReply.ProfileBufferLength);
00272     *LogonId = Reply->d.LogonUserReply.LogonId;
00273     *Token = Reply->d.LogonUserReply.Token;
00274     memcpy(Quotas,
00275            &Reply->d.LogonUserReply.Quotas,
00276            sizeof(Reply->d.LogonUserReply.Quotas));
00277 
00278     return Status;
00279 }
00280 
00281 
00282 /*
00283  * @implemented
00284  */
00285 NTSTATUS WINAPI
00286 LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
00287                         PHANDLE Handle,
00288                         PLSA_OPERATIONAL_MODE OperationalMode)
00289 {
00290     UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort");
00291     SECURITY_QUALITY_OF_SERVICE SecurityQos;
00292     ULONG ConnectInfoLength;
00293     NTSTATUS Status;
00294     LSASS_CONNECT_DATA ConnectInfo;
00295 //    LSASS_REQUEST Request;
00296 //    LSASS_REPLY Reply;
00297 
00298     /* Check the logon process name length */
00299     if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH)
00300         return STATUS_NAME_TOO_LONG;
00301 
00302     RtlInitUnicodeString(&PortName,
00303                          L"\\LsaAuthenticationPort");
00304 
00305     SecurityQos.Length              = sizeof (SecurityQos);
00306     SecurityQos.ImpersonationLevel  = SecurityIdentification;
00307     SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
00308     SecurityQos.EffectiveOnly       = TRUE;
00309 
00310     ConnectInfoLength = sizeof(LSASS_CONNECT_DATA);
00311 
00312     strncpy(ConnectInfo.LogonProcessNameBuffer,
00313             LsaLogonProcessName->Buffer,
00314             LsaLogonProcessName->Length);
00315     ConnectInfo.Length = LsaLogonProcessName->Length;
00316     ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0';
00317 
00318     Status = ZwConnectPort(Handle,
00319                            &PortName,
00320                            &SecurityQos,
00321                            NULL,
00322                            NULL,
00323                            NULL,
00324                            &ConnectInfo,
00325                            &ConnectInfoLength);
00326     if (!NT_SUCCESS(Status))
00327     {
00328         return Status;
00329     }
00330 
00331     return Status;
00332 #if 0
00333     Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
00334     Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) -
00335         sizeof(PORT_MESSAGE);
00336     Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
00337 
00338     Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
00339     memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
00340            LsaLogonProcessName->Buffer,
00341            Request.d.RegisterLogonProcessRequest.Length);
00342 
00343     Status = ZwRequestWaitReplyPort(*Handle,
00344                                     &Request.Header,
00345                                     &Reply.Header);
00346     if (!NT_SUCCESS(Status))
00347     {
00348 //        NtClose(*Handle);
00349 //        *Handle = NULL;
00350         return Status;
00351     }
00352 
00353     if (!NT_SUCCESS(Reply.Status))
00354     {
00355 //        NtClose(*Handle);
00356 //        *Handle = NULL;
00357         return Status;
00358     }
00359 
00360     *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
00361 
00362     return Reply.Status;
00363 #endif
00364 }
00365 
00366 
00367 /*
00368  * @unimplemented
00369  */
00370 NTSTATUS
00371 WINAPI
00372 LsaEnumerateLogonSessions(PULONG LogonSessionCount,
00373                           PLUID *LogonSessionList)
00374 {
00375     UNIMPLEMENTED;
00376     return STATUS_NOT_IMPLEMENTED;
00377 }
00378 
00379 
00380 /*
00381  * @unimplemented
00382  */
00383 NTSTATUS
00384 WINAPI
00385 LsaGetLogonSessionData(PLUID LogonId,
00386                        PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData)
00387 {
00388     UNIMPLEMENTED;
00389     return STATUS_NOT_IMPLEMENTED;
00390 }
00391 
00392 
00393 /*
00394  * @unimplemented
00395  */
00396 NTSTATUS
00397 WINAPI
00398 LsaRegisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
00399                                     HANDLE NotificationEventHandle)
00400 {
00401     UNIMPLEMENTED;
00402     return STATUS_NOT_IMPLEMENTED;
00403 }
00404 
00405 
00406 /*
00407  * @unimplemented
00408  */
00409 NTSTATUS
00410 WINAPI
00411 LsaUnregisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
00412                                       HANDLE NotificationEventHandle)
00413 {
00414     UNIMPLEMENTED;
00415     return STATUS_NOT_IMPLEMENTED;
00416 }

Generated on Sun May 27 2012 04:22:44 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.