- Lsasrv: Create the LsaAuthenticationPort and add a basic server loop that listens to incoming requests.

- Lsalib: Combine request and reply data of the register request into a connection info struct.

My test application can now connect to the LsaAuthenticationPort.

svn path=/trunk/; revision=44793
This commit is contained in:
Eric Kohl 2009-12-28 11:59:20 +00:00
parent 050435c284
commit b837d58c19
6 changed files with 220 additions and 25 deletions

View file

@ -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 <windows.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
#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 */

View file

@ -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 <windows.h>
#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;
}

View file

@ -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);

View file

@ -2,11 +2,13 @@
<importlibrary definition="lsasrv.spec" />
<include base="lsasrv">.</include>
<include base="lsa_server">.</include>
<include base="ReactOS">include/reactos/subsys/lsass</include>
<library>lsa_server</library>
<library>wine</library>
<library>rpcrt4</library>
<library>ntdll</library>
<library>pseh</library>
<file>authport.c</file>
<file>lsarpc.c</file>
<file>lsasrv.c</file>
<file>lsasrv.rc</file>

View file

@ -13,6 +13,8 @@
#include <ntsecapi.h>
#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;

View file

@ -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;
}