diff --git a/reactos/dll/win32/lsasrv/authport.c b/reactos/dll/win32/lsasrv/authport.c new file mode 100644 index 00000000000..dd5a69dbbb7 --- /dev/null +++ b/reactos/dll/win32/lsasrv/authport.c @@ -0,0 +1,139 @@ +/* + * PROJECT: Local Security Authority Server DLL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/win32/lsasrv/authport.c + * PURPOSE: LsaAuthenticationPort server routines + * COPYRIGHT: Copyright 2009 Eric Kohl + */ + +/* INCLUDES ****************************************************************/ + +#define WIN32_NO_STATUS +#include +#define NTOS_MODE_USER +#include + +#include "lsass.h" +#include "lsasrv.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); + + +static HANDLE PortThreadHandle = NULL; +static HANDLE AuthPortHandle = NULL; + + +/* FUNCTIONS ***************************************************************/ + +NTSTATUS WINAPI +AuthPortThreadRoutine(PVOID Param) +{ + LSASS_REQUEST Request; + PPORT_MESSAGE Reply = NULL; + NTSTATUS Status; + + NTSTATUS Status2; + + HANDLE ConnectionHandle = NULL; + PVOID Context = NULL; + BOOLEAN Accept; + + TRACE("AuthPortThreadRoutine() called\n"); + + Status = STATUS_SUCCESS; + + for (;;) + { + Status = NtReplyWaitReceivePort(AuthPortHandle, + 0, + Reply, + &Request.Header); + if (!NT_SUCCESS(Status)) + { + TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status); + break; + } + + TRACE("Received message\n"); + + if (Request.Header.u2.s2.Type == LPC_CONNECTION_REQUEST) + { + TRACE("Port connection request\n"); + + Accept = TRUE; + Status2 = NtAcceptConnectPort(&ConnectionHandle, + &Context, + &Request.Header, + Accept, + NULL, + NULL); + + + Status2 = NtCompleteConnectPort(ConnectionHandle); + + } + else if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED || + Request.Header.u2.s2.Type == LPC_CLIENT_DIED) + { + TRACE("Port closed or client died request\n"); + +// return STATUS_UNSUCCESSFUL; + } + else if (Request.Header.u2.s2.Type == LPC_REQUEST) + { + TRACE("Received request (Type: %lu)\n", Request.Type); + + } + else if (Request.Header.u2.s2.Type == LPC_DATAGRAM) + { + TRACE("Received datagram\n"); + + } + } + + return Status; +} + + +NTSTATUS +StartAuthenticationPort(VOID) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING PortName; + DWORD ThreadId; + NTSTATUS Status; + + RtlInitUnicodeString(&PortName, + L"\\LsaAuthenticationPort"); + + InitializeObjectAttributes(&ObjectAttributes, + &PortName, + 0, + NULL, + NULL); + + Status = NtCreatePort(&AuthPortHandle, + &ObjectAttributes, + 0, + 0x100, + 0x2000); + if (!NT_SUCCESS(Status)) + { + TRACE("NtCreatePort() failed (Status %lx)\n", Status); + return Status; + } + + PortThreadHandle = CreateThread(NULL, + 0x1000, + (LPTHREAD_START_ROUTINE)AuthPortThreadRoutine, + NULL, + 0, + &ThreadId); + + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/dll/win32/lsasrv/lsasrv.c b/reactos/dll/win32/lsasrv/lsasrv.c index 088da34437b..2b791088d46 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.c +++ b/reactos/dll/win32/lsasrv/lsasrv.c @@ -1,3 +1,13 @@ +/* + * PROJECT: Local Security Authority Server DLL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/win32/lsasrv/lsasrv.c + * PURPOSE: Main file + * COPYRIGHT: Copyright 2006-2009 Eric Kohl + */ + +/* INCLUDES ****************************************************************/ + #define WIN32_NO_STATUS #include #define NTOS_MODE_USER @@ -10,17 +20,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); +/* FUNCTIONS ***************************************************************/ + NTSTATUS WINAPI LsapInitLsa(VOID) { HANDLE hEvent; DWORD dwError; - TRACE("LsapInitLsa()\n"); + TRACE("LsapInitLsa() called\n"); /* Start the RPC server */ LsarStartRpcServer(); + TRACE("Creating notification event!\n"); /* Notify the service manager */ hEvent = CreateEventW(NULL, TRUE, @@ -43,10 +56,13 @@ LsapInitLsa(VOID) } } + TRACE("Set notification event!\n"); SetEvent(hEvent); /* NOTE: Do not close the event handle!!!! */ + StartAuthenticationPort(); + return STATUS_SUCCESS; } diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index 0e90bd0ef32..159950880df 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -2,11 +2,13 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: Local Security Authority (LSA) Server * FILE: reactos/dll/win32/lsasrv/lsasrv.h - * PURPOSE: + * PURPOSE: Common header file * * PROGRAMMERS: Eric Kohl */ +/* authport.c */ +NTSTATUS StartAuthenticationPort(VOID); + /* lsarpc.c */ VOID LsarStartRpcServer(VOID); - diff --git a/reactos/dll/win32/lsasrv/lsasrv.rbuild b/reactos/dll/win32/lsasrv/lsasrv.rbuild index f35f19020c4..840599c554c 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.rbuild +++ b/reactos/dll/win32/lsasrv/lsasrv.rbuild @@ -2,11 +2,13 @@ . . + include/reactos/subsys/lsass lsa_server wine rpcrt4 ntdll pseh + authport.c lsarpc.c lsasrv.c lsasrv.rc diff --git a/reactos/include/reactos/subsys/lsass/lsass.h b/reactos/include/reactos/subsys/lsass/lsass.h index 4727272c9d6..28c4abd1a59 100644 --- a/reactos/include/reactos/subsys/lsass/lsass.h +++ b/reactos/include/reactos/subsys/lsass/lsass.h @@ -13,6 +13,8 @@ #include +#define LSASS_MAX_LOGON_PROCESS_NAME_LENGTH 127 + #define LSASS_REQUEST_REGISTER_LOGON_PROCESS (1) #define LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE (2) #define LSASS_REQUEST_DEREGISTER_LOGON_PROCESS (3) @@ -96,6 +98,16 @@ typedef struct _LSASS_REGISTER_LOGON_PROCESS_REPLY LSA_OPERATIONAL_MODE OperationalMode; } LSASS_REGISTER_LOGON_PROCESS_REPLY, *PLSASS_REGISTER_LOGON_PROCESS_REPLY; + +typedef struct _LSASS_CONNECT_DATA +{ + NTSTATUS Status; + LSA_OPERATIONAL_MODE OperationalMode; + ULONG Length; + CHAR LogonProcessNameBuffer[LSASS_MAX_LOGON_PROCESS_NAME_LENGTH + 1]; +} LSASS_CONNECT_DATA, *PLSASS_CONNECT_DATA; + + typedef union _LSASS_REQUEST { PORT_MESSAGE Header; diff --git a/reactos/lib/lsalib/lsa.c b/reactos/lib/lsalib/lsa.c index a166309d4d6..94cd6af8e16 100644 --- a/reactos/lib/lsalib/lsa.c +++ b/reactos/lib/lsalib/lsa.c @@ -35,7 +35,7 @@ LsaDeregisterLogonProcess(HANDLE LsaHandle) Request.Header.u1.s1.DataLength = 0; Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST); Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS; - Status = NtRequestWaitReplyPort(LsaHandle, + Status = ZwRequestWaitReplyPort(LsaHandle, &Request.Header, &Reply.Header); if (!NT_SUCCESS(Status)) @@ -59,7 +59,7 @@ NTSTATUS WINAPI LsaConnectUntrusted(PHANDLE LsaHandle) { UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + return STATUS_NOT_IMPLEMENTED; } @@ -98,7 +98,7 @@ LsaCallAuthenticationPackage(HANDLE LsaHandle, ProtocolSubmitBuffer, SubmitBufferLength); - Status = NtRequestWaitReplyPort(LsaHandle, + Status = ZwRequestWaitReplyPort(LsaHandle, &Request->Header, &Reply->Header); if (!NT_SUCCESS(Status)) @@ -154,7 +154,7 @@ LsaLookupAuthenticationPackage(HANDLE LsaHandle, sizeof(PORT_MESSAGE); Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE; - Status = NtRequestWaitReplyPort(LsaHandle, + Status = ZwRequestWaitReplyPort(LsaHandle, &Request->Header, &Reply.Header); if (!NT_SUCCESS(Status)) @@ -245,7 +245,7 @@ LsaLogonUser(HANDLE LsaHandle, Reply = (PLSASS_REPLY)&RawReply; - Status = NtRequestWaitReplyPort(LsaHandle, + Status = ZwRequestWaitReplyPort(LsaHandle, &Request->Header, &Reply->Header); if (!NT_SUCCESS(Status)) @@ -285,26 +285,49 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName, PHANDLE Handle, PLSA_OPERATIONAL_MODE OperationalMode) { - UNICODE_STRING Portname = RTL_CONSTANT_STRING(L"\\SeLsaCommandPort"); + UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort"); + SECURITY_QUALITY_OF_SERVICE SecurityQos; ULONG ConnectInfoLength; NTSTATUS Status; - LSASS_REQUEST Request; - LSASS_REPLY Reply; + LSASS_CONNECT_DATA ConnectInfo; +// LSASS_REQUEST Request; +// LSASS_REPLY Reply; - ConnectInfoLength = 0; - Status = NtConnectPort(Handle, - &Portname, - NULL, - NULL, + /* Check the logon process name length */ + if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH) + return STATUS_NAME_TOO_LONG; + + RtlInitUnicodeString(&PortName, + L"\\LsaAuthenticationPort"); + + SecurityQos.Length = sizeof (SecurityQos); + SecurityQos.ImpersonationLevel = SecurityIdentification; + SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; + SecurityQos.EffectiveOnly = TRUE; + + ConnectInfoLength = sizeof(LSASS_CONNECT_DATA); + + strncpy(ConnectInfo.LogonProcessNameBuffer, + LsaLogonProcessName->Buffer, + LsaLogonProcessName->Length); + ConnectInfo.Length = LsaLogonProcessName->Length; + ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0'; + + Status = ZwConnectPort(Handle, + &PortName, + &SecurityQos, NULL, NULL, NULL, + &ConnectInfo, &ConnectInfoLength); if (!NT_SUCCESS(Status)) { return Status; } + return Status; +#if 0 Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS; Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) - sizeof(PORT_MESSAGE); @@ -315,26 +338,27 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName, LsaLogonProcessName->Buffer, Request.d.RegisterLogonProcessRequest.Length); - Status = NtRequestWaitReplyPort(*Handle, + Status = ZwRequestWaitReplyPort(*Handle, &Request.Header, &Reply.Header); if (!NT_SUCCESS(Status)) { - NtClose(*Handle); - *Handle = NULL; +// NtClose(*Handle); +// *Handle = NULL; return Status; } if (!NT_SUCCESS(Reply.Status)) { - NtClose(*Handle); - *Handle = NULL; +// NtClose(*Handle); +// *Handle = NULL; return Status; } *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode; return Reply.Status; +#endif } @@ -347,7 +371,7 @@ LsaEnumerateLogonSessions(PULONG LogonSessionCount, PLUID *LogonSessionList) { UNIMPLEMENTED; - return FALSE; + return STATUS_NOT_IMPLEMENTED; } @@ -360,7 +384,7 @@ LsaGetLogonSessionData(PLUID LogonId, PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData) { UNIMPLEMENTED; - return FALSE; + return STATUS_NOT_IMPLEMENTED; } @@ -373,7 +397,7 @@ LsaRegisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS Inform HANDLE NotificationEventHandle) { UNIMPLEMENTED; - return FALSE; + return STATUS_NOT_IMPLEMENTED; } @@ -386,5 +410,5 @@ LsaUnregisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS Info HANDLE NotificationEventHandle) { UNIMPLEMENTED; - return FALSE; + return STATUS_NOT_IMPLEMENTED; }