From 05dbef656f553df980ed8921533275619b02e458 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 29 Jan 2014 21:54:49 +0000 Subject: [PATCH] [MSGINA] Create a connection to the LSA upon initialization and use it to change passwords. Logon will use the connection later. svn path=/trunk/; revision=61888 --- reactos/dll/win32/msgina/gui.c | 31 ++------------------ reactos/dll/win32/msgina/msgina.c | 47 +++++++++++++++++++++++++++++++ reactos/dll/win32/msgina/msgina.h | 2 ++ 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/reactos/dll/win32/msgina/gui.c b/reactos/dll/win32/msgina/gui.c index 06c589427b9..6357d40439e 100644 --- a/reactos/dll/win32/msgina/gui.c +++ b/reactos/dll/win32/msgina/gui.c @@ -259,9 +259,6 @@ DoChangePassword( ULONG RequestBufferSize; ULONG ResponseBufferSize = 0; LPWSTR Ptr; - LSA_STRING PackageName; - HANDLE LsaHandle = NULL; - ULONG AuthenticationPackage = 0; BOOL res = FALSE; NTSTATUS ProtocolStatus; NTSTATUS Status; @@ -348,30 +345,9 @@ DoChangePassword( NewPassword1, RequestBuffer->NewPassword.MaximumLength); - /* Connect to the LSA server */ - Status = LsaConnectUntrusted(&LsaHandle); - if (!NT_SUCCESS(Status)) - { - ERR("LsaConnectUntrusted failed (Status 0x%08lx)\n", Status); - goto done; - } - - /* Get the authentication package */ - RtlInitAnsiString((PANSI_STRING)&PackageName, - MSV1_0_PACKAGE_NAME); - - Status = LsaLookupAuthenticationPackage(LsaHandle, - &PackageName, - &AuthenticationPackage); - if (!NT_SUCCESS(Status)) - { - ERR("LsaLookupAuthenticationPackage failed (Status 0x%08lx)\n", Status); - goto done; - } - /* Call the authentication package */ - Status = LsaCallAuthenticationPackage(LsaHandle, - AuthenticationPackage, + Status = LsaCallAuthenticationPackage(pgContext->LsaHandle, + pgContext->AuthenticationPackage, RequestBuffer, RequestBufferSize, (PVOID*)&ResponseBuffer, @@ -404,9 +380,6 @@ done: if (ResponseBuffer != NULL) LsaFreeReturnBuffer(ResponseBuffer); - if (LsaHandle != NULL) - NtClose(LsaHandle); - return res; } diff --git a/reactos/dll/win32/msgina/msgina.c b/reactos/dll/win32/msgina/msgina.c index 2c7c1c18b46..946fcc8501a 100644 --- a/reactos/dll/win32/msgina/msgina.c +++ b/reactos/dll/win32/msgina/msgina.c @@ -254,6 +254,46 @@ GetRegistrySettings(PGINA_CONTEXT pgContext) } +static +BOOL +ConnectToLsa( + PGINA_CONTEXT pgContext) +{ + LSA_STRING LogonProcessName; + LSA_STRING PackageName; + LSA_OPERATIONAL_MODE SecurityMode = 0; + NTSTATUS Status; + + /* Connect to the LSA server */ + RtlInitAnsiString((PANSI_STRING)&LogonProcessName, + "MSGINA"); + + Status = LsaRegisterLogonProcess(&LogonProcessName, + &pgContext->LsaHandle, + &SecurityMode); + if (!NT_SUCCESS(Status)) + { + ERR("LsaRegisterLogonProcess failed (Status 0x%08lx)\n", Status); + return FALSE; + } + + /* Get the authentication package */ + RtlInitAnsiString((PANSI_STRING)&PackageName, + MSV1_0_PACKAGE_NAME); + + Status = LsaLookupAuthenticationPackage(pgContext->LsaHandle, + &PackageName, + &pgContext->AuthenticationPackage); + if (!NT_SUCCESS(Status)) + { + ERR("LsaLookupAuthenticationPackage failed (Status 0x%08lx)\n", Status); + return FALSE; + } + + return TRUE; +} + + /* * @implemented */ @@ -283,6 +323,13 @@ WlxInitialize( return FALSE; } + if (!ConnectToLsa(pgContext)) + { + WARN("ConnectToLsa() failed\n"); + LocalFree(pgContext); + return FALSE; + } + /* Return the context to winlogon */ *pWlxContext = (PVOID)pgContext; pgContext->hDllInstance = hDllInstance; diff --git a/reactos/dll/win32/msgina/msgina.h b/reactos/dll/win32/msgina/msgina.h index 48d3f360b3b..1eec5ec02e3 100644 --- a/reactos/dll/win32/msgina/msgina.h +++ b/reactos/dll/win32/msgina/msgina.h @@ -38,6 +38,8 @@ typedef struct PWLX_DISPATCH_VERSION_1_3 pWlxFuncs; HANDLE hDllInstance; HWND hStatusWindow; + HANDLE LsaHandle; + ULONG AuthenticationPackage; DWORD AutoLogonState; BOOL bDisableCAD; BOOL bAutoAdminLogon;