diff --git a/reactos/dll/win32/msgina/CMakeLists.txt b/reactos/dll/win32/msgina/CMakeLists.txt index b7594a4f800..9ac77fad89c 100644 --- a/reactos/dll/win32/msgina/CMakeLists.txt +++ b/reactos/dll/win32/msgina/CMakeLists.txt @@ -7,6 +7,7 @@ spec2def(msgina.dll msgina.spec) list(APPEND SOURCE gui.c + lsa.c msgina.c stubs.c tui.c diff --git a/reactos/dll/win32/msgina/gui.c b/reactos/dll/win32/msgina/gui.c index 06c589427b9..4031557d32b 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; @@ -349,29 +346,15 @@ DoChangePassword( RequestBuffer->NewPassword.MaximumLength); /* Connect to the LSA server */ - Status = LsaConnectUntrusted(&LsaHandle); - if (!NT_SUCCESS(Status)) + if (!ConnectToLsa(pgContext)) { - 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; + ERR("ConnectToLsa() failed\n"); + return FALSE; } /* Call the authentication package */ - Status = LsaCallAuthenticationPackage(LsaHandle, - AuthenticationPackage, + Status = LsaCallAuthenticationPackage(pgContext->LsaHandle, + pgContext->AuthenticationPackage, RequestBuffer, RequestBufferSize, (PVOID*)&ResponseBuffer, @@ -404,9 +387,6 @@ done: if (ResponseBuffer != NULL) LsaFreeReturnBuffer(ResponseBuffer); - if (LsaHandle != NULL) - NtClose(LsaHandle); - return res; } diff --git a/reactos/dll/win32/msgina/lsa.c b/reactos/dll/win32/msgina/lsa.c new file mode 100644 index 00000000000..354f7f02975 --- /dev/null +++ b/reactos/dll/win32/msgina/lsa.c @@ -0,0 +1,52 @@ +/* + * PROJECT: ReactOS msgina.dll + * FILE: dll/win32/msgina/gui.c + * PURPOSE: ReactOS Logon GINA DLL + * PROGRAMMER: Eric Kohl + */ + +#include "msgina.h" + +BOOL +ConnectToLsa( + PGINA_CONTEXT pgContext) +{ + LSA_STRING LogonProcessName; + LSA_STRING PackageName; + LSA_OPERATIONAL_MODE SecurityMode = 0; + NTSTATUS Status; + + /* We are already connected to the LSA */ + if (pgContext->LsaHandle != NULL) + return TRUE; + + /* 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; +} + +/* EOF */ diff --git a/reactos/dll/win32/msgina/msgina.h b/reactos/dll/win32/msgina/msgina.h index 48d3f360b3b..a9c62a44f2c 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; @@ -82,6 +84,12 @@ typedef struct _GINA_UI PFGINA_DISPLAYLOCKEDNOTICE DisplayLockedNotice; } GINA_UI, *PGINA_UI; +/* lsa.c */ + +BOOL +ConnectToLsa( + PGINA_CONTEXT pgContext); + /* msgina.c */ BOOL